sernet.verinice.bpm.rcp.TaskView.java Source code

Java tutorial

Introduction

Here is the source code for sernet.verinice.bpm.rcp.TaskView.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Daniel Murygin.
 *
 * This program is free software: you can redistribute it and/or 
 * modify it under the terms of the GNU Lesser General Public License 
 * as published by the Free Software Foundation, either version 3 
 * of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,    
 * but WITHOUT ANY WARRANTY; without even the implied warranty 
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 * See the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program. 
 * If not, see <http://www.gnu.org/licenses/>.
 * 
 * Contributors:
 *     Daniel Murygin <dm[at]sernet[dot]de> - initial API and implementation
 ******************************************************************************/
package sernet.verinice.bpm.rcp;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;

import sernet.gs.service.NumericStringComparator;
import sernet.gs.service.RetrieveInfo;
import sernet.gs.ui.rcp.main.Activator;
import sernet.gs.ui.rcp.main.ComboModelNumericStringComparator;
import sernet.gs.ui.rcp.main.ExceptionUtil;
import sernet.gs.ui.rcp.main.ImageCache;
import sernet.gs.ui.rcp.main.bsi.editors.EditorFactory;
import sernet.gs.ui.rcp.main.bsi.views.HtmlWriter;
import sernet.gs.ui.rcp.main.preferences.PreferenceConstants;
import sernet.gs.ui.rcp.main.service.ServiceFactory;
import sernet.hui.common.VeriniceContext;
import sernet.springclient.RightsServiceClient;
import sernet.verinice.bpm.TaskLoader;
import sernet.verinice.interfaces.ActionRightIDs;
import sernet.verinice.interfaces.ICommandService;
import sernet.verinice.interfaces.IInternalServerStartListener;
import sernet.verinice.interfaces.InternalServerEvent;
import sernet.verinice.interfaces.bpm.ITask;
import sernet.verinice.interfaces.bpm.ITaskListener;
import sernet.verinice.interfaces.bpm.ITaskService;
import sernet.verinice.interfaces.bpm.KeyMessage;
import sernet.verinice.interfaces.bpm.KeyValue;
import sernet.verinice.iso27k.rcp.ComboModel;
import sernet.verinice.iso27k.rcp.IComboModelLabelProvider;
import sernet.verinice.iso27k.rcp.Iso27kPerspective;
import sernet.verinice.iso27k.rcp.RegexComboModelFilter;
import sernet.verinice.model.bpm.TaskInformation;
import sernet.verinice.model.common.CnATreeElement;
import sernet.verinice.model.common.PersonAdapter;
import sernet.verinice.model.common.configuration.Configuration;
import sernet.verinice.rcp.IAttachedToPerspective;
import sernet.verinice.rcp.InfoDialogWithShowToggle;
import sernet.verinice.rcp.RightsEnabledView;
import sernet.verinice.rcp.TextEventAdapter;
import sernet.verinice.service.commands.LoadAncestors;

/**
 * RCP view to show task loaded by instances of {@link ITaskService}.
 * 
 * New tasks are loaded by a {@link ITaskListener} registered at
 * {@link TaskLoader}.
 * 
 * Double clicking a task opens {@link CnATreeElement} in an editor. View
 * toolbar provides a button to complete tasks.
 * 
 * @see TaskViewDataLoader
 * @author Daniel Murygin <dm[at]sernet[dot]de>
 */
public class TaskView extends RightsEnabledView implements IAttachedToPerspective, IPartListener2 {

    private static final Logger LOG = Logger.getLogger(TaskView.class);
    static final NumericStringComparator NSC = new NumericStringComparator();

    static final ComboModelNumericStringComparator<CnATreeElement> COMPARATOR_CNA_TREE_ELEMENT = new ComboModelNumericStringComparator<CnATreeElement>();
    static final ComboModelNumericStringComparator<Configuration> COMPARATOR_CONFIGURATION = new ComboModelNumericStringComparator<Configuration>();
    static final ComboModelNumericStringComparator<KeyMessage> COMPARATOR_KEY_MESSAGE = new ComboModelNumericStringComparator<KeyMessage>();

    public static final String ID = "sernet.verinice.bpm.rcp.TaskView"; //$NON-NLS-1$

