1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

More implementation of breakpoints.

This commit is contained in:
Mikhail Khodjaiants 2002-08-30 23:30:28 +00:00
parent bc2d280abd
commit cb00b0ef97
22 changed files with 1685 additions and 40 deletions

View file

@ -7,20 +7,27 @@
package org.eclipse.cdt.debug.core;
import java.text.MessageFormat;
import java.util.HashMap;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.ICDILocation;
import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.internal.core.breakpoints.CLineBreakpoint;
import org.eclipse.cdt.debug.internal.core.model.CDebugElement;
import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IProcess;
@ -71,8 +78,6 @@ public class CDebugModel
* @param allowDisconnect whether the target will support disconnection
* @param resume whether the target is to be resumed on startup.
* @return a debug target
*
* @since 2.0
*/
public static IDebugTarget newDebugTarget( final ILaunch launch,
final ICDITarget cdiTarget,
@ -126,4 +131,92 @@ public class CDebugModel
return target[0];
}
/**
* Returns a C/C++ line breakpoint that is already registered with the breakpoint
* manager for a file with the given name at the given line number.
*
* @param fileName fully qualified file name
* @param lineNumber line number
* @return a C/C++ line breakpoint that is already registered with the breakpoint
* manager for a file with the given name at the given line number or <code>null</code>
* if no such breakpoint is registered
* @exception CoreException if unable to retrieve the associated marker
* attributes (line number).
*/
public static ICLineBreakpoint lineBreakpointExists( String fileName, int lineNumber ) throws CoreException
{
String modelId = getPluginIdentifier();
String markerType = CLineBreakpoint.getMarkerType();
IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
IBreakpoint[] breakpoints = manager.getBreakpoints( modelId );
for ( int i = 0; i < breakpoints.length; i++ )
{
if ( !( breakpoints[i] instanceof ICLineBreakpoint ) )
{
continue;
}
ICLineBreakpoint breakpoint = (ICLineBreakpoint)breakpoints[i];
if ( breakpoint.getMarker().getType().equals( markerType ) )
{
if ( breakpoint.getMarker().getResource().getLocation().toString().equals( fileName ) )
{
if ( breakpoint.getLineNumber() == lineNumber )
{
return breakpoint;
}
}
}
}
return null;
}
/**
* Creates and returns a line breakpoint in the file with the
* given name, at the given line number. The marker associated with the
* breakpoint will be created on the specified resource. If a character
* range within the line is known, it may be specified by charStart/charEnd.
* If ignoreCount is > 0, the breakpoint will suspend execution when it is
* "hit" the specified number of times.
*
* @param resource the resource on which to create the associated breakpoint
* marker
* @param typeName the fully qualified name of the type the breakpoint is
* to be installed in. If the breakpoint is to be installed in an inner type,
* it is sufficient to provide the name of the top level enclosing type.
* If an inner class name is specified, it should be formatted as the
* associated class file name (i.e. with <code>$</code>). For example,
* <code>example.SomeClass$InnerType</code>, could be specified, but
* <code>example.SomeClass</code> is sufficient.
* @param lineNumber the lineNumber on which the breakpoint is set - line
* numbers are 1 based, associated with the source file in which
* the breakpoint is set
* @param charStart the first character index associated with the breakpoint,
* or -1 if unspecified, in the source file in which the breakpoint is set
* @param charEnd the last character index associated with the breakpoint,
* or -1 if unspecified, in the source file in which the breakpoint is set
* @param hitCount the number of times the breakpoint will be hit before
* suspending execution - 0 if it should always suspend
* @param register whether to add this breakpoint to the breakpoint manager
* @param attributes a map of client defined attributes that should be assigned
* to the underlying breakpoint marker on creation, or <code>null</code> if none.
* @return a line breakpoint
* @exception DebugException If this method fails. Reasons include:
*/
public static ICLineBreakpoint createLineBreakpoint( IResource resource,
int lineNumber,
boolean enabled,
int ignoreCount,
String condition,
boolean add ) throws DebugException
{
HashMap attributes = new HashMap( 10 );
attributes.put( ICBreakpoint.ID, getPluginIdentifier() );
attributes.put( IMarker.LINE_NUMBER, new Integer( lineNumber ) );
attributes.put( ICBreakpoint.ENABLED, new Boolean( enabled ) );
attributes.put( ICBreakpoint.IGNORE_COUNT, new Integer( ignoreCount ) );
attributes.put( ICBreakpoint.CONDITION, condition );
return new CLineBreakpoint( resource, attributes, add );
}
}

View file

@ -24,6 +24,14 @@ import org.eclipse.debug.core.model.IBreakpoint;
*/
public interface ICBreakpoint extends IBreakpoint
{
/*
* C Breakpoint attributes
*/
public static final String CONDITION = "condition"; //$NON-NLS-1$
public static final String IGNORE_COUNT = "ignoreCount"; //$NON-NLS-1$
public static final String THREAD_ID = "threadId"; //$NON-NLS-1$
public static final String INSTALL_COUNT = "installCount"; //$NON-NLS-1$
/**
* Returns whether this breakpoint is installed in at least
* one debug target.

View file

@ -5,9 +5,13 @@
*/
package org.eclipse.cdt.debug.internal.core.breakpoints;
import java.util.Map;
import org.eclipse.cdt.debug.core.ICAddressBreakpoint;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugException;
/**
*
@ -17,6 +21,8 @@ import org.eclipse.core.runtime.CoreException;
*/
public class CAddressBreakpoint extends CBreakpoint implements ICAddressBreakpoint
{
private static final String C_ADDRESS_BREAKPOINT = "org.eclipse.jdt.debug.cAddressBreakpointMarker"; //$NON-NLS-1$
/**
* Breakpoint attribute storing the address this breakpoint suspends
* execution at (value <code>"org.eclipse.cdt.debug.core.address"</code>).
@ -27,9 +33,9 @@ public class CAddressBreakpoint extends CBreakpoint implements ICAddressBreakpoi
/**
* Constructor for CAddressBreakpoint.
*/
public CAddressBreakpoint()
public CAddressBreakpoint( IResource resource, Map attributes, boolean add ) throws DebugException
{
super();
super( resource, C_ADDRESS_BREAKPOINT, attributes, add );
}
/* (non-Javadoc)
@ -71,4 +77,12 @@ public class CAddressBreakpoint extends CBreakpoint implements ICAddressBreakpoi
{
return ensureMarker().getAttribute( IMarker.CHAR_END, -1 );
}
/**
* Returns the type of marker associated with this type of breakpoints
*/
public static String getMarkerType()
{
return C_ADDRESS_BREAKPOINT;
}
}

View file

@ -6,10 +6,20 @@
package org.eclipse.cdt.debug.internal.core.breakpoints;
import java.text.MessageFormat;
import java.util.Map;
import org.eclipse.cdt.debug.core.CDebugModel;
import org.eclipse.cdt.debug.core.ICBreakpoint;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.model.Breakpoint;
@ -54,9 +64,26 @@ public abstract class CBreakpoint extends Breakpoint
/**
* Constructor for CBreakpoint.
*/
public CBreakpoint()
public CBreakpoint( final IResource resource, final String markerType, final Map attributes, final boolean add ) throws DebugException
{
super();
IWorkspaceRunnable wr= new IWorkspaceRunnable()
{
public void run( IProgressMonitor monitor ) throws CoreException
{
// create the marker
setMarker( resource.createMarker( markerType ) );
// set attributes
ensureMarker().setAttributes( attributes );
//set the marker message
setAttribute( IMarker.MESSAGE, getMarkerMessage() );
// add to breakpoint manager if requested
register( add );
}
};
run( wr );
}
/* (non-Javadoc)
@ -129,4 +156,40 @@ public abstract class CBreakpoint extends Breakpoint
public void handleDebugEvents( DebugEvent[] events )
{
}
/**
* Execute the given workspace runnable
*/
protected void run( IWorkspaceRunnable wr ) throws DebugException
{
try
{
ResourcesPlugin.getWorkspace().run( wr, null );
}
catch ( CoreException e )
{
throw new DebugException( e.getStatus() );
}
}
/**
* Add this breakpoint to the breakpoint manager,
* or sets it as unregistered.
*/
protected void register( boolean register ) throws CoreException
{
if ( register )
{
DebugPlugin.getDefault().getBreakpointManager().addBreakpoint( this );
}
else
{
setRegistered( false );
}
}
protected String getMarkerMessage() throws CoreException
{
return null;
}
}

