/****************************************************************************** * Copyright (c) 2007 g-Eclipse consortium * 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 * * Initial development of the original code was made for * project g-Eclipse founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributor(s): * UCY (http://www.cs.ucy.ac.cy) * - Harald Gjermundrod (harald@cs.ucy.ac.cy) * *****************************************************************************/ package eu.geclipse.batch.ui.views; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.graphics.Device; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.compare.IContentChangeListener; import org.eclipse.compare.IContentChangeNotifier; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableFontProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardDialog; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.batch.IBatchJobInfo; import eu.geclipse.batch.ui.dialogs.BatchJobInfoDialog; import eu.geclipse.batch.ui.internal.Activator; import eu.geclipse.batch.ui.internal.BatchJobManager; import eu.geclipse.batch.ui.internal.Messages; import eu.geclipse.batch.ui.internal.parts.BatchTreeEditPart; import eu.geclipse.batch.ui.internal.parts.ComputingElementEditPart; import eu.geclipse.batch.ui.internal.parts.ConnectionEditPart; import eu.geclipse.batch.ui.internal.parts.DiagramEditPart; import eu.geclipse.batch.ui.internal.parts.QueueEditPart; import eu.geclipse.batch.ui.internal.parts.WorkerNodeEditPart; import eu.geclipse.batch.ui.internal.model.ComputingElement; import eu.geclipse.batch.ui.internal.model.Queue; import eu.geclipse.batch.ui.internal.model.WorkerNode; import eu.geclipse.batch.ui.wizards.MoveJobWizard; import eu.geclipse.ui.dialogs.ProblemDialog; import eu.geclipse.ui.comparators.TableColumnComparator; import eu.geclipse.ui.listeners.TableColumnListener; /** * Viewer of Batch jobs that are either placed in a Worker Node, * Computing Element, or Queue. */ public class BatchJobView extends ViewPart implements IContentChangeListener { /** * This internal class is used to present the currently available jobs * in a structured way to the user. The standard presentation uses a table. * * @see JobLabelProvider */ class JobContentProvider implements IStructuredContentProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements( final Object input ) { Object[] resultArray = null; if ( input instanceof Queue ) { Queue q = ( Queue )input; List< IBatchJobInfo > jobs = q.getJobManager().getJobs( q.getQueneName() ); IBatchJobInfo[] jobArray = new IBatchJobInfo[ jobs.size() ]; resultArray = jobs.toArray( jobArray ); } else if ( input instanceof ComputingElement ) { ComputingElement ce = ( ComputingElement ) input; List< IBatchJobInfo > jobs = ce.getJobManager().getJobs( ); IBatchJobInfo[] jobArray = new IBatchJobInfo[ jobs.size() ]; resultArray = jobs.toArray( jobArray ); } else if ( input instanceof WorkerNode ) { WorkerNode wn = ( WorkerNode ) input; List< String > jobIds = wn.getJobIds(); List< IBatchJobInfo > jobs = wn.getJobManager().getJobs(jobIds ); IBatchJobInfo[] jobArray = new IBatchJobInfo[ jobs.size() ]; resultArray = jobs.toArray( jobArray ); } else if ( input instanceof DiagramEditPart || input instanceof ConnectionEditPart ) { IBatchJobInfo[] jobArray = new IBatchJobInfo[ 0 ]; resultArray = jobArray; } return resultArray; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged * (org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput) { // empty implementation /* if ( oldInput instanceof BatchJobManager ) { ( ( BatchJobManager ) oldInput).clear(); } */ } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { // empty implementation } } /** * This internal class is used to present the currently available batch jobs * in a structured way to the user. The standard presentation uses a table. * * @author harald * @see JobContentProvider */ class JobLabelProvider extends LabelProvider implements ITableLabelProvider, ITableFontProvider { /** * The font that is used to draw activated tokens. */ private Font boldFont; /** * Construct and initialize a new label provider. */ public JobLabelProvider() { Font font = JFaceResources.getDefaultFont(); Device device = font.getDevice(); FontData[] fontData = font.getFontData(); for ( int i = 0 ; i < fontData.length ; i++ ) { int style = fontData[i].getStyle(); fontData[i].setStyle( style | SWT.BOLD ); } this.boldFont = new Font( device, fontData ); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.LabelProvider#dispose() */ @Override public void dispose() { super.dispose(); this.boldFont.dispose(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage( final Object element, final int columnIndex ) { // no images supported at the moment return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText( final Object element, final int columnIndex ) { String columnText = element.toString(); if ( element instanceof IBatchJobInfo ) { IBatchJobInfo job = ( IBatchJobInfo ) element; switch ( columnIndex ) { case 0: columnText = job.getJobId(); break; case 1: columnText = job.getJobName(); break; case 2: columnText = job.getQueueName(); break; case 3: columnText = job.getUserAccount(); break; case 4: columnText = job.getTimeUse(); break; case 5: columnText = job.getStatus().toString(); break; default: assert false; } } return columnText; // Just for debugging } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int) */ public Font getFont( final Object element, final int columnIndex ) { Font resultFont = null; if ( element instanceof IBatchJobInfo ) { IBatchJobInfo job = ( IBatchJobInfo ) element; if ( job.getStatus() == IBatchJobInfo.JobState.R ) { resultFont = this.boldFont; } } return resultFont; } } /** * The table used to present the jobs. */ protected Table jobTable; /** * A <code>TableViewer</code> that helps to present the jobs * in a more elegant way. */ protected TableViewer jobList; /** * This is the object that are currently selected and which jobs are listed */ protected BatchJobManager jobManager; /** * Action for deleting jobs. */ private Action deleteAction; /** * Action for moving a job. */ private Action moveAction; /** * Action for refreshing the token list. */ private Action refreshAction; /** * Action for refreshing the token list. */ private Action reRunAction; /** * Action for holding a job. */ private Action holdAction; /** * Action for releasing a job. */ private Action releaseAction; /** * Created the table viewer for batch jobs. * @param parent The composite that will contain the table. */ @Override public void createPartControl( final Composite parent ) { this.jobTable = new Table( parent, SWT.MULTI | SWT.FULL_SELECTION ); this.jobTable.setHeaderVisible( true ); this.jobTable.setLinesVisible( true ); this.jobList = new TableViewer( this.jobTable ); this.jobList.setLabelProvider( new JobLabelProvider() ); this.jobList.setContentProvider( new JobContentProvider() ); TableColumnListener columnListener = new TableColumnListener( this.jobList ); TableColumn idColumn = new TableColumn( this.jobTable, SWT.NONE ); idColumn.setText( Messages.getString( "BatchJobView.JobId" ) ); //$NON-NLS-1$ idColumn.setWidth( 150 ); idColumn.setAlignment( SWT.LEFT ); idColumn.addSelectionListener( columnListener ); TableColumn nameColumn = new TableColumn( this.jobTable, SWT.CENTER ); nameColumn.setText( Messages.getString( "BatchJobView.JobName" ) ); //$NON-NLS-1$ nameColumn.setWidth( 75 ); nameColumn.setAlignment( SWT.CENTER ); nameColumn.addSelectionListener( columnListener ); TableColumn queueColumn = new TableColumn( this.jobTable, SWT.CENTER ); queueColumn.setText( Messages.getString( "BatchJobView.Queue" ) ); //$NON-NLS-1$ queueColumn.setWidth( 150 ); queueColumn.setAlignment( SWT.CENTER ); queueColumn.addSelectionListener( columnListener ); TableColumn userColumn = new TableColumn( this.jobTable, SWT.CENTER ); userColumn.setText( Messages.getString( "BatchJobView.UserAccount" ) ); //$NON-NLS-1$ userColumn.setWidth( 150 ); userColumn.setAlignment( SWT.CENTER ); userColumn.addSelectionListener( columnListener ); TableColumn timeColumn = new TableColumn( this.jobTable, SWT.CENTER ); timeColumn.setText( Messages.getString( "BatchJobView.Time" ) ); //$NON-NLS-1$ timeColumn.setWidth( 75 ); timeColumn.setAlignment( SWT.CENTER ); timeColumn.addSelectionListener( columnListener ); TableColumn statusColumn = new TableColumn( this.jobTable, SWT.CENTER ); statusColumn.setText( Messages.getString( "BatchJobView.Status" ) ); //$NON-NLS-1$ statusColumn.setWidth( 75 ); statusColumn.setAlignment( SWT.CENTER ); statusColumn.addSelectionListener( columnListener ); // Initially we sort the jobs by ID, ascending this.jobTable.setSortColumn( idColumn ); this.jobTable.setSortDirection( SWT.UP ); this.jobList.setComparator( new TableColumnComparator( idColumn ) ); this.jobList.addDoubleClickListener( new IDoubleClickListener() { public void doubleClick( final DoubleClickEvent e ) { showSelectedJobInfo(); } }); this.jobList.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( final SelectionChangedEvent event ) { updateActions(); } }); this.jobTable.addKeyListener( new KeyAdapter() { @Override public void keyPressed( final KeyEvent event ) { if ( event.character == SWT.DEL && event.stateMask == 0 ) { removeSelectedJobs(); } } }); getSite().getWorkbenchWindow().getSelectionService().addSelectionListener( new ISelectionListener() { @SuppressWarnings("unchecked") public void selectionChanged( final IWorkbenchPart part, final ISelection selection ) { if ( selection instanceof StructuredSelection ) { StructuredSelection ss = ( StructuredSelection ) selection; List< StructuredSelection > sList = ss.toList(); //BatchJobManager innerManager = BatchJobManager.getManager(); for ( Iterator<StructuredSelection> iterator = sList.iterator(); iterator.hasNext(); ) { Object obj = iterator.next(); //See if it implements IAdaptable if ( obj instanceof QueueEditPart ) { QueueEditPart qEdit = ( QueueEditPart )obj; Queue q = ( Queue )qEdit.getModel(); if ( null == BatchJobView.this.jobManager ) { BatchJobView.this.jobManager = q.getJobManager(); BatchJobView.this.jobManager.addContentChangeListener( BatchJobView.this ); } BatchJobView.this.jobList.setInput( q ); } else if ( obj instanceof ComputingElementEditPart ) { ComputingElementEditPart ceEdit = ( ComputingElementEditPart )obj; ComputingElement ce = ( ComputingElement )ceEdit.getModel(); if ( null == BatchJobView.this.jobManager ) { BatchJobView.this.jobManager = ce.getJobManager(); BatchJobView.this.jobManager.addContentChangeListener( BatchJobView.this ); } BatchJobView.this.jobList.setInput( ce ); } else if ( obj instanceof WorkerNodeEditPart ) { WorkerNodeEditPart wnEdit = ( WorkerNodeEditPart )obj; WorkerNode wn = ( WorkerNode )wnEdit.getModel(); if ( null == BatchJobView.this.jobManager ) { BatchJobView.this.jobManager = wn.getJobManager(); BatchJobView.this.jobManager.addContentChangeListener( BatchJobView.this ); } BatchJobView.this.jobList.setInput( wn ); } else if ( obj instanceof DiagramEditPart || obj instanceof ConnectionEditPart ) { // clear all the content if ( null != BatchJobView.this.jobManager ) { BatchJobView.this.jobManager.removeContentChangeListener( BatchJobView.this ); BatchJobView.this.jobManager = null; } BatchJobView.this.jobList.setInput( obj ); } else if ( obj instanceof BatchTreeEditPart ) { BatchTreeEditPart treeEdit = ( BatchTreeEditPart )obj; Object obj2 = treeEdit.getModel(); if ( obj2 instanceof ComputingElement ) { ComputingElement ce = ( ComputingElement )obj2; if ( null == BatchJobView.this.jobManager ) { BatchJobView.this.jobManager =ce.getJobManager(); BatchJobView.this.jobManager.addContentChangeListener( BatchJobView.this ); } BatchJobView.this.jobList.setInput( ce ); } else if ( obj2 instanceof Queue ) { Queue q = ( Queue )obj2; if ( null == BatchJobView.this.jobManager ) { BatchJobView.this.jobManager = q.getJobManager(); BatchJobView.this.jobManager.addContentChangeListener( BatchJobView.this ); } BatchJobView.this.jobList.setInput( q ); } else if ( obj2 instanceof WorkerNode ) { WorkerNode wn = ( WorkerNode )obj2; if ( null == BatchJobView.this.jobManager ) { BatchJobView.this.jobManager = wn.getJobManager(); BatchJobView.this.jobManager.addContentChangeListener( BatchJobView.this ); } BatchJobView.this.jobList.setInput( wn ); } } } } } }); createActions(); createToolbar(); createContextMenu(); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#dispose() */ @Override public void dispose() { if ( null != this.jobManager ) { this.jobManager.removeContentChangeListener( this ); this.jobManager = null; } } /* (non-Javadoc) * @see org.eclipse.compare.IContentChangeListener#contentChanged(org.eclipse.compare.IContentChangeNotifier) */ public void contentChanged( final IContentChangeNotifier source ) { getSite().getWorkbenchWindow().getShell().getDisplay().asyncExec( new Runnable() { public void run() { BatchJobView.this.jobList.refresh(); updateActions(); } }); } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { this.jobTable.setFocus(); } /** * Get the currently selected job. If there are more jobs selected get the first * job in the list of selected jobs. * * @return The first job in the list of selected jobs. */ public IBatchJobInfo getSelectedJob() { IBatchJobInfo resultJob = null; IStructuredSelection selection = ( IStructuredSelection ) this.jobList.getSelection(); Object o = selection.getFirstElement(); if ( o instanceof IBatchJobInfo ) { resultJob = ( IBatchJobInfo ) o; } return resultJob; } /** * Get a list of all currently selected tokens. * * @return A list containing all currently selected tokens. */ public List< IBatchJobInfo > getSelectedJobs() { IStructuredSelection selection = ( IStructuredSelection ) this.jobList.getSelection(); List< ? > selectionList = selection.toList(); List< IBatchJobInfo > result = new ArrayList< IBatchJobInfo >(); for( Object element : selectionList ) { if ( element instanceof IBatchJobInfo ) { IBatchJobInfo token = ( IBatchJobInfo ) element; result.add( token ); } } return result; } /** * Removes the selected jobs from the table and deletes them using the batch job manager. * * @see #getSelectedJobs() */ protected void removeSelectedJobs() { List< IBatchJobInfo > jobs = getSelectedJobs(); if ( !jobs.isEmpty() ) { boolean confirm = !MessageDialog.openConfirm( getSite().getShell(), Messages.getString( "BatchJobView.confirm_delete_title" ), //$NON-NLS-1$ Messages.getString( "BatchJobView.confirm_delete_message" ) ); //$NON-NLS-1$ if ( !confirm ) { //BatchJobManager manager = BatchJobManager.getManager(); for ( IBatchJobInfo job : jobs ) { try { if ( null != this.jobManager ) { this.jobManager.deleteJob( job ); this.jobList.refresh(); } } catch( ProblemException excp ) { // Action could not be performed ProblemDialog.openProblem( getSite().getShell(), Messages.getString( "BatchJobView.error_delete_title" ), //$NON-NLS-1$ Messages.getString( "BatchJobView.error_delete_message" ), //$NON-NLS-1$ excp ); } } updateActions(); } } } /** * Changes the state of the job to be held using the batch job manager. * * @see #getSelectedJobs() */ protected void holdSelectedJobs() { List< IBatchJobInfo > jobs = getSelectedJobs(); if ( !jobs.isEmpty() ) { for ( IBatchJobInfo job : jobs ) { try { if ( null != this.jobManager ) { this.jobManager.holdJob( job ); this.jobList.refresh(); } } catch( ProblemException excp ) { // Action could not be performed ProblemDialog.openProblem( getSite().getShell(), Messages.getString( "BatchJobView.error_hold_title" ), //$NON-NLS-1$ Messages.getString( "BatchJobView.error_hold_message" ), //$NON-NLS-1$ excp ); } updateActions(); } } } /** * Changes the state of the job to be held using the batch job manager. * * @see #getSelectedJobs() */ protected void releaseSelectedJobs() { List< IBatchJobInfo > jobs = getSelectedJobs(); if ( !jobs.isEmpty() ) { for ( IBatchJobInfo job : jobs ) { try { if ( null != this.jobManager ) { this.jobManager.releaseJob( job ); this.jobList.refresh(); } } catch( ProblemException excp ) { // Action could not be performed ProblemDialog.openProblem( getSite().getShell(), Messages.getString( "BatchJobView.error_release_title" ), //$NON-NLS-1$ Messages.getString( "BatchJobView.error_release_message" ), //$NON-NLS-1$ excp ); } updateActions(); } } } /** * Moves the selected jobs using the batch job manager to another queue or batch service. * * @see #getSelectedJobs() */ protected void moveSelectedJobs() { List< IBatchJobInfo > jobs = getSelectedJobs(); if ( !jobs.isEmpty() ) { if ( null != this.jobManager ) { MoveJobWizard wizard = new MoveJobWizard( this.jobManager, jobs ); wizard.init( this.getSite().getWorkbenchWindow().getWorkbench(), null ); WizardDialog dialog = new WizardDialog ( this.getSite().getShell(), wizard ); dialog.create(); dialog.open(); } } } /** * Show an info dialog for the currently selected job. * * @see #getSelectedJob() */ protected void showSelectedJobInfo() { IBatchJobInfo job = getSelectedJob(); if ( job != null ) { BatchJobInfoDialog infoDialog = new BatchJobInfoDialog( job, getSite().getShell() ); infoDialog.open(); /* IBatchJobUIFactory factory = AbstractBatchJobUIFactory.findFactory( job ); if ( factory != null ) { BatchJobInfoDialog infoDialog = factory.getInfoDialog( job, getSite().getShell() ); infoDialog.open(); } */ } } /** * Re-run the currently selected job. * * @see #getSelectedJob() */ protected void reRunJobs() { List< IBatchJobInfo > jobs = getSelectedJobs(); if ( !jobs.isEmpty() ) { for ( IBatchJobInfo job : jobs ) { try { if ( null != this.jobManager ) { this.jobManager.reRunJob( job ); //this.jobList.refresh(); } } catch( ProblemException excp ) { // Action could not be performed ProblemDialog.openProblem( getSite().getShell(), Messages.getString( "BatchJobView.error_rerun_title" ), //$NON-NLS-1$ Messages.getString( "BatchJobView.error_rerun_message" ), //$NON-NLS-1$ excp ); } updateActions(); } } } /** * Update the enabled state of the actions according to the current content of this view and * the content's state. */ @SuppressWarnings("null") protected void updateActions() { List< IBatchJobInfo > jobs = getSelectedJobs(); boolean selected = jobs.size() > 0; boolean deletable = true; boolean movable = true; boolean holdable = true; boolean releasable = true; boolean reRunnable = true; for ( IBatchJobInfo job : jobs) { if ( !job.isDeletable() ) deletable = false; if ( !job.isMovable() ) movable = false; if ( !job.isHoldable() ) holdable = false; if ( !job.isReleasable() ) releasable = false; if ( !job.isReRunnable() ) reRunnable = false; } this.deleteAction.setEnabled( selected && deletable ); this.moveAction.setEnabled( selected && movable ); this.holdAction.setEnabled( selected && holdable ); this.releaseAction.setEnabled( selected && releasable ); this.reRunAction.setEnabled( selected && reRunnable ); } /** * Fill the context menu belonging to the token table. * * @param mgr The manager that takes responsible for the context menu. */ protected void fillContextMenu( final IMenuManager mgr ) { if ( this.deleteAction.isEnabled() ) mgr.add( this.deleteAction ); if ( this.moveAction.isEnabled() ) mgr.add( this.moveAction ); if ( this.holdAction.isEnabled() ) mgr.add( this.holdAction ); if ( this.releaseAction.isEnabled() ) mgr.add( this.releaseAction ); if ( this.reRunAction.isEnabled() ) mgr.add( this.reRunAction ); if ( this.refreshAction.isEnabled() ) { mgr.add( new Separator() ); mgr.add( this.refreshAction ); } mgr.add( new GroupMarker( IWorkbenchActionConstants.MB_ADDITIONS ) ); } /** * Create the actions of this view. */ private void createActions() { ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages(); ImageRegistry imgReg = Activator.getDefault().getImageRegistry(); ImageDescriptor deleteImage = sharedImages.getImageDescriptor( ISharedImages.IMG_TOOL_DELETE ); Image image = imgReg.get( Activator.IMG_REFRESH ); ImageDescriptor refreshImage = ImageDescriptor.createFromImage( image ); image = imgReg.get( Activator.IMG_MOVEJOB ); ImageDescriptor moveImage = ImageDescriptor.createFromImage( image ); image = imgReg.get( Activator.IMG_HOLDJOB ); ImageDescriptor holdImage = ImageDescriptor.createFromImage( image ); image = imgReg.get( Activator.IMG_RELEASEJOB ); ImageDescriptor releaseImage = ImageDescriptor.createFromImage( image ); image = imgReg.get( Activator.IMG_BUSY_ARROW2 ); ImageDescriptor reRunImage = ImageDescriptor.createFromImage( image ); this.refreshAction = new Action() { @Override public void run() { BatchJobView.this.jobList.refresh(); } }; this.refreshAction.setText( Messages.getString( "BatchJobView.refresh_text" ) ); //$NON-NLS-1$ this.refreshAction.setToolTipText( Messages.getString( "BatchJobView.refresh_tooltip" ) ); //$NON-NLS-1$ this.refreshAction.setImageDescriptor( refreshImage ); this.deleteAction = new Action() { @Override public void run() { removeSelectedJobs(); } }; this.deleteAction.setText( Messages.getString( "BatchJobView.delete_text" ) ); //$NON-NLS-1$ this.deleteAction.setToolTipText( Messages.getString( "BatchJobView.delete_tooltip" ) ); //$NON-NLS-1$ this.deleteAction.setImageDescriptor( deleteImage ); this.moveAction = new Action() { @Override public void run() { moveSelectedJobs(); } }; this.moveAction.setText( Messages.getString( "BatchJobView.move_text" ) ); //$NON-NLS-1$ this.moveAction.setToolTipText( Messages.getString( "BatchJobView.move_tooltip" ) ); //$NON-NLS-1$ this.moveAction.setImageDescriptor( moveImage ); this.holdAction = new Action() { @Override public void run() { holdSelectedJobs(); } }; this.holdAction.setText( Messages.getString( "BatchJobView.hold_text" ) ); //$NON-NLS-1$ this.holdAction.setToolTipText( Messages.getString( "BatchJobView.hold_tooltip" ) ); //$NON-NLS-1$ this.holdAction.setImageDescriptor( holdImage ); this.releaseAction = new Action() { @Override public void run() { releaseSelectedJobs(); } }; this.releaseAction.setText( Messages.getString( "BatchJobView.release_text" ) ); //$NON-NLS-1$ this.releaseAction.setToolTipText( Messages.getString( "BatchJobView.release_tooltip" ) ); //$NON-NLS-1$ this.releaseAction.setImageDescriptor( releaseImage ); this.reRunAction = new Action() { @Override public void run() { reRunJobs(); } }; this.reRunAction.setText( Messages.getString( "BatchJobView.reRun_text" ) ); //$NON-NLS-1$ this.reRunAction.setToolTipText( Messages.getString( "BatchJobView.reRun_tooltip" ) ); //$NON-NLS-1$ this.reRunAction.setImageDescriptor( reRunImage ); updateActions(); } /** * Create the toolbar of this view. */ private void createToolbar() { IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager(); mgr.add( new Separator() ); mgr.add( this.deleteAction ); mgr.add( this.moveAction ); mgr.add( this.holdAction ); mgr.add( this.releaseAction ); mgr.add( this.reRunAction ); mgr.add( new Separator() ); mgr.add( this.refreshAction ); } /** * Create the context menu for the token table. */ private void createContextMenu() { MenuManager manager = new MenuManager(); manager.setRemoveAllWhenShown( true ); manager.addMenuListener( new IMenuListener() { public void menuAboutToShow( final IMenuManager mgr ) { fillContextMenu( mgr ); } } ); Menu menu = manager.createContextMenu( this.jobTable ); this.jobTable.setMenu(menu); getSite().registerContextMenu( manager, getSite().getSelectionProvider() ); } }