    private static final int WEIGHT_40 = 40;
    private static final int WEIGHT_60 = 60;
    private static final int COMBO_WIDTH = 140;
    private static final int WIDTH_SEARCH_FORM = 1060;
    private static final int HEIGHT_SEARCH_FORM = 60;

    CnATreeElement selectedScope;
    CnATreeElement selectedAudit;
    String selectedAssignee;
    KeyMessage selectedProcessType;
    KeyMessage selectedTaskType;

    private TableViewer tableViewer;
    private TaskTableSorter tableSorter = new TaskTableSorter();
    private TaskLabelProvider labelProvider;
    private TaskContentProvider contentProvider;
    private Listener collapseAndExpandListener = new TableCollapseAndExpandListener();
    private Browser textPanel;
    private Label labelDateFrom;
    private Label labelDateUntil;
    Date dueDateFrom = null;
    Date dueDateTo = null;
    Button searchButton;

    private TaskViewDataLoader dataLoader;

    ComboModel<CnATreeElement> comboModelScope;
    Combo comboScope;
    RegexComboModelFilter filterScope;
    ComboModel<CnATreeElement> comboModelAudit;
    Combo comboAudit;
    ComboModel<Configuration> comboModelAccount;
    Combo comboAccount;

    ComboModel<KeyMessage> comboModelProcessType;
    Combo comboProcessType;
    ComboModelTaskType comboModelTaskType;
    Combo comboTaskType;

    DateTime dateTimeFrom;
    Button disableDateButtonFrom;
    DateTime dateTimeUntil;
    Button disableDateButtonTo;

    private Action doubleClickAction;
    private Action cancelTaskAction;

    private ICommandService commandService;
    private RightsServiceClient rightsService;
    private ITaskListener taskListener;

    public TaskView() {
        super();
        dataLoader = new TaskViewDataLoader(this);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * sernet.verinice.rcp.RightsEnabledView#createPartControl(org.eclipse.swt
     * .widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        try {
            super.createPartControl(parent);
            initView(parent);
        } catch (Exception e) {
            LOG.error("Error while creating task view.", e); //$NON-NLS-1$
            ExceptionUtil.log(e, Messages.TaskView_5);
        }
    }

    private void initView(Composite parent) {
        createRootComposite(parent);
        dataLoader.initData();
        makeActions();
        addActions();
        addListener();
    }

    public void loadTasks() {
        dataLoader.loadTasks();
    }

    private void createRootComposite(Composite parent) {
        Composite rootComposite = CompositeCreator.create1ColumnComposite(parent);
        Composite topComposite = CompositeCreator.create2ColumnComposite(rootComposite);

        createSearchComposite(topComposite);

        SashForm splitComposite = CompositeCreator.createSplitComposite(rootComposite, SWT.VERTICAL);
        createInfoComposite(splitComposite);
        createTableComposite(splitComposite);
        splitComposite.setWeights(new int[] { WEIGHT_40, WEIGHT_60 });
    }

    private void createSearchComposite(Composite composite) {
        ScrolledComposite scrolledComposite = CompositeCreator.createScrolledComposite(composite);

        Composite formComposite = createSearchFormComposite(scrolledComposite);

        scrolledComposite.setContent(formComposite);
        scrolledComposite.setVisible(true);
        scrolledComposite.setMinSize(WIDTH_SEARCH_FORM, HEIGHT_SEARCH_FORM);

        createLoadButtonComposite(composite);
    }

    private void createLoadButtonComposite(Composite parent) {
        // Load button
        Composite buttonComposite = CompositeCreator.create1ColumnComposite(parent, false, true);
        // create a dummy label
        new Label(buttonComposite, SWT.WRAP);
        createButtonControls(buttonComposite);
        buttonComposite.pack();
    }