View file

@ -5,9 +5,13 @@
*/
package org.eclipse.cdt.debug.internal.core.breakpoints;
import java.util.Map;
import org.eclipse.cdt.debug.core.ICFunctionBreakpoint;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugException;
/**
*
@ -17,6 +21,8 @@ import org.eclipse.core.runtime.CoreException;
*/
public class CFunctionBreakpoint extends CBreakpoint implements ICFunctionBreakpoint
{
private static final String C_FUNCTION_BREAKPOINT = "org.eclipse.jdt.debug.cFunctionBreakpointMarker"; //$NON-NLS-1$
/**
* Breakpoint attribute storing the function this breakpoint suspends
* execution in (value <code>"org.eclipse.cdt.debug.core.function"</code>).
@ -27,10 +33,11 @@ public class CFunctionBreakpoint extends CBreakpoint implements ICFunctionBreakp
/**
* Constructor for CFunctionBreakpoint.
*/
public CFunctionBreakpoint()
public CFunctionBreakpoint( IResource resource, Map attributes, boolean add ) throws DebugException
{
super();
super( resource, C_FUNCTION_BREAKPOINT, attributes, add );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.core.ICFunctionBreakpoint#getFunction()
*/
@ -70,4 +77,12 @@ public class CFunctionBreakpoint extends CBreakpoint implements ICFunctionBreakp
{
return ensureMarker().getAttribute( IMarker.CHAR_END, -1 );
}
/**
* Returns the type of marker associated with this type of breakpoints
*/
public static String getMarkerType()
{
return C_FUNCTION_BREAKPOINT;
}
}

View file

@ -5,9 +5,15 @@
*/
package org.eclipse.cdt.debug.internal.core.breakpoints;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.debug.core.ICBreakpoint;
import org.eclipse.cdt.debug.core.ICLineBreakpoint;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugException;
/**
*
@ -17,12 +23,14 @@ import org.eclipse.core.runtime.CoreException;
*/
public class CLineBreakpoint extends CBreakpoint implements ICLineBreakpoint
{
private static final String C_LINE_BREAKPOINT = "org.eclipse.cdt.debug.core.cLineBreakpointMarker"; //$NON-NLS-1$
/**
* Constructor for CLineBreakpoint.
*/
public CLineBreakpoint()
public CLineBreakpoint( IResource resource, Map attributes, boolean add ) throws DebugException
{
super();
super( resource, getMarkerType(), attributes, add );
}
/* (non-Javadoc)
@ -48,4 +56,12 @@ public class CLineBreakpoint extends CBreakpoint implements ICLineBreakpoint
{
return ensureMarker().getAttribute( IMarker.CHAR_END, -1 );
}
/**
* Returns the type of marker associated with this type of breakpoints
*/
public static String getMarkerType()
{
return C_LINE_BREAKPOINT;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

View file

@ -18,3 +18,4 @@ RestartAction.tooltip=Restart
AddBreakpoint.label=Add/Remove &Breakpoint
EnableBreakpoint.label=T&oggle Breakpoint
BreakpointProperties.label=Breakpoint &Properties...

View file

@ -111,6 +111,13 @@
<viewerContribution
targetID="#CEditorRulerContext"
id="org.eclipse.cdt.debug.ui.CEditorPopupActions">
<action
label="%BreakpointProperties.label"
helpContextId="breakpoint_properties_action_context"
class="org.eclipse.cdt.debug.internal.ui.actions.CBreakpointPropertiesRulerActionDelegate"
menubarPath="debug"
id="org.eclipse.cdt.debug.internal.ui.actions.CBreakpointPropertiesRulerActionDelegate">
</action>
<action
label="%EnableBreakpoint.label"
helpContextId="enable_disable_breakpoint_action_context"

View file

@ -9,16 +9,24 @@ package org.eclipse.cdt.debug.internal.ui;
import java.text.MessageFormat;
import java.util.HashMap;
import org.eclipse.cdt.debug.core.ICAddressBreakpoint;
import org.eclipse.cdt.debug.core.ICBreakpoint;
import org.eclipse.cdt.debug.core.ICFunctionBreakpoint;
import org.eclipse.cdt.debug.core.ICLineBreakpoint;
import org.eclipse.cdt.debug.core.IStackFrameInfo;
import org.eclipse.cdt.debug.core.IState;
import org.eclipse.cdt.debug.core.cdi.ICDIExitInfo;
import org.eclipse.cdt.debug.core.cdi.ICDISignal;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IDisconnect;
import org.eclipse.debug.core.model.IStackFrame;
@ -26,7 +34,9 @@ import org.eclipse.debug.core.model.ITerminate;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.debug.ui.IValueDetailListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
@ -58,6 +68,8 @@ public class CDTDebugModelPresentation extends LabelProvider
protected HashMap fAttributes = new HashMap(3);
protected CDebugImageDescriptorRegistry fDebugImageRegistry = CDebugUIPlugin.getImageDescriptorRegistry();
private static CDTDebugModelPresentation fInstance = null;
/**
@ -141,6 +153,24 @@ public class CDTDebugModelPresentation extends LabelProvider
*/
public Image getImage( Object element )
{
try
{
if ( element instanceof IMarker )
{
IBreakpoint bp = getBreakpoint( (IMarker)element );
if ( bp != null && bp instanceof ICBreakpoint )
{
return getBreakpointImage( (ICBreakpoint)bp );
}
}
if ( element instanceof ICBreakpoint )
{
return getBreakpointImage( (ICBreakpoint)element );
}
}
catch( CoreException e )
{
}
return super.getImage( element );
}
@ -165,6 +195,21 @@ public class CDTDebugModelPresentation extends LabelProvider
return label.toString();
}
if ( element instanceof IMarker )
{
IBreakpoint breakpoint = getBreakpoint( (IMarker)element );
if ( breakpoint != null )
{
return getBreakpointText( breakpoint, showQualified );
}
return null;
}
if ( element instanceof IBreakpoint )
{
return getBreakpointText( (IBreakpoint)element, showQualified );
}
if ( element instanceof IDebugTarget )
label.append( getTargetText( (IDebugTarget)element, showQualified ) );
else if ( element instanceof IThread )
@ -192,10 +237,14 @@ public class CDTDebugModelPresentation extends LabelProvider
return label.toString();
}
}
catch ( DebugException e )
catch( DebugException e )
{
return "<not_responding>";
}
catch( CoreException e )
{
CDebugUIPlugin.log( e );
}
return null;
}
@ -319,4 +368,143 @@ public class CDTDebugModelPresentation extends LabelProvider
{
return MessageFormat.format( string, args );
}
protected Image getBreakpointImage( ICBreakpoint breakpoint ) throws CoreException
{
if ( breakpoint instanceof ICLineBreakpoint )
{
return getLineBreakpointImage( (ICLineBreakpoint)breakpoint );
}
return null;
}
protected Image getLineBreakpointImage( ICLineBreakpoint breakpoint ) throws CoreException
{
int flags = computeBreakpointAdornmentFlags( breakpoint );
CImageDescriptor descriptor = null;
if ( breakpoint.isEnabled() )
{
descriptor = new CImageDescriptor( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_BREAKPOINT ), flags );
}
else
{
descriptor = new CImageDescriptor( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_BREAKPOINT_DISABLED ), flags );
}
return fDebugImageRegistry.get( descriptor );
}
protected IBreakpoint getBreakpoint( IMarker marker )
{
return DebugPlugin.getDefault().getBreakpointManager().getBreakpoint( marker );
}
protected String getBreakpointText( IBreakpoint breakpoint, boolean qualified ) throws CoreException
{
if ( breakpoint instanceof ICLineBreakpoint )
{
return getLineBreakpointText( (ICLineBreakpoint)breakpoint, qualified );
}
if ( breakpoint instanceof ICAddressBreakpoint )
{
return getAddressBreakpointText( (ICAddressBreakpoint)breakpoint, qualified );
}
if ( breakpoint instanceof ICFunctionBreakpoint )
{
return getFunctionBreakpointText( (ICFunctionBreakpoint)breakpoint, qualified );
}
return ""; //$NON-NLS-1$
}
protected String getLineBreakpointText( ICLineBreakpoint breakpoint, boolean qualified ) throws CoreException
{
StringBuffer label = new StringBuffer();
appendResourceName( breakpoint, label, qualified );
appendLineNumber( breakpoint, label );
appendIgnoreCount( breakpoint, label );
appendCondition( breakpoint, label );
return label.toString();
}
protected String getAddressBreakpointText( ICAddressBreakpoint breakpoint, boolean qualified ) throws CoreException
{
return null;
}
protected String getFunctionBreakpointText( ICFunctionBreakpoint breakpoint, boolean qualified ) throws CoreException
{
return null;
}
protected StringBuffer appendResourceName( ICLineBreakpoint breakpoint, StringBuffer label, boolean qualified ) throws CoreException
{
IPath path = breakpoint.getMarker().getResource().getLocation();
if ( !path.isEmpty() )
label.append( qualified ? path.toOSString() : path.lastSegment() );
return label;
}
protected StringBuffer appendLineNumber( ICLineBreakpoint breakpoint, StringBuffer label ) throws CoreException
{
int lineNumber = breakpoint.getLineNumber();
if ( lineNumber > 0 )
{
label.append( " [" ); //$NON-NLS-1$
label.append( "line:" );
label.append( ' ' );
label.append( lineNumber );
label.append( ']' );
}
return label;
}
protected StringBuffer appendIgnoreCount( ICBreakpoint breakpoint, StringBuffer label ) throws CoreException
{
int ignoreCount = breakpoint.getIgnoreCount();
if ( ignoreCount > 0 )
{
label.append( " [" ); //$NON-NLS-1$
label.append( "ignore count:" ); //$NON-NLS-1$
label.append( ' ' );
label.append( ignoreCount );
label.append( ']' );
}
return label;
}
protected void appendCondition( ICLineBreakpoint breakpoint, StringBuffer buffer ) throws CoreException
{
String condition = breakpoint.getCondition();
if ( condition != null && condition.length() > 0 )
{
buffer.append( " if " );
buffer.append( condition );
}
}
/**
* Returns the adornment flags for the given breakpoint.
* These flags are used to render appropriate overlay
* icons for the breakpoint.
*/
private int computeBreakpointAdornmentFlags( ICBreakpoint breakpoint )
{
int flags = 0;
try
{
if ( breakpoint.isEnabled() )
{
flags |= CImageDescriptor.ENABLED;
}
if ( breakpoint.isInstalled() )
{
flags |= CImageDescriptor.INSTALLED;
}
}
catch( CoreException e )
{
CDebugUIPlugin.log( e );
}
return flags;
}
}

