eu.geclipse.batch.ui.views.BatchJobView.java Source code

Java tutorial

Introduction

Here is the source code for eu.geclipse.batch.ui.views.BatchJobView.java

Source

/******************************************************************************
 * 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());
    }
}