    private Composite createSearchFormComposite(Composite parent) {
        Composite formComposite = createInnerFormComposite(parent);

        // Scope filter
        Label label = new Label(formComposite, SWT.WRAP);
        label.setText(Messages.TaskView_11);
        setLayoutData(label, 50, false);
        // Scope
        label = new Label(formComposite, SWT.WRAP);
        label.setText(""); //$NON-NLS-1$
        setLayoutData(label, true);
        // Audit
        label = new Label(formComposite, SWT.WRAP);
        label.setText(Messages.TaskView_22);
        setLayoutData(label, true);
        // Assignee
        label = new Label(formComposite, SWT.WRAP);
        label.setText(Messages.TaskView_12);
        setLayoutData(label, true);
        // Process
        label = new Label(formComposite, SWT.WRAP);
        label.setText(Messages.TaskView_13);
        setLayoutData(label, true);
        // Task type
        label = new Label(formComposite, SWT.WRAP);
        label.setText(Messages.TaskView_14);
        setLayoutData(label, false);
        // Due date
        labelDateFrom = new Label(formComposite, SWT.WRAP);
        labelDateFrom.setText(Messages.TaskView_18);
        labelDateUntil = new Label(formComposite, SWT.WRAP);
        labelDateUntil.setText(Messages.TaskView_1);

        // Group
        createGroupControls(formComposite);
        // Assignee
        createAssigneeControls(formComposite);
        // Process
        createProcessTypeControls(formComposite);
        // Task type
        createTaskTypeControls(formComposite);
        // Due date
        createDateFromControls(formComposite);
        createDateToControls(formComposite);
        return formComposite;
    }

    private void setLayoutData(Label label, boolean grabExcessHorizontalSpace) {
        setLayoutData(label, COMBO_WIDTH, grabExcessHorizontalSpace);
    }

    private void setLayoutData(Label label, int minimumWidth, boolean grabExcessHorizontalSpace) {
        GridData gridData = new GridData();
        gridData.minimumWidth = minimumWidth;
        gridData.grabExcessHorizontalSpace = grabExcessHorizontalSpace;
        label.setLayoutData(gridData);
    }

    public static Composite createInnerFormComposite(Composite parentComposite) {
        Composite composite = new Composite(parentComposite, SWT.NONE);
        GridData gridData = new GridData(SWT.FILL, SWT.NONE, true, false);
        composite.setLayoutData(gridData);
        GridLayout gridLayout = new GridLayout(8, false);
        gridLayout.marginHeight = 4;
        gridLayout.marginWidth = 4;
        composite.setLayout(gridLayout);
        return composite;
    }

    private void createTableComposite(Composite parent) {
        this.tableViewer = new TableViewer(parent,
                SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
        final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        this.tableViewer.getControl().setLayoutData(gridData);
        this.tableViewer.setUseHashlookup(true);

        getTable().setHeaderVisible(true);
        getTable().setLinesVisible(true);

        createTableColumn(null, 0);
        createTableColumn(Messages.TaskView_9, 1);
        createTableColumn(Messages.TaskView_10, 2);
        createTableColumn(Messages.TaskView_4, 3);
        createTableColumn(Messages.TaskViewColumn_1, 4);
        createTableColumn(Messages.TaskViewColumn_2, 5);
        createTableColumn(Messages.TaskViewColumn_3, 6);

        // set initial column widths
        TableLayout layout = new TableLayout();
        layout.addColumnData(new ColumnWeightData(22, 22, false));
        layout.addColumnData(new ColumnWeightData(192, 192, true));
        layout.addColumnData(new ColumnWeightData(350, 350, true));
        layout.addColumnData(new ColumnWeightData(130, 130, true));
        layout.addColumnData(new ColumnWeightData(110, 110, true));
        layout.addColumnData(new ColumnWeightData(120, 120, true));
        layout.addColumnData(new ColumnWeightData(76, 76, true));

        getTable().setLayout(layout);

        for (TableColumn tc : getTable().getColumns()) {
            tc.pack();
        }

        getTable().addListener(SWT.Expand, collapseAndExpandListener);
        getTable().addListener(SWT.Collapse, collapseAndExpandListener);

        this.contentProvider = new TaskContentProvider(tableViewer);
        this.tableViewer.setContentProvider(this.contentProvider);
        this.labelProvider = new TaskLabelProvider();
        this.tableViewer.setLabelProvider(labelProvider);
        this.tableViewer.setSorter(tableSorter);
    }

    private void createInfoComposite(Composite container) {
        final int gridDataHeight = 80;
        textPanel = new Browser(container, SWT.NONE);
        textPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
        final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.heightHint = gridDataHeight;
        textPanel.setLayoutData(gridData);
    }

    private void createGroupControls(Composite searchComposite) {
        final Text textFilterScope = new Text(searchComposite, SWT.BORDER);
        textFilterScope.setToolTipText(Messages.TaskView_26);
        textFilterScope.addKeyListener(new TextEventAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                filterScope.setFilter(textFilterScope.getText());
                dataLoader.refreshScopes();
                dataLoader.loadAudits();
            }
        });