View file

@ -0,0 +1,96 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui;
import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.Assert;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
/**
*
* A registry that maps <code>ImageDescriptors</code> to <code>Image</code>.
*
* @since Aug 30, 2002
*/
public class CDebugImageDescriptorRegistry
{
private HashMap fRegistry = new HashMap(10);
private Display fDisplay;
/**
* Creates a new image descriptor registry for the current or default display,
* respectively.
*/
public CDebugImageDescriptorRegistry()
{
this( CDebugUIPlugin.getStandardDisplay() );
}
/**
* Creates a new image descriptor registry for the given display. All images
* managed by this registry will be disposed when the display gets disposed.
*
* @param diaplay the display the images managed by this registry are allocated for
*/
public CDebugImageDescriptorRegistry( Display display )
{
fDisplay = display;
Assert.isNotNull( fDisplay );
hookDisplay();
}
/**
* Returns the image associated with the given image descriptor.
*
* @param descriptor the image descriptor for which the registry manages an image
* @return the image associated with the image descriptor or <code>null</code>
* if the image descriptor can't create the requested image.
*/
public Image get( ImageDescriptor descriptor )
{
if ( descriptor == null )
descriptor = ImageDescriptor.getMissingImageDescriptor();
Image result = (Image)fRegistry.get( descriptor );
if ( result != null )
return result;
Assert.isTrue( fDisplay == CDebugUIPlugin.getStandardDisplay(), "Allocating image for wrong display" );
result = descriptor.createImage();
if ( result != null )
fRegistry.put( descriptor, result );
return result;
}
/**
* Disposes all images managed by this registry.
*/
public void dispose()
{
for ( Iterator iter = fRegistry.values().iterator(); iter.hasNext(); )
{
Image image = (Image)iter.next();
image.dispose();
}
fRegistry.clear();
}
private void hookDisplay()
{
fDisplay.disposeExec( new Runnable()
{
public void run()
{
dispose();
}
} );
}
}

