| /* |
| *(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.model.IExecFileInfo; |
| import org.eclipse.cdt.debug.core.model.IGlobalVariable; |
| import org.eclipse.cdt.debug.ui.CDebugUIPlugin; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.MultiStatus; |
| import org.eclipse.debug.core.DebugException; |
| import org.eclipse.debug.core.DebugPlugin; |
| 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.debug.ui.IDebugUIConstants; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.swt.custom.BusyIndicator; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.IPartListener; |
| import org.eclipse.ui.ISelectionListener; |
| import org.eclipse.ui.IViewActionDelegate; |
| import org.eclipse.ui.IViewPart; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.actions.ActionDelegate; |
| import org.eclipse.ui.dialogs.ListSelectionDialog; |
| |
| /** |
| * Enter type comment. |
| * |
| * @since: Nov 4, 2002 |
| */ |
| public class AddGlobalsActionDelegate extends ActionDelegate |
| implements IViewActionDelegate, |
| ISelectionListener, |
| IPartListener |
| { |
| protected class Global |
| { |
| private String fName; |
| private IPath fPath; |
| |
| /** |
| * Constructor for Global. |
| */ |
| public Global( String name, IPath path ) |
| { |
| fName = name; |
| fPath = path; |
| } |
| |
| public String getName() |
| { |
| return fName; |
| } |
| |
| public IPath getPath() |
| { |
| return fPath; |
| } |
| } |
| |
| private Global[] fGlobals; |
| private IViewPart fView = null; |
| private IAction fAction; |
| private IStructuredSelection fSelection; |
| private IStatus fStatus = null; |
| |
| /** |
| * Constructor for AddGlobalsActionDelegate. |
| */ |
| public AddGlobalsActionDelegate() |
| { |
| super(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.IViewActionDelegate#init(IViewPart) |
| */ |
| public void init( IViewPart view ) |
| { |
| fView = view; |
| view.getSite().getPage().addPartListener( this ); |
| view.getSite().getPage().addSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this ); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection) |
| */ |
| public void selectionChanged( IWorkbenchPart part, ISelection selection ) |
| { |
| if ( part != null && part.getSite().getId().equals( IDebugUIConstants.ID_DEBUG_VIEW ) ) |
| { |
| if ( selection instanceof IStructuredSelection ) |
| { |
| setSelection( (IStructuredSelection)selection ); |
| } |
| else |
| { |
| setSelection( null ); |
| } |
| update( getAction() ); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.IActionDelegate#run(IAction) |
| */ |
| public void run( IAction action ) |
| { |
| final IStructuredSelection selection = getSelection(); |
| if ( selection != null && selection.size() != 1 ) |
| return; |
| BusyIndicator.showWhile( Display.getCurrent(), |
| new Runnable() |
| { |
| public void run() |
| { |
| try |
| { |
| doAction( selection.getFirstElement() ); |
| setStatus( null ); |
| } |
| catch( DebugException e ) |
| { |
| setStatus( e.getStatus() ); |
| } |
| } |
| } ); |
| if ( getStatus() != null && !getStatus().isOK() ) |
| { |
| IWorkbenchWindow window= CDebugUIPlugin.getActiveWorkbenchWindow(); |
| if ( window != null ) |
| { |
| CDebugUIPlugin.errorDialog( getErrorDialogMessage(), getStatus() ); |
| } |
| else |
| { |
| CDebugUIPlugin.log( getStatus() ); |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.IActionDelegate#selectionChanged(IAction, ISelection) |
| */ |
| public void selectionChanged( IAction action, ISelection selection ) |
| { |
| setAction( action ); |
| if ( getView() != null ) |
| { |
| update( action ); |
| } |
| } |
| |
| protected void update( IAction action ) |
| { |
| if ( action != null ) |
| { |
| action.setEnabled( getEnableStateForSelection( getSelection() ) ); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.IPartListener#partActivated(IWorkbenchPart) |
| */ |
| public void partActivated( IWorkbenchPart 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.equals( getView() ) ) |
| { |
| dispose(); |
| } |
| } |
| |
| /* (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 ) |
| { |
| } |
| |
| protected IViewPart getView() |
| { |
| return fView; |
| } |
| |
| protected void setView( IViewPart viewPart ) |
| { |
| fView = viewPart; |
| } |
| |
| protected void setAction( IAction action ) |
| { |
| fAction = action; |
| } |
| |
| protected IAction getAction() |
| { |
| return fAction; |
| } |
| |
| private void setSelection( IStructuredSelection selection ) |
| { |
| fSelection = selection; |
| } |
| |
| private IStructuredSelection getSelection() |
| { |
| return fSelection; |
| } |
| |
| public void dispose() |
| { |
| if ( getView() != null ) |
| { |
| getView().getViewSite().getPage().removeSelectionListener( IDebugUIConstants.ID_DEBUG_VIEW, this ); |
| getView().getViewSite().getPage().removePartListener( this ); |
| } |
| } |
| |
| protected boolean getEnableStateForSelection( IStructuredSelection selection ) |
| { |
| if ( selection == null || selection.size() != 1 ) |
| { |
| return false; |
| } |
| Object element = selection.getFirstElement(); |
| return ( element != null && |
| element instanceof IDebugElement && |
| ((IDebugElement)element).getDebugTarget().getAdapter( IExecFileInfo.class ) != null ); |
| } |
| |
| private ListSelectionDialog createDialog() |
| { |
| return new ListSelectionDialog( getView().getSite().getShell(), |
| fGlobals, |
| new IStructuredContentProvider() |
| { |
| public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) |
| { |
| } |
| |
| public void dispose() |
| { |
| } |
| |
| public Object[] getElements( Object parent ) |
| { |
| return getGlobals(); |
| } |
| }, |
| new LabelProvider() |
| { |
| public String getText( Object element ) |
| { |
| if ( element instanceof Global ) |
| { |
| String path = ""; |
| if ( ((Global)element).getPath() != null ) |
| { |
| path = ((Global)element).getPath().toString(); |
| int index = path.lastIndexOf( '/' ); |
| if ( index != -1 ) |
| path = path.substring( index + 1 ); |
| } |
| return ( path.length() > 0 ? ( '\'' + path + "\'::" ) : "" ) + ((Global)element).getName(); |
| } |
| return null; |
| } |
| }, |
| "Select Variables:" ); |
| } |
| |
| protected Global[] getGlobals() |
| { |
| return fGlobals; |
| } |
| |
| protected void doAction( Object element ) throws DebugException |
| { |
| if ( getView() == null ) |
| return; |
| if ( element != null && element instanceof IDebugElement ) |
| { |
| IExecFileInfo info = (IExecFileInfo)((IDebugElement)element).getDebugTarget().getAdapter( IExecFileInfo.class ); |
| if ( info != null ) |
| { |
| IGlobalVariable[] globalVars = info.getGlobals(); |
| fGlobals = new Global[globalVars.length]; |
| for ( int i = 0; i < globalVars.length; ++i ) |
| { |
| fGlobals[i] = new Global( globalVars[i].getName(), globalVars[i].getPath() ); |
| } |
| ListSelectionDialog dlg = createDialog(); |
| if ( dlg.open() == Window.OK ) |
| { |
| MultiStatus ms = new MultiStatus( CDebugCorePlugin.getUniqueIdentifier(), DebugException.REQUEST_FAILED, getStatusMessage(), null ); |
| Object[] selections = dlg.getResult(); |
| for ( int i = 0; i < selections.length; ++i ) |
| { |
| try |
| { |
| createExpression( ((IDebugElement)element).getDebugTarget(), (Global)selections[i] ); |
| } |
| catch( DebugException e ) |
| { |
| ms.merge( e.getStatus() ); |
| } |
| } |
| if ( !ms.isOK() ) |
| { |
| throw new DebugException( ms ); |
| } |
| } |
| } |
| } |
| } |
| |
| protected String getStatusMessage() |
| { |
| return "Exceptions occurred attempting to add global variables."; |
| } |
| |
| /** |
| * @see AbstractDebugActionDelegate#getErrorDialogMessage() |
| */ |
| protected String getErrorDialogMessage() |
| { |
| return "Add global variables failed."; |
| } |
| |
| protected void setStatus( IStatus status ) |
| { |
| fStatus = status; |
| } |
| |
| protected IStatus getStatus() |
| { |
| return fStatus; |
| } |
| |
| private void createExpression( IDebugTarget target, Global global ) throws DebugException |
| { |
| IExpression expression = CDebugModel.createExpressionForGlobalVariable( target, global.getPath(), global.getName() ); |
| DebugPlugin.getDefault().getExpressionManager().addExpression( expression ); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction) |
| */ |
| public void init( IAction action ) |
| { |
| super.init( action ); |
| Object element = DebugUITools.getDebugContext(); |
| setSelection( (element != null ) ? new StructuredSelection( element ) : new StructuredSelection() ); |
| update( action ); |
| } |
| } |