        comboModelScope = new ComboModel<CnATreeElement>(new GroupLabelProvider());
        filterScope = new RegexComboModelFilter();
        comboModelScope.setFilter(filterScope);
        comboScope = createComboBox(searchComposite);
        comboScope.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comboModelScope.setSelectedIndex(comboScope.getSelectionIndex());
                selectedScope = comboModelScope.getSelectedObject();
                selectedAudit = null;
                dataLoader.loadAudits();
            }
        });
        comboModelAudit = new ComboModel<CnATreeElement>(new GroupLabelProvider());
        comboAudit = createComboBox(searchComposite);
        comboAudit.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comboModelAudit.setSelectedIndex(comboAudit.getSelectionIndex());
                selectedAudit = comboModelAudit.getSelectedObject();
            }
        });
    }

    private void createAssigneeControls(Composite searchComposite) {
        comboModelAccount = new ComboModel<Configuration>(new IComboModelLabelProvider<Configuration>() {
            @Override
            public String getLabel(Configuration account) {
                StringBuilder sb = new StringBuilder(PersonAdapter.getFullName(account.getPerson()));
                sb.append(" [").append(account.getUser()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
                return sb.toString();
            }
        });
        comboAccount = createComboBox(searchComposite);
        comboAccount.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comboModelAccount.setSelectedIndex(comboAccount.getSelectionIndex());
                Configuration account = comboModelAccount.getSelectedObject();
                if (account != null) {
                    selectedAssignee = account.getUser();
                } else {
                    selectedAssignee = null;
                }
            }
        });
    }

    private void createProcessTypeControls(Composite searchComposite) {
        comboModelProcessType = new ComboModel<KeyMessage>(new IComboModelLabelProvider<KeyMessage>() {
            @Override
            public String getLabel(KeyMessage object) {
                return object.getValue();
            }
        });
        comboProcessType = createComboBox(searchComposite);
        comboProcessType.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comboModelProcessType.setSelectedIndex(comboProcessType.getSelectionIndex());
                selectedProcessType = comboModelProcessType.getSelectedObject();
            }
        });
    }

    private void createTaskTypeControls(Composite searchComposite) {
        comboModelTaskType = new ComboModelTaskType();
        comboTaskType = createComboBox(searchComposite);
        comboTaskType.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                comboModelTaskType.setSelectedIndex(comboTaskType.getSelectionIndex());
                selectedTaskType = comboModelTaskType.getSelectedObject();
            }
        });
    }

    private void createDateFromControls(Composite searchComposite) {
        GridData gridData = new GridData(SWT.LEFT, SWT.LEFT, false, false);
        Composite dateFromComposite = CompositeCreator.create2ColumnComposite(searchComposite, gridData);
        dateTimeFrom = new DateTime(dateFromComposite, SWT.DATE | SWT.DROP_DOWN);
        dateTimeFrom.setEnabled(false);
        labelDateFrom.setEnabled(false);
        dateTimeFrom.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dueDateFrom = extractDateFrom(dateTimeFrom);
                dueDateTo = extractDateTo(dateTimeFrom);
            }
        });

        disableDateButtonFrom = new Button(dateFromComposite, SWT.CHECK);
        disableDateButtonFrom.setSelection(false);
        disableDateButtonFrom.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                dateTimeFrom.setEnabled(!dateTimeFrom.isEnabled());
                labelDateFrom.setEnabled(dateTimeFrom.isEnabled());
                disableDateButtonFrom.setSelection(dateTimeFrom.isEnabled());
                setDuedateFromLabel();
                extractDates();
            }
        });
        dateFromComposite.pack();
    }

    private void createDateToControls(Composite searchComposite) {
        GridData gridData = new GridData(SWT.LEFT, SWT.LEFT, false, false);
        Composite dateToComposite = CompositeCreator.create2ColumnComposite(searchComposite, gridData);
        dateTimeUntil = new DateTime(dateToComposite, SWT.DATE | SWT.DROP_DOWN);
        dateTimeUntil.setEnabled(false);
        labelDateUntil.setEnabled(false);
        dateTimeUntil.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                dueDateTo = extractDateTo(dateTimeUntil);
            }
        });
        disableDateButtonTo = new Button(dateToComposite, SWT.CHECK);
        disableDateButtonTo.setSelection(false);
        disableDateButtonTo.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                dateTimeUntil.setEnabled(!dateTimeUntil.isEnabled());
                labelDateUntil.setEnabled(dateTimeUntil.isEnabled());
                disableDateButtonTo.setSelection(dateTimeUntil.isEnabled());
                setDuedateFromLabel();
                extractDates();
            }
        });
        dateToComposite.pack();
    }

    private void setDuedateFromLabel() {
        if (disableDateButtonTo.getSelection()) {
            labelDateFrom.setText(Messages.TaskView_18);
        } else {
            labelDateFrom.setText(Messages.TaskView_16);
        }
    }

    private void extractDates() {
        if (!dateTimeFrom.isEnabled()) {
            dueDateFrom = null;
            dueDateTo = null;
        } else {
            dueDateFrom = extractDateFrom(dateTimeFrom);
            if (!dateTimeUntil.isEnabled()) {
                dueDateTo = extractDateTo(dateTimeFrom);
            } else {
                dueDateTo = extractDateTo(dateTimeUntil);
            }
        }
    }

    private void createButtonControls(Composite searchComposite) {
        searchButton = new Button(searchComposite, SWT.NONE);
        searchButton.setText(Messages.TaskView_17);
        searchButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                dataLoader.loadTasks();
            }
        });
    }

    private Date extractDateFrom(DateTime dueDate) {
        Calendar cal = getDateWithoutTime(dueDate);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return cal.getTime();
    }

    private Date extractDateTo(DateTime dueDate) {
        Calendar cal = getDateWithoutTime(dueDate);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    }

    private Calendar getDateWithoutTime(DateTime dueDate) {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, dueDate.getYear());
        cal.set(Calendar.MONTH, dueDate.getMonth());
        cal.set(Calendar.DATE, dueDate.getDay());
        return cal;
    }

    private void makeActions() {
        doubleClickAction = new Action() {
            @Override
            public void run() {
                if (getViewer().getSelection() instanceof IStructuredSelection
                        && ((IStructuredSelection) getViewer().getSelection())
                                .getFirstElement() instanceof TaskInformation) {
                    try {
                        TaskInformation task = (TaskInformation) ((IStructuredSelection) getViewer().getSelection())
                                .getFirstElement();
                        RetrieveInfo ri = RetrieveInfo.getPropertyInstance();
                        LoadAncestors loadControl = new LoadAncestors(task.getElementType(), task.getUuid(), ri);
                        loadControl = getCommandService().executeCommand(loadControl);
                        if (loadControl.getElement() != null) {
                            EditorFactory.getInstance().updateAndOpenObject(loadControl.getElement());
                        } else {
                            showError("Error", Messages.TaskView_25); //$NON-NLS-1$
                        }
                    } catch (Exception t) {
                        LOG.error("Error while opening control.", t); //$NON-NLS-1$
                    }
                }
            }
        };

        cancelTaskAction = new Action(Messages.ButtonCancel, SWT.TOGGLE) {
            @Override
            public void run() {
                try {
                    cancelTask();
                    this.setChecked(false);
                } catch (Exception e) {
                    LOG.error("Error while canceling task.", e); //$NON-NLS-1$
                    showError(Messages.TaskView_6, Messages.TaskView_7);
                }
            }
        };
        cancelTaskAction.setEnabled(false);
        cancelTaskAction.setImageDescriptor(
                ImageCache.getInstance().getImageDescriptor(ImageCache.MASSNAHMEN_UMSETZUNG_NEIN));

        if (Activator.getDefault().isStandalone() && !Activator.getDefault().getInternalServer().isRunning()) {
            IInternalServerStartListener listener = new IInternalServerStartListener() {
                @Override
                public void statusChanged(InternalServerEvent e) {
                    if (e.isStarted()) {
                        configureActions();
                    }
                }
            };
            Activator.getDefault().getInternalServer().addInternalServerStatusListener(listener);
        } else {
            configureActions();
        }
    }

    private void configureActions() {
        cancelTaskAction.setEnabled(getRightsService().isEnabled(ActionRightIDs.TASKDELETE));
        boolean taskShowAllEnabled = getRightsService().isEnabled(ActionRightIDs.TASKSHOWALL);
        comboAccount.setEnabled(taskShowAllEnabled);
    }

    private void addActions() {
        addToolBarActions();
        getViewer().addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                doubleClickAction.run();
            }
        });
    }

    private void addToolBarActions() {
        IActionBars bars = getViewSite().getActionBars();
        IToolBarManager manager = bars.getToolBarManager();
        // Dummy action to force displaying the toolbar in a new line
        Action dummyAction = new Action() {
        };
        dummyAction.setText(" "); //$NON-NLS-1$
        dummyAction.setEnabled(false);
        ActionContributionItem item = new ActionContributionItem(dummyAction);
        item.setMode(ActionContributionItem.MODE_FORCE_TEXT);
        manager.add(item);
        manager.add(cancelTaskAction);
    }

    private void addListener() {
        taskListener = new ITaskListener() {
            @Override
            public void newTasks(List<ITask> taskList) {
                addTasks(taskList);
            }

            @Override
            public void newTasks() {
                Display.getDefault().syncExec(new Runnable() {
                    @Override
                    public void run() {
                        dataLoader.loadTasks();
                    }
                });
            }
        };
        TaskChangeRegistry.addTaskChangeListener(taskListener);
        tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                if (isTaskSelected()) {
                    try {
                        selectTask();
                    } catch (Exception t) {
                        LOG.error("Error while configuring task actions.", t); //$NON-NLS-1$
                    }
                } else {
                    resetToolbar();
                    getInfoPanel().setText(""); //$NON-NLS-1$
                }
                getViewSite().getActionBars().updateActionBars();
            }

            private boolean isTaskSelected() {
                return getViewer().getSelection() instanceof IStructuredSelection
                        && ((IStructuredSelection) getViewer().getSelection())
                                .getFirstElement() instanceof TaskInformation;
            }
        });
        // First we create a menu Manager
        MenuManager menuManager = new MenuManager();
        Menu menu = menuManager.createContextMenu(tableViewer.getTable());
        // Set the MenuManager
        tableViewer.getTable().setMenu(menu);
        getSite().registerContextMenu(menuManager, tableViewer);
        // Make the selection available
        getSite().setSelectionProvider(tableViewer);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    @Override
    public void dispose() {
        TaskChangeRegistry.removeTaskChangeListener(taskListener);
        dataLoader.dispose();
        contentProvider.dispose();
        super.dispose();
    }

    private void selectTask() {
        IToolBarManager manager = resetToolbar();

        cancelTaskAction.setEnabled(false);
        cancelTaskAction.setEnabled(getRightsService().isEnabled(ActionRightIDs.TASKDELETE));
        TaskInformation task = (TaskInformation) ((IStructuredSelection) getViewer().getSelection())
                .getFirstElement();
        getInfoPanel().setText(HtmlWriter.getPage(task.getDescription()));

        List<KeyValue> outcomeList = task.getOutcomes();
        for (KeyValue keyValue : outcomeList) {
            CompleteTaskAction completeAction = new CompleteTaskAction(this, keyValue.getKey());
            completeAction.setText(keyValue.getValue());
            completeAction.setImageDescriptor(
                    ImageCache.getInstance().getImageDescriptor(ImageCache.MASSNAHMEN_UMSETZUNG_JA));
            ActionContributionItem item = new ActionContributionItem(completeAction);

            item.setMode(ActionContributionItem.MODE_FORCE_TEXT);
            manager.add(item);
        }
    }

    private IToolBarManager resetToolbar() {
        IToolBarManager manager = getViewSite().getActionBars().getToolBarManager();
        manager.removeAll();

        addToolBarActions();
        return manager;
    }

    /**
     * @param taskList
     */
    protected void addTasks(List<ITask> taskList) {
        final List<ITask> newList;
        if (taskList == null || taskList.isEmpty()) {
            newList = new LinkedList<ITask>();
        } else {
            newList = taskList;
        }
        List<ITask> currentTaskList = (List<ITask>) getViewer().getInput();
        if (currentTaskList != null) {
            for (ITask task : currentTaskList) {
                if (!newList.contains(task)) {
                    newList.add(task);
                }
            }
        }
        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                getViewer().setInput(newList);
            }
        });
    }

    private void cancelTask() throws InvocationTargetException, InterruptedException {
        IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
        final List<TaskInformation> taskList = getSelectedTasks();
        if (!taskList.isEmpty() && MessageDialog.openConfirm(getShell(), Messages.ConfirmTaskDelete_0,
                Messages.bind(Messages.ConfirmTaskDelete_1, taskList.size()))) {
            progressService.run(true, true, new IRunnableWithProgress() {
                @Override
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    Activator.inheritVeriniceContextState();
                    for (TaskInformation task : taskList) {
                        ServiceFactory.lookupTaskService().cancelTask(task.getId());
                        TaskView.this.contentProvider.removeTask(task);
                    }
                }
            });
            getInfoPanel().setText(""); //$NON-NLS-1$
            showInformation(Messages.TaskView_0, NLS.bind(Messages.TaskView_8, taskList.size()));
        }
    }

    protected List<TaskInformation> getSelectedTasks() {
        final StructuredSelection selection = (StructuredSelection) getViewer().getSelection();
        List<TaskInformation> taskList = new ArrayList<TaskInformation>(selection.size());
        for (Iterator<Object> iterator = selection.iterator(); iterator.hasNext();) {
            Object sel = iterator.next();
            if (sel instanceof TaskInformation) {
                taskList.add((TaskInformation) sel);
            }
        }
        return taskList;
    }

    public void removeTask(ITask task) {
        contentProvider.removeTask(task);
    }

    private Combo createComboBox(Composite composite) {
        Combo combo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
        combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        return combo;
    }

    private void createTableColumn(String label, int columnIndex) {
        TableColumn column;
        column = new TableColumn(getTable(), SWT.LEFT);
        if (label != null) {
            column.setText(label);
        }
        column.addSelectionListener(new TaskSortSelectionAdapter(this, column, columnIndex));
    }

    protected TableViewer getViewer() {
        return tableViewer;
    }

    protected TaskTableSorter getTableSorter() {
        return tableSorter;
    }

    Browser getInfoPanel() {
        return textPanel;
    }

    private Table getTable() {
        return this.tableViewer.getTable();
    }

    protected void showError(final String title, final String message) {
        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                MessageDialog.openError(getShell(), title, message);
            }
        });
    }

    protected void showInformation(final String title, final String message) {
        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                InfoDialogWithShowToggle.openInformation(title, message, Messages.TaskView_30,
                        PreferenceConstants.INFO_TASKS_COMPLETED);
            }
        });
    }

    static Display getDisplay() {
        Display display = Display.getCurrent();
        // may be null if outside the UI thread
        if (display == null) {
            display = Display.getDefault();
        }
        return display;
    }

    private static Shell getShell() {
        return getDisplay().getActiveShell();
    }

    public ICommandService getCommandService() {
        if (commandService == null) {
            commandService = ServiceFactory.lookupCommandService();
        }
        return commandService;
    }

    public RightsServiceClient getRightsService() {
        if (rightsService == null) {
            rightsService = (RightsServiceClient) VeriniceContext.get(VeriniceContext.RIGHTS_SERVICE);
        }
        return rightsService;
    }

    /*
     * (non-Javadoc)
     * 
     * @see sernet.verinice.rcp.RightsEnabledView#setFocus()
     */
    @Override
    public void setFocus() {
        // empty
    }

    /*
     * (non-Javadoc)
     * 
     * @see sernet.verinice.rcp.IAttachedToPerspective#getPerspectiveId()
     */
    public String getPerspectiveId() {
        return Iso27kPerspective.ID;
    }

    /*
     * (non-Javadoc)
     * 
     * @see sernet.verinice.rcp.RightsEnabledView#getRightID()
     */
    @Override
    public String getRightID() {
        return ActionRightIDs.TASKVIEW;
    }

    /*
     * (non-Javadoc)
     * 
     * @see sernet.verinice.rcp.RightsEnabledView#getViewId()
     */
    @Override
    public String getViewId() {
        return ID;
    }

}