View file

@ -0,0 +1,172 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
/**
*
* Bundle of most images used by the C/C++ debug plug-in.
*
* @since Aug 30, 2002
*/
public class CDebugImages
{
private static final String NAME_PREFIX = "org.eclipse.jdt.debug.ui."; //$NON-NLS-1$
private static final int NAME_PREFIX_LENGTH = NAME_PREFIX.length();
private static URL fgIconBaseURL = null;
static
{
String pathSuffix = "icons/full/"; //$NON-NLS-1$
try
{
fgIconBaseURL = new URL( CDebugUIPlugin.getDefault().getDescriptor().getInstallURL(), pathSuffix );
}
catch( MalformedURLException e )
{
CDebugUIPlugin.log( e );
}
}
// The plugin registry
private final static ImageRegistry IMAGE_REGISTRY = new ImageRegistry( CDebugUIPlugin.getStandardDisplay() );
/*
* Available cached Images in the C/C++ debug plug-in image registry.
*/
public static final String IMG_OBJS_BREAKPOINT_INSTALLED = NAME_PREFIX + "installed_ovr.gif"; //$NON-NLS-1$
public static final String IMG_OBJS_BREAKPOINT_INSTALLED_DISABLED = NAME_PREFIX + "installed_ovr_disabled.gif"; //$NON-NLS-1$
/*
* Set of predefined Image Descriptors.
*/
private static final String T_OBJ = "obj16"; //$NON-NLS-1$
private static final String T_OVR = "ovr16"; //$NON-NLS-1$
private static final String T_WIZBAN = "wizban"; //$NON-NLS-1$
private static final String T_LCL = "clcl16"; //$NON-NLS-1$
private static final String T_CTOOL = "ctool16"; //$NON-NLS-1$
private static final String T_CVIEW = "cview16"; //$NON-NLS-1$
private static final String T_DTOOL = "dtool16"; //$NON-NLS-1$
private static final String T_ETOOL = "etool16"; //$NON-NLS-1$
public static final ImageDescriptor DESC_OBJS_BREAKPOINT_INSTALLED = createManaged( T_OVR, IMG_OBJS_BREAKPOINT_INSTALLED );
public static final ImageDescriptor DESC_OBJS_BREAKPOINT_INSTALLED_DISABLED = createManaged( T_OVR, IMG_OBJS_BREAKPOINT_INSTALLED_DISABLED );
/**
* Returns the image managed under the given key in this registry.
*
* @param key the image's key
* @return the image managed under the given key
*/
public static Image get( String key )
{
return IMAGE_REGISTRY.get( key );
}
/**
* Sets the three image descriptors for enabled, disabled, and hovered to an action. The actions
* are retrieved from the *tool16 folders.
*/
public static void setToolImageDescriptors( IAction action, String iconName )
{
setImageDescriptors( action, "tool16", iconName ); //$NON-NLS-1$
}
/**
* Sets the three image descriptors for enabled, disabled, and hovered to an action. The actions
* are retrieved from the *lcl16 folders.
*/
public static void setLocalImageDescriptors( IAction action, String iconName )
{
setImageDescriptors( action, "lcl16", iconName ); //$NON-NLS-1$
}
/*
* Helper method to access the image registry from the JDIDebugUIPlugin class.
*/
/* package */
static ImageRegistry getImageRegistry()
{
return IMAGE_REGISTRY;
}
//---- Helper methods to access icons on the file system --------------------------------------
private static void setImageDescriptors( IAction action, String type, String relPath )
{
try
{
ImageDescriptor id = ImageDescriptor.createFromURL( makeIconFileURL( "d" + type, relPath ) ); //$NON-NLS-1$
if ( id != null )
action.setDisabledImageDescriptor( id );
}
catch( MalformedURLException e )
{
CDebugUIPlugin.log( e );
}
try
{
ImageDescriptor id = ImageDescriptor.createFromURL( makeIconFileURL( "c" + type, relPath ) ); //$NON-NLS-1$
if ( id != null )
action.setHoverImageDescriptor( id );
}
catch( MalformedURLException e )
{
CDebugUIPlugin.log( e );
}
action.setImageDescriptor( create( "e" + type, relPath ) ); //$NON-NLS-1$
}
private static ImageDescriptor createManaged( String prefix, String name )
{
try
{
ImageDescriptor result = ImageDescriptor.createFromURL( makeIconFileURL( prefix, name.substring( NAME_PREFIX_LENGTH ) ) );
IMAGE_REGISTRY.put( name, result );
return result;
}
catch( MalformedURLException e )
{
CDebugUIPlugin.log( e );
return ImageDescriptor.getMissingImageDescriptor();
}
}
private static ImageDescriptor create( String prefix, String name )
{
try
{
return ImageDescriptor.createFromURL( makeIconFileURL( prefix, name ) );
}
catch( MalformedURLException e )
{
CDebugUIPlugin.log( e );
return ImageDescriptor.getMissingImageDescriptor();
}
}
private static URL makeIconFileURL( String prefix, String name ) throws MalformedURLException
{
if ( fgIconBaseURL == null )
throw new MalformedURLException();
StringBuffer buffer = new StringBuffer( prefix );
buffer.append( '/' );
buffer.append( name );
return new URL( fgIconBaseURL, buffer.toString() );
}
}

View file

