blob: 44f48eaada8e8a75f93ee8d090f137ee7ff22c45 [file] [log] [blame]
/*
*(c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*
*/
package org.eclipse.cdt.debug.internal.ui.actions;
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.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
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.actions.ActionDelegate;
import org.eclipse.ui.texteditor.ITextEditor;
/**
*
* Action for adding/removing watchpoints at a selection in the active
* C/C++ or assembly editor.
*
* @since Sep 4, 2002
*/
public class AddWatchpointActionDelegate extends ActionDelegate
implements IWorkbenchWindowActionDelegate,
IPartListener
{
private boolean fInitialized = false;
private IAction fAction = null;
private ITextEditor fTextEditor = null;
private IWorkbenchWindow fWorkbenchWindow = null;
private IProject fProject = null;
/**
* Constructor for AddWatchpointActionDelegate.
*/
public AddWatchpointActionDelegate()
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
*/
public void dispose()
{
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(IWorkbenchWindow)
*/
public void init( IWorkbenchWindow window )
{
setWorkbenchWindow( window );
window.getPartService().addPartListener( this );
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(IAction)
*/
public void run( IAction action )
{
String expression = getSelectedExpression();
AddWatchpointDialog dlg = new AddWatchpointDialog( CDebugUIPlugin.getActiveWorkbenchShell(),
true,
false,
expression );
if ( dlg.open() != Window.OK )
return;
if ( getTextEditor() != null )
{
update();
addWatchpoint( getTextEditor().getEditorInput(),
dlg.getWriteAccess(),
dlg.getReadAccess(),
dlg.getExpression() );
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(IAction, ISelection)
*/
public void selectionChanged( IAction action, ISelection selection )
{
if ( !fInitialized )
{
setAction( action );
if ( getWorkbenchWindow() != null )
{
IWorkbenchPage page = getWorkbenchWindow().getActivePage();
if ( page != null )
{
IEditorPart part = page.getActiveEditor();
if ( part instanceof ITextEditor )
{
setTextEditor( (ITextEditor)part );
}
}
}
fInitialized = true;
}
}
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 ITextEditor getTextEditor()
{
return fTextEditor;
}
protected void setTextEditor( ITextEditor editor )
{
fTextEditor = editor;
if ( fTextEditor != null )
{
IEditorInput input = fTextEditor.getEditorInput();
IFile file = ( input != null && input instanceof IFileEditorInput ) ? ((IFileEditorInput)input).getFile() : null;
setProject( ( file != null ) ? file.getProject() : null );
}
setEnabledState( editor );
}
protected String getSelectedExpression()
{
if ( getTextEditor() != null )
{
ISelectionProvider sp = getTextEditor().getSelectionProvider();
if ( sp != null )
{
ISelection s = sp.getSelection();
if ( s instanceof ITextSelection )
{
return ((ITextSelection)s).getText().trim();
}
}
}
return "";
}
protected void update( ISelection selection )
{
setEnabledState( getTextEditor() );
}
protected void update()
{
IAction action = getAction();
if ( action != null )
{
action.setEnabled( getTextEditor() != null );
}
}
protected void setEnabledState( ITextEditor editor )
{
if ( getAction() != null )
{
getAction().setEnabled( editor != null );
}
}
protected IProject getProject()
{
return fProject;
}
protected void setProject( IProject project )
{
fProject = project;
}
protected void addWatchpoint( IEditorInput editorInput, boolean write, boolean read, String expression )
{
if ( getProject() == null )
return;
IDocument document = getTextEditor().getDocumentProvider().getDocument( editorInput );
WatchpointExpressionVerifier wev = new WatchpointExpressionVerifier();
if ( wev.isValidExpression( document, expression ) )
{
try
{
CDebugModel.createWatchpoint( getProject(),
write,
read,
expression,
true,
0,
"",
true );
}
catch( CoreException ce )
{
CDebugUIPlugin.errorDialog( "Cannot add watchpoint", ce );
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IPartListener#partActivated(IWorkbenchPart)
*/
public void partActivated( IWorkbenchPart part )
{
if ( part instanceof ITextEditor )
{
setTextEditor( (ITextEditor)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 == getTextEditor() )
{
setTextEditor( null );
if ( getAction() != null )
{
getAction().setEnabled( false );
}
}
}
/* (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 )
{
if ( part instanceof ITextEditor )
{
if ( getTextEditor() == null )
{
setTextEditor( (ITextEditor)part );
}
}
}
}