1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 01:15:29 +02:00

Implementation of expressions.

This commit is contained in:
Mikhail Khodjaiants 2002-09-18 15:04:01 +00:00
parent f45c222418
commit df4e0dbe8d
9 changed files with 565 additions and 6 deletions

View file

@ -12,6 +12,7 @@ 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.ICDIExpression;
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.breakpoints.CWatchpoint;
@ -24,12 +25,15 @@ 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.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
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.IExpression;
import org.eclipse.debug.core.model.IProcess;
/**
@ -275,4 +279,24 @@ public class CDebugModel
attributes.put( ICWatchpoint.WRITE, new Boolean( writeAccess ) );
return new CWatchpoint( resource, attributes, add );
}
public static IExpression createExpression( IDebugTarget target, String text ) throws DebugException
{
if ( target != null && target instanceof CDebugTarget )
{
try
{
ICDIExpression cdiExpression = ((CDebugTarget)target).getCDISession().getExpressionManager().createExpression( text );
}
catch( CDIException e )
{
throw new DebugException( new Status( IStatus.ERROR,
getPluginIdentifier(),
DebugException.TARGET_REQUEST_FAILED,
"Create expression failed.",
e ) );
}
}
return null;
}
}

View file

@ -59,10 +59,12 @@ import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.IExpressionListener;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchListener;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IRegisterGroup;
@ -81,6 +83,7 @@ public class CDebugTarget extends CDebugElement
IFormattedMemoryRetrieval,
IState,
ILaunchListener,
IExpressionListener,
ICExpressionEvaluator
{
/**
@ -1656,4 +1659,25 @@ public class CDebugTarget extends CDebugElement
((CRegisterGroup)it.next()).preserve();
}
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.IExpressionListener#expressionAdded(IExpression)
*/
public void expressionAdded( IExpression expression )
{
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.IExpressionListener#expressionChanged(IExpression)
*/
public void expressionChanged( IExpression expression )
{
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.IExpressionListener#expressionRemoved(IExpression)
*/
public void expressionRemoved( IExpression expression )
{
}
}

View file

@ -0,0 +1,69 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.core.model;
import org.eclipse.cdt.debug.core.ICValue;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEventListener;
import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.core.model.IValue;
/**
*
* Enter type comment.
*
* @since Sep 17, 2002
*/
public class CExpression extends CVariable
implements IExpression
{
/**
* Constructor for CExpression.
* @param target
*/
public CExpression( CDebugTarget target, ICDIExpression cdiExpression )
{
super( target, cdiExpression );
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IExpression#getExpressionText()
*/
public String getExpressionText()
{
try
{
return getName();
}
catch( DebugException e )
{
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IExpression#getValue()
*/
public IValue getValue()
{
try
{
return super.getValue();
}
catch( DebugException e )
{
}
return null;
}
public void dispose()
{
super.dispose();
}
}

View file

@ -12,16 +12,12 @@ import org.eclipse.debug.core.DebugException;
/**
*
* Generates variable values.
* Generates values for variable and expressions.
*
* @since Sep 9, 2002
*/
public class CValueFactory
{
/**
* Creates the appropriate kind of value, or <code>null</code>.
*
*/
static public ICValue createValue( CVariable parent, ICDIValue cdiValue ) throws DebugException
{
return new CValue( parent, cdiValue );

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

View file

@ -24,4 +24,5 @@ EnableBreakpoint.label=T&oggle Breakpoint
BreakpointProperties.label=Breakpoint P&roperties...
ManageBreakpointAction.label=Add/Remove C/C++ Brea&kpoint
BreakpointPropertiesAction.label=P&roperties...
ManageWatchpointAction.label=Add C/C++ &Watchpoint
ManageWatchpointAction.label=Add C/C++ &Watchpoint...
AddExpressionAction.label=Add C/C++ &Expression...

View file

@ -95,6 +95,14 @@
name="cBreakpointGroup">
</separator>
</menu>
<menu
label="%RunMenu.label"
path="additions"
id="org.eclipse.ui.run">
<separator
name="cExpressionGroup">
</separator>
</menu>
<action
id="org.eclipse.cdt.debug.ui.internal.actions.RestartActionDelegate"
hoverIcon="icons/full/clcl16/restart.gif"
@ -141,6 +149,20 @@
</pluginState>
</enablement>
</action>
<action
label="%AddExpressionAction.label"
icon="icons/full/obj16/expression_obj.gif"
helpContextId="add_expression_action_context"
class="org.eclipse.cdt.debug.internal.ui.actions.AddExpressionActionDelegate"
menubarPath="org.eclipse.ui.run/cExpressionGroup"
id="org.eclipse.cdt.debug.internal.ui.actions.AddExpressionActionDelegate">
<enablement>
<pluginState
value="activated"
id="org.eclipse.cdt.debug.ui">
</pluginState>
</enablement>
</action>
</actionSet>
</extension>
<extension

View file

@ -0,0 +1,283 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.CDebugModel;
import org.eclipse.cdt.debug.core.ICExpressionEvaluator;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IExpression;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.texteditor.ITextEditor;
/**
*
* Enter type comment.
*
* @since Sep 17, 2002
*/
public class AddExpressionActionDelegate implements IWorkbenchWindowActionDelegate,
IEditorActionDelegate,
IPartListener
{
private IAction fAction;
private IWorkbenchWindow fWorkbenchWindow;
private IWorkbenchPart fTargetPart;
private IEditorPart fTargetEditor;
private IDebugTarget fDebugTarget;
/**
* Constructor for AddExpressionActionDelegate.
*/
public AddExpressionActionDelegate()
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
*/
public void dispose()
{
IWorkbenchWindow win = getWorkbenchWindow();
if ( win != null )
{
win.getPartService().removePartListener( this );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(IWorkbenchWindow)
*/
public void init( IWorkbenchWindow window )
{
setWorkbenchWindow( window );
IWorkbenchPage page = window.getActivePage();
if ( page != null )
{
setTargetPart( page.getActivePart() );
}
window.getPartService().addPartListener( this );
IAdaptable context = DebugUITools.getDebugContext();
if ( context != null )
{
IDebugTarget target = ((IDebugElement)context.getAdapter( IDebugElement.class )).getDebugTarget();
if ( target != null )
{
ICExpressionEvaluator ee = (ICExpressionEvaluator)target.getAdapter( ICExpressionEvaluator.class );
if ( ee != null && ee.canEvaluate() )
{
setDebugTarget( target );
}
}
}
update();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partActivated(IWorkbenchPart)
*/
public void partActivated( IWorkbenchPart part )
{
setTargetPart( part );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partBroughtToTop(IWorkbenchPart)
*/
public void partBroughtToTop( IWorkbenchPart part )
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partClosed(IWorkbenchPart)
*/
public void partClosed( IWorkbenchPart part )
{
if ( part == getTargetPart() )
{
setTargetPart( null );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partDeactivated(IWorkbenchPart)
*/
public void partDeactivated( IWorkbenchPart part )
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partOpened(IWorkbenchPart)
*/
public void partOpened( IWorkbenchPart part )
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(IAction)
*/
public void run( IAction action )
{
String text = getSelectedText();
ExpressionDialog dlg = new ExpressionDialog( getShell(), text );
if ( dlg.open() != Dialog.OK )
return;
createExpression( dlg.getExpression() );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(IAction, ISelection)
*/
public void selectionChanged( IAction action, ISelection selection )
{
setAction( action );
update();
}
protected IAction getAction()
{
return fAction;
}
protected void setAction( IAction action )
{
fAction = action;
}
protected IWorkbenchWindow getWorkbenchWindow()
{
return fWorkbenchWindow;
}
protected void setWorkbenchWindow( IWorkbenchWindow workbenchWindow )
{
fWorkbenchWindow = workbenchWindow;
}
protected String getSelectedText()
{
ISelection selection = getTargetSelection();
if ( selection != null && selection instanceof ITextSelection )
{
return ((ITextSelection)selection).getText().trim();
}
return "";
}
protected void update()
{
IAction action = getAction();
if ( action != null )
{
action.setEnabled( getDebugTarget() != null && getTargetPart() != null );
}
}
protected void setEnabledState( ITextEditor editor )
{
if ( getAction() != null )
{
getAction().setEnabled( editor != null );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(IAction, IEditorPart)
*/
public void setActiveEditor( IAction action, IEditorPart targetEditor )
{
setAction( action );
setTargetPart( targetEditor );
update();
}
protected IWorkbenchPart getTargetPart()
{
return fTargetPart;
}
protected void setTargetPart( IWorkbenchPart part )
{
fTargetPart = part;
}
protected Shell getShell()
{
if ( getTargetPart() != null )
{
return getTargetPart().getSite().getShell();
}
else
{
return CDebugUIPlugin.getActiveWorkbenchShell();
}
}
protected ISelection getTargetSelection()
{
IWorkbenchPart part = getTargetPart();
if ( part != null )
{
ISelectionProvider provider = part.getSite().getSelectionProvider();
if ( provider != null )
{
return provider.getSelection();
}
}
return null;
}
protected IDebugTarget getDebugTarget()
{
return fDebugTarget;
}
protected void setDebugTarget( IDebugTarget target )
{
fDebugTarget = target;
}
private void createExpression( final String text )
{
final Display display = CDebugUIPlugin.getStandardDisplay();
if ( display.isDisposed() )
{
return;
}
display.asyncExec( new Runnable()
{
public void run()
{
try
{
CDebugModel.createExpression( getDebugTarget(), text );
}
catch( DebugException e )
{
CDebugUIPlugin.errorDialog( e.getMessage(), e );
}
}
} );
}
}

View file

@ -0,0 +1,140 @@
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
import org.eclipse.debug.internal.ui.DebugPluginImages;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
*
* Enter type comment.
*
* @since Sep 17, 2002
*/
public class ExpressionDialog extends Dialog
{
private Button fBtnOk = null;
private Button fBtnCancel = null;
private Text fTextExpression;
private String fExpression = "";
/**
* Constructor for ExpressionDialog.
* @param parentShell
*/
public ExpressionDialog( Shell parentShell, String expression )
{
super( parentShell );
if ( expression != null )
fExpression = expression;
}
protected void configureShell( Shell shell )
{
super.configureShell( shell );
shell.setText( "Add Expression" );
shell.setImage( DebugPluginImages.getImage( IDebugUIConstants.IMG_OBJS_EXPRESSION ) );
}
protected Control createContents( Composite parent )
{
Control control = super.createContents( parent );
setOkButtonState();
return control;
}
protected Control createDialogArea( Composite parent )
{
Composite composite = new Composite( parent, SWT.NONE );
composite.setLayout( new GridLayout() );
((GridLayout)composite.getLayout()).marginWidth = 10;
composite.setLayoutData( new GridData( GridData.FILL_BOTH ) );
createDataWidgets( composite );
initializeDataWidgets();
return composite;
}
protected void createButtonsForButtonBar( Composite parent )
{
fBtnOk = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true );
fBtnCancel = createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false );
}
private void createDataWidgets( Composite parent )
{
fTextExpression = createExpressionText( parent );
}
private void initializeDataWidgets()
{
fTextExpression.setText( fExpression );
setOkButtonState();
}
private Text createExpressionText( Composite parent )
{
Label label = new Label( parent, SWT.RIGHT );
label.setText( "Expression to add:" );
final Text text = new Text( parent, SWT.BORDER );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.widthHint = 300;
text.setLayoutData( gridData );
addModifyListener( text );
return text;
}
private void setOkButtonState()
{
if ( fBtnOk == null )
return;
fBtnOk.setEnabled( fTextExpression.getText().trim().length() > 0 );
}
private void storeData()
{
fExpression = fTextExpression.getText().trim();
}
private void addModifyListener( Text text )
{
text.addModifyListener(
new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
setOkButtonState();
}
} );
}
public String getExpression()
{
return fExpression;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed()
{
storeData();
super.okPressed();
}
}