@ -0,0 +1,159 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui;
import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
/**
*
* A CImageDescriptor consists of a main icon and several adornments. The adornments
* are computed according to flags set on creation of the descriptor.
*
* @since Aug 30, 2002
*/
public class CImageDescriptor extends CompositeImageDescriptor
{
/** Flag to render the is out of synch adornment */
public final static int IS_OUT_OF_SYNCH = 0x001;
/** Flag to render the may be out of synch adornment */
public final static int MAY_BE_OUT_OF_SYNCH = 0x002;
/** Flag to render the installed breakpoint adornment */
public final static int INSTALLED = 0x004;
/** Flag to render the entry method breakpoint adornment */
public final static int ENTRY = 0x008;
/** Flag to render the exit method breakpoint adornment */
public final static int EXIT = 0x010;
/** Flag to render the enabled breakpoint adornment */
public final static int ENABLED = 0x020;
/** Flag to render the conditional breakpoint adornment */
public final static int CONDITIONAL = 0x040;
/** Flag to render the caught breakpoint adornment */
public final static int CAUGHT = 0x080;
/** Flag to render the uncaught breakpoint adornment */
public final static int UNCAUGHT = 0x100;
/** Flag to render the scoped breakpoint adornment */
public final static int SCOPED = 0x200;
private ImageDescriptor fBaseImage;
private int fFlags;
private Point fSize;
/**
* Create a new CImageDescriptor.
*
* @param baseImage an image descriptor used as the base image
* @param flags flags indicating which adornments are to be rendered
*
*/
public CImageDescriptor( ImageDescriptor baseImage, int flags )
{
setBaseImage( baseImage );
setFlags( flags );
}
/**
* @see CompositeImageDescriptor#getSize()
*/
protected Point getSize()
{
if ( fSize == null )
{
ImageData data = getBaseImage().getImageData();
setSize( new Point( data.width, data.height ) );
}
return fSize;
}
/**
* @see Object#equals(java.lang.Object)
*/
public boolean equals( Object object )
{
if ( !( object instanceof CImageDescriptor ) )
{
return false;
}
CImageDescriptor other = (CImageDescriptor)object;
return ( getBaseImage().equals( other.getBaseImage() ) && getFlags() == other.getFlags() );
}
/**
* @see Object#hashCode()
*/
public int hashCode()
{
return getBaseImage().hashCode() | getFlags();
}
/**
* @see CompositeImageDescriptor#drawCompositeImage(int, int)
*/
protected void drawCompositeImage( int width, int height )
{
ImageData bg = getBaseImage().getImageData();
if ( bg == null )
{
bg = DEFAULT_IMAGE_DATA;
}
drawImage( bg, 0, 0 );
drawOverlays();
}
/**
* Add any overlays to the image as specified in the flags.
*/
protected void drawOverlays()
{
int flags = getFlags();
int x = 0;
int y = 0;
ImageData data = null;
if ( ( flags & INSTALLED ) != 0 )
{
x = 0;
y = getSize().y;
if ( ( flags & ENABLED ) != 0 )
{
data = CDebugImages.DESC_OBJS_BREAKPOINT_INSTALLED.getImageData();
}
else
{
data = CDebugImages.DESC_OBJS_BREAKPOINT_INSTALLED_DISABLED.getImageData();
}
y -= data.height;
drawImage( data, x, y );
}
}
protected ImageDescriptor getBaseImage()
{
return fBaseImage;
}
protected void setBaseImage( ImageDescriptor baseImage )
{
fBaseImage = baseImage;
}
protected int getFlags()
{
return fFlags;
}
protected void setFlags( int flags )
{
fFlags = flags;
}
protected void setSize( Point size )
{
fSize = size;
}
}

View file

@ -0,0 +1,28 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.jface.text.IDocument;
/**
*
* Enter type comment.
*
* @since Aug 29, 2002
*/
public class BreakpointLocationVerifier
{
/**
* Returns the line number closest to the given line number that represents a
* valid location for a breakpoint in the given document, or -1 if a valid location
* cannot be found.
*/
public int getValidBreakpointLocation( IDocument doc, int lineNumber )
{
// for now
return lineNumber + 1;
}
}

View file

@ -6,8 +6,13 @@
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.debug.core.ICBreakpoint;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.resource.ImageDescriptor;
@ -234,36 +239,13 @@ public class CBreakpointPreferencePage extends FieldEditorPreferencePage
/**
* Constructor for CBreakpointPreferencePage.
* @param style
* @param breakpoint
*/
public CBreakpointPreferencePage( ICBreakpoint breakpoint )
{
super( GRID );
setBreakpoint( breakpoint );
}
/**
* Constructor for CBreakpointPreferencePage.
* @param title
* @param style
*/
public CBreakpointPreferencePage(String title, int style)
{
super(title, style);
}
/**
* Constructor for CBreakpointPreferencePage.
* @param title
* @param image
* @param style
*/
public CBreakpointPreferencePage(
String title,
ImageDescriptor image,
int style)
{
super(title, image, style);
noDefaultAndApplyButton();
}
/* (non-Javadoc)
@ -271,6 +253,88 @@ public class CBreakpointPreferencePage extends FieldEditorPreferencePage
*/
protected void createFieldEditors()
{
ICBreakpoint breakpoint = getBreakpoint();
String fileName = breakpoint.getMarker().getResource().getLocation().toOSString();
if ( fileName != null )
{
addField( createLabelEditor( getFieldEditorParent(), "File: ", fileName ) );
}
if ( breakpoint instanceof ILineBreakpoint )
{
setTitle( "C/C++ Line Breakpoint Properties" );
ILineBreakpoint lBreakpoint = (ILineBreakpoint)breakpoint;
StringBuffer lineNumber = new StringBuffer( 4 );
try
{
int lNumber = lBreakpoint.getLineNumber();
if ( lNumber > 0 )
{
lineNumber.append( lNumber );
}
}
catch( CoreException ce )
{
CDebugUIPlugin.log( ce );
}
if ( lineNumber.length() > 0 )
{
addField( createLabelEditor( getFieldEditorParent(), "Line Number: ", lineNumber.toString() ) );
}
}
IPreferenceStore store = getPreferenceStore();
try
{
String condition= breakpoint.getCondition();
if ( condition == null )
{
condition = "";
}
store.setValue( CBreakpointPreferenceStore.CONDITION, condition );
createConditionEditor( getFieldEditorParent() );
store.setValue( CBreakpointPreferenceStore.ENABLED, breakpoint.isEnabled() );
int ignoreCount = breakpoint.getIgnoreCount();
store.setValue( CBreakpointPreferenceStore.IGNORE_COUNT, ( ignoreCount >= 0 ) ? ignoreCount : 0 );
createIgnoreCountEditor( getFieldEditorParent() );
}
catch( CoreException ce )
{
CDebugUIPlugin.log( ce );
}
}
protected void createConditionEditor( Composite parent )
{
fCondition = new BreakpointStringFieldEditor( CBreakpointPreferenceStore.CONDITION, "&Condition", parent );
fConditionTextControl = fCondition.getTextControl(parent);
fCondition.setEmptyStringAllowed( true );
fCondition.setErrorMessage( "Invalid_condition" );
addField( fCondition );
}
protected void createIgnoreCountEditor( Composite parent )
{
fIgnoreCount = new BreakpointIntegerFieldEditor( CBreakpointPreferenceStore.IGNORE_COUNT, "&Ignore Count: ", parent );
fIgnoreCount.setValidRange( 0, Integer.MAX_VALUE );
fIgnoreCountTextControl = fIgnoreCount.getTextControl( parent );
try
{
fIgnoreCountTextControl.setEnabled( getBreakpoint().getIgnoreCount() >= 0 );
}
catch (CoreException ce)
{
CDebugUIPlugin.log( ce );
}
addField( fIgnoreCount );
}
protected FieldEditor createLabelEditor( Composite parent, String title, String value )
{
return new LabelFieldEditor( parent, title, value );
}
protected ICBreakpoint getBreakpoint()

View file

@ -306,8 +306,15 @@ public class CBreakpointPreferenceStore implements IPreferenceStore
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferenceStore#setValue(String, String)
*/
public void setValue(String name, String value)
public void setValue( String name, String newValue )
{
Object oldValue = fProperties.get( name );
if ( oldValue == null || !oldValue.equals( newValue ) )
{
fProperties.put( name, newValue );
setDirty( true );
firePropertyChangeEvent( name, oldValue, newValue );
}
}
/* (non-Javadoc)

View file

@ -0,0 +1,484 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.debug.core.ICBreakpoint;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferencePageContainer;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Shell;
/**
*
*
* @since Aug 29, 2002
*/
public class CBreakpointPropertiesDialog extends Dialog
implements IPreferencePageContainer
{
/**
* Layout for the page container.
*
* @see CBreakpointPropertiesDialog#createPageContainer(Composite, int)
*/
private class PageLayout extends Layout
{
public void layout( Composite composite, boolean force )
{
Rectangle rect = composite.getClientArea();
Control[] children = composite.getChildren();
for ( int i = 0; i < children.length; i++ )
{
children[i].setSize( rect.width, rect.height );
}
}
public Point computeSize( Composite composite, int wHint, int hHint, boolean force )
{
if ( wHint != SWT.DEFAULT && hHint != SWT.DEFAULT )
return new Point( wHint, hHint );
int x = fMinimumPageSize.x;
int y = fMinimumPageSize.y;
Control[] children = composite.getChildren();
for ( int i = 0; i < children.length; i++ )
{
Point size = children[i].computeSize( SWT.DEFAULT, SWT.DEFAULT, force );
x = Math.max( x, size.x );
y = Math.max( y, size.y );
}
if ( wHint != SWT.DEFAULT )
x = wHint;
if ( hHint != SWT.DEFAULT )
y = hHint;
return new Point( x, y );
}
}
private Composite fTitleArea;
private Label fTitleImage;
private CLabel fMessageLabel;
private String fMessage;
private Color fNormalMsgAreaBackground;
private Image fErrorMsgImage;
private CBreakpointPreferencePage fPage;
private Button fOkButton;
/**
* Must declare our own images as the JFaceResource images will not be created unless
* a property/preference dialog has been shown
*/
protected static final String PREF_DLG_TITLE_IMG = "breakpoint_preference_dialog_title_image"; //$NON-NLS-1$
protected static final String PREF_DLG_IMG_TITLE_ERROR = "breakpoint_preference_dialog_title_error_image"; //$NON-NLS-1$
static
{
ImageRegistry reg = CDebugUIPlugin.getDefault().getImageRegistry();
reg.put( PREF_DLG_TITLE_IMG, ImageDescriptor.createFromFile( PreferenceDialog.class, "images/pref_dialog_title.gif" ) ); //$NON-NLS-1$
reg.put( PREF_DLG_IMG_TITLE_ERROR, ImageDescriptor.createFromFile( Dialog.class, "images/message_error.gif" ) ); //$NON-NLS-1$
}
/**
* The Composite in which a page is shown.
*/
private Composite fPageContainer;
/**
* The minimum page size; 200 by 200 by default.
*
* @see #setMinimumPageSize(Point)
*/
private Point fMinimumPageSize = new Point(200,200);
/**
* The breakpoint that this dialog is operating on
*/
private ICBreakpoint fBreakpoint;
/**
* The "fake" preference store used to interface between
* the breakpoint and the breakpoint preference page.
*/
private CBreakpointPreferenceStore fCBreakpointPreferenceStore;
/**
* Constructor for CBreakpointPropertiesDialog.
* @param parentShell
*/
public CBreakpointPropertiesDialog( Shell parentShell, ICBreakpoint breakpoint )
{
super( parentShell );
setBreakpoint( breakpoint );
fCBreakpointPreferenceStore= new CBreakpointPreferenceStore();
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePageContainer#getPreferenceStore()
*/
public IPreferenceStore getPreferenceStore()
{
return fCBreakpointPreferenceStore;
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePageContainer#updateButtons()
*/
public void updateButtons()
{
if ( fOkButton != null )
{
fOkButton.setEnabled( fPage.isValid() );
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePageContainer#updateMessage()
*/
public void updateMessage()
{
String pageMessage = fPage.getMessage();
String pageErrorMessage = fPage.getErrorMessage();
// Adjust the font
if ( pageMessage == null && pageErrorMessage == null )
fMessageLabel.setFont( JFaceResources.getBannerFont() );
else
fMessageLabel.setFont( JFaceResources.getDialogFont() );
// Set the message and error message
if ( pageMessage == null )
{
setMessage( fPage.getTitle() );
}
else
{
setMessage( pageMessage );
}
setErrorMessage( pageErrorMessage );
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.IPreferencePageContainer#updateTitle()
*/
public void updateTitle()
{
setTitle( fPage.getTitle() );
}
/**
* Display the given error message. The currently displayed message
* is saved and will be redisplayed when the error message is set
* to <code>null</code>.
*
* @param errorMessage the errorMessage to display or <code>null</code>
*/
public void setErrorMessage( String errorMessage )
{
if ( errorMessage == null )
{
if ( fMessageLabel.getImage() != null )
{
// we were previously showing an error
fMessageLabel.setBackground( fNormalMsgAreaBackground );
fMessageLabel.setImage( null );
fTitleImage.setImage( CDebugUIPlugin.getDefault().getImageRegistry().get( PREF_DLG_TITLE_IMG ) );
fTitleArea.layout( true );
}
// show the message
setMessage( fMessage );
}
else
{
fMessageLabel.setText( errorMessage );
if ( fMessageLabel.getImage() == null )
{
// we were not previously showing an error
// lazy initialize the error background color and image
if ( fErrorMsgImage == null )
{
fErrorMsgImage = CDebugUIPlugin.getDefault().getImageRegistry().get( PREF_DLG_IMG_TITLE_ERROR );
}
// show the error
fNormalMsgAreaBackground = fMessageLabel.getBackground();
fMessageLabel.setBackground( JFaceColors.getErrorBackground( fMessageLabel.getDisplay() ) );
fMessageLabel.setImage( fErrorMsgImage );
fTitleImage.setImage( null );
fTitleArea.layout( true );
}
}
}
/**
* Set the message text. If the message line currently displays an error,
* the message is stored and will be shown after a call to clearErrorMessage
*/
public void setMessage( String newMessage )
{
fMessage = newMessage;
if ( fMessage == null )
{
fMessage = ""; //$NON-NLS-1$
}
if ( fMessageLabel.getImage() == null )
{
// we are not showing an error
fMessageLabel.setText( fMessage );
}
}
/**
* Sets the title for this dialog.
*
* @param title the title.
*/
public void setTitle( String title )
{
Shell shell = getShell();
if ( ( shell != null ) && !shell.isDisposed() )
{
shell.setText( title );
}
}
/**
* @see Dialog#okPressed()
*/
protected void okPressed()
{
final List changedProperties = new ArrayList( 5 );
getPreferenceStore().addPropertyChangeListener(
new IPropertyChangeListener()
{
/**
* @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange( PropertyChangeEvent event )
{
changedProperties.add( event.getProperty() );
}
} );
fPage.performOk();
setBreakpointProperties( changedProperties );
super.okPressed();
}
/**
* All of the properties that the user has changed via the dialog
* are written through to the breakpoint.
*/
protected void setBreakpointProperties( final List changedProperties )
{
IWorkspaceRunnable wr = new IWorkspaceRunnable()
{
public void run( IProgressMonitor monitor ) throws CoreException
{
}
};
try
{
ResourcesPlugin.getWorkspace().run( wr, null );
}
catch( CoreException ce )
{
CDebugUIPlugin.log( ce );
}
}
protected ICBreakpoint getBreakpoint()
{
return fBreakpoint;
}
protected void setBreakpoint( ICBreakpoint breakpoint )
{
fBreakpoint = breakpoint;
}
/**
* @see Dialog#createDialogArea(Composite)
*/
protected Control createDialogArea( Composite parent )
{
GridData gd;
Composite composite = (Composite) super.createDialogArea( parent );
((GridLayout)composite.getLayout()).numColumns = 1;
// Build the title area and separator line
Composite titleComposite = new Composite( composite, SWT.NONE );
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 0;
layout.horizontalSpacing = 0;
titleComposite.setLayout( layout );
titleComposite.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
createTitleArea( titleComposite );
Label titleBarSeparator = new Label( titleComposite, SWT.HORIZONTAL | SWT.SEPARATOR );
gd = new GridData( GridData.FILL_HORIZONTAL );
titleBarSeparator.setLayoutData( gd );
// Build the Page container
fPageContainer = createPageContainer( composite, 2 );
fPageContainer.setLayoutData( new GridData( GridData.FILL_BOTH ) );
fPageContainer.setFont( parent.getFont() );
fPage = new CBreakpointPreferencePage( getBreakpoint() );
fPage.setContainer( this );
fPage.createControl( fPageContainer );
// Build the separator line
Label separator = new Label( composite, SWT.HORIZONTAL | SWT.SEPARATOR );
gd = new GridData( GridData.FILL_HORIZONTAL );
gd.horizontalSpan = 2;
separator.setLayoutData( gd );
return composite;
}
/**
* Creates the dialog's title area.
*
* @param parent the SWT parent for the title area composite
* @return the created title area composite
*/
private Composite createTitleArea( Composite parent )
{
// Create the title area which will contain
// a title, message, and image.
fTitleArea = new Composite( parent, SWT.NONE );
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 0;
layout.horizontalSpacing = 0;
layout.numColumns = 2;
// Get the colors for the title area
Display display = parent.getDisplay();
Color bg = JFaceColors.getBannerBackground( display );
Color fg = JFaceColors.getBannerForeground( display );
GridData layoutData = new GridData( GridData.FILL_BOTH );
fTitleArea.setLayout( layout );
fTitleArea.setLayoutData( layoutData );
fTitleArea.setBackground( bg );
// Message label
fMessageLabel = new CLabel( fTitleArea, SWT.LEFT );
fMessageLabel.setBackground( bg );
fMessageLabel.setForeground( fg );
fMessageLabel.setText( " " ); //$NON-NLS-1$
fMessageLabel.setFont( JFaceResources.getBannerFont() );
final IPropertyChangeListener fontListener =
new IPropertyChangeListener()
{
public void propertyChange( PropertyChangeEvent event )
{
if ( JFaceResources.BANNER_FONT.equals( event.getProperty() ) ||
JFaceResources.DIALOG_FONT.equals( event.getProperty() ) )
{
updateMessage();
}
}
};
fMessageLabel.addDisposeListener(
new DisposeListener()
{
public void widgetDisposed( DisposeEvent event )
{
JFaceResources.getFontRegistry().removeListener( fontListener );
}
} );
JFaceResources.getFontRegistry().addListener( fontListener );
GridData gd = new GridData( GridData.FILL_BOTH );
fMessageLabel.setLayoutData( gd );
// Title image
fTitleImage = new Label( fTitleArea, SWT.LEFT );
fTitleImage.setBackground( bg );
fTitleImage.setImage( CDebugUIPlugin.getDefault().getImageRegistry().get( PREF_DLG_TITLE_IMG ) );
gd = new GridData();
gd.horizontalAlignment = gd.END;
fTitleImage.setLayoutData( gd );
return fTitleArea;
}
/**
* Creates the inner page container.
*/
private Composite createPageContainer( Composite parent, int numColumns )
{
Composite result = new Composite( parent, SWT.NULL );
result.setLayout( new PageLayout() );
return result;
}
/**
* Sets the minimum page size.
*
* @param size the page size encoded as
* <code>new Point(width,height)</code>
* @see #setMinimumPageSize(int,int)
*/
public void setMinimumPageSize( Point size )
{
fMinimumPageSize.x = size.x;
fMinimumPageSize.y = size.y;
}
/**
* @see Dialog#createButtonsForButtonBar(Composite)
*/
protected void createButtonsForButtonBar( Composite parent )
{
fOkButton = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true );
createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false );
}
}

View file

@ -0,0 +1,57 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.debug.core.ICBreakpoint;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.ui.texteditor.ITextEditor;
/**
*
* Presents a custom properties dialog to configure the attibutes of
* a C/C++ breakpoint from the ruler popup menu of a text editor.
*
* @since Aug 29, 2002
*/
public class CBreakpointPropertiesRulerAction extends AbstractBreakpointRulerAction
{
/**
* Creates the action to enable/disable breakpoints
*/
public CBreakpointPropertiesRulerAction( ITextEditor editor, IVerticalRulerInfo info )
{
setInfo( info );
setTextEditor( editor );
setText( "Breakpoint &Properties..." );
}
/**
* @see Action#run()
*/
public void run()
{
if (getBreakpoint() != null)
{
Dialog d = new CBreakpointPropertiesDialog( getTextEditor().getEditorSite().getShell(), (ICBreakpoint)getBreakpoint() );
d.open();
}
}
/**
* @see IUpdate#update()
*/
public void update()
{
setBreakpoint( determineBreakpoint() );
if ( getBreakpoint() == null || !( getBreakpoint() instanceof ICBreakpoint ) )
{
setBreakpoint( null );
setEnabled( false );
return;
}
setEnabled( true );
}
}

View file

@ -0,0 +1,28 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
import org.eclipse.ui.texteditor.ITextEditor;
/**
*
* Enter type comment.
*
* @since Aug 29, 2002
*/
public class CBreakpointPropertiesRulerActionDelegate extends AbstractRulerActionDelegate
{
/* (non-Javadoc)
* @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(ITextEditor, IVerticalRulerInfo)
*/
protected IAction createAction( ITextEditor editor, IVerticalRulerInfo rulerInfo )
{
return new CBreakpointPropertiesRulerAction( editor, rulerInfo );
}
}

View file

@ -6,9 +6,12 @@
package org.eclipse.cdt.debug.internal.ui.actions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.debug.core.CDebugModel;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
@ -16,16 +19,19 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
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.IBreakpointManager;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.IVerticalRulerInfo;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
@ -228,7 +234,44 @@ public class ManageBreakpointRulerAction extends Action implements IUpdate
IEditorInput editorInput = getTextEditor().getEditorInput();
IDocument document = getDocument();
int rulerLine = getVerticalRulerInfo().getLineOfLastMouseButtonActivity();
// create breakpoint
try
{
BreakpointLocationVerifier bv = new BreakpointLocationVerifier();
int lineNumber = bv.getValidBreakpointLocation( document, rulerLine );
if ( lineNumber > 0 )
{
IRegion line = document.getLineInformation( lineNumber - 1 );
String fileName = null;
if ( editorInput instanceof IFileEditorInput )
{
fileName = ((IFileEditorInput)editorInput).getFile().getLocation().toString();
}
if ( fileName != null )
{
if ( CDebugModel.lineBreakpointExists( fileName, lineNumber ) == null )
{
CDebugModel.createLineBreakpoint( ((IFileEditorInput)editorInput).getFile(),
lineNumber,
true,
0,
"",
true );
}
}
}
}
catch( DebugException e )
{
CDebugUIPlugin.errorDialog( "Cannot add breakpoint", e );
}
catch( CoreException e )
{
CDebugUIPlugin.errorDialog( "Cannot add breakpoint", e );
}
catch( BadLocationException e )
{
CDebugUIPlugin.errorDialog( "Cannot add breakpoint", e );
}
}
protected void removeMarkers( List markers )
@ -245,7 +288,7 @@ public class ManageBreakpointRulerAction extends Action implements IUpdate
}
catch( CoreException e )
{
// CDebugUIPlugin.errorDialog( ActionMessages.getString("ManageBreakpointRulerAction.error.removing.message1"), e); //$NON-NLS-1$
CDebugUIPlugin.errorDialog( "Cannot remove breakpoint", e );
}
}
}

View file

@ -8,6 +8,7 @@ import java.util.ResourceBundle;
import org.eclipse.cdt.debug.core.IFormattedMemoryBlock;
import org.eclipse.cdt.debug.core.IFormattedMemoryRetrieval;
import org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation;
import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
import org.eclipse.cdt.debug.internal.ui.ColorManager;
import org.eclipse.cdt.debug.internal.ui.preferences.MemoryViewPreferencePage;
import org.eclipse.core.resources.IWorkspace;
@ -18,11 +19,15 @@ import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.internal.ui.DebugUIMessages;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.plugin.AbstractUIPlugin;
/**
@ -36,6 +41,9 @@ public class CDebugUIPlugin extends AbstractUIPlugin
private ResourceBundle resourceBundle;
protected Map fDebuggerPageMap;
private CDebugImageDescriptorRegistry fImageDescriptorRegistry;
/**
* The constructor.
*/
@ -202,4 +210,98 @@ public class CDebugUIPlugin extends AbstractUIPlugin
fDebuggerPageMap.put(id, infos[i]);
}
}
public static void errorDialog( String message, IStatus status )
{
log( status );
Shell shell = getActiveWorkbenchShell();
if ( shell != null )
{
ErrorDialog.openError( shell, "Error", message, status );
}
}
public static void errorDialog( String message, Throwable t )
{
log( t );
Shell shell = getActiveWorkbenchShell();
if ( shell != null )
{
IStatus status = new Status( IStatus.ERROR, getUniqueIdentifier(), ICDebugUIConstants.INTERNAL_ERROR, "Error logged from CDT Debug UI: ", t ); //$NON-NLS-1$
ErrorDialog.openError( shell, "Error", message, status );
}
}
/**
* Returns the active workbench window
*
* @return the active workbench window
*/
public static IWorkbenchWindow getActiveWorkbenchWindow()
{
return getDefault().getWorkbench().getActiveWorkbenchWindow();
}
public static IWorkbenchPage getActivePage()
{
IWorkbenchWindow w = getActiveWorkbenchWindow();
if ( w != null )
{
return w.getActivePage();
}
return null;
}
/**
* Returns the active workbench shell or <code>null</code> if none
*
* @return the active workbench shell or <code>null</code> if none
*/
public static Shell getActiveWorkbenchShell()
{
IWorkbenchWindow window = getActiveWorkbenchWindow();
if ( window != null )
{
return window.getShell();
}
return null;
}
/**
* Returns the standard display to be used. The method first checks, if
* the thread calling this method has an associated display. If so, this
* display is returned. Otherwise the method returns the default display.
*/
public static Display getStandardDisplay()
{
Display display;
display = Display.getCurrent();
if ( display == null )
display = Display.getDefault();
return display;
}
/**
* Returns the image descriptor registry used for this plugin.
*/
public static CDebugImageDescriptorRegistry getImageDescriptorRegistry()
{
if ( getDefault().fImageDescriptorRegistry == null )
{
getDefault().fImageDescriptorRegistry = new CDebugImageDescriptorRegistry();
}
return getDefault().fImageDescriptorRegistry;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.Plugin#shutdown()
*/
public void shutdown() throws CoreException
{
if ( fImageDescriptorRegistry != null )
{
fImageDescriptorRegistry.dispose();
}
super.shutdown();
}
}