eu.geclipse.ui.views.GridJobView.java Source code

Java tutorial

Introduction

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

Source

/*****************************************************************************
 * Copyright (c) 2006, 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 the
 * g-Eclipse project founded by European Union
 * project number: FP6-IST-034327  http://www.geclipse.eu/
 *
 * Contributors:
 *    Mathias Stuempert - initial API and implementation
 *****************************************************************************/

package eu.geclipse.ui.views;

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.preferences.ScopedPreferenceStore;

import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridConnectionElement;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IGridElementManager;
import eu.geclipse.core.model.IGridJob;
import eu.geclipse.core.model.IGridJobManager;
import eu.geclipse.core.model.IGridJobStatusListener;
import eu.geclipse.ui.decorators.GridJobDecorator;
import eu.geclipse.ui.internal.Activator;
import eu.geclipse.ui.internal.actions.ActionGroupManager;
import eu.geclipse.ui.internal.actions.FilterActions;
import eu.geclipse.ui.internal.actions.JobViewActions;
import eu.geclipse.ui.providers.JobViewLabelProvider;
import eu.geclipse.ui.views.filters.GridFilterConfigurationsManager;
import eu.geclipse.ui.views.filters.IFilterConfigurationListener;
import eu.geclipse.ui.views.filters.IGridFilterConfiguration;
import eu.geclipse.ui.views.filters.JobViewFilterConfiguration;

/**
 * Job view that shows all jobs that are currently managed by the default
 * implementation of the {@link IGridJobManager} interface
 */
public class GridJobView extends ElementManagerViewPart
        implements IGridJobStatusListener, IFilterConfigurationListener {
    private static String XML_MEMENTO_FILTERS = "Filters"; //$NON-NLS-1$
    private static String XML_MEMENTO_COLUMNS = "GridJobViewColumns"; //$NON-NLS-1$
    private static String XML_MEMENTO_COLUMN_WIDTH = "ColumnWidth%d"; //$NON-NLS-1$
    private static String XML_MEMENTO_COLUMN_SORTED = "SortedBy"; //$NON-NLS-1$
    private static String XML_MEMENTO_COLUMN_SORTED_DIRECTON = "SortedDirection"; //$NON-NLS-1$
    private static String PREFERENCE_NAME_FILTERS = "GridJobViewFilters"; //$NON-NLS-1$
    private static String PREFERENCE_NAME_COLUMNS = "GridJobViewColumns"; //$NON-NLS-1$
    JobViewActions jobActions;
    private GridFilterConfigurationsManager filterConfigurationsManager;

    @Override
    public void dispose() {
        GridModel.getJobManager().removeJobStatusListener(this);
        if (this.filterConfigurationsManager != null) {
            this.filterConfigurationsManager.removeConfigurationListener(this);
        }

        savePreferences();

        super.dispose();
    }

    public void statusChanged(final IGridJob job) {
        // method ignored, decorator is refreshed in statusUpdated()
    }

    public void statusUpdated(final IGridJob job) {
        GridJobDecorator decorator = GridJobDecorator.getDecorator();
        if (decorator != null) {
            decorator.refresh(job);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see eu.geclipse.ui.views.GridElementManagerViewPart#getManager()
     */
    @Override
    protected IGridElementManager getManager() {
        return GridModel.getJobManager();
    }

    /*
     * (non-Javadoc)
     * 
     * @see eu.geclipse.ui.views.GridModelViewPart#createLabelProvider()
     */
    @Override
    protected IBaseLabelProvider createLabelProvider() {
        return new JobViewLabelProvider();
    }

    /*
     * (non-Javadoc)
     * 
     * @see eu.geclipse.ui.views.ElementManagerViewPart#createTreeColumns(org.eclipse.swt.widgets.Tree)
     */
    @Override
    protected boolean createTreeColumns(final Tree tree) {
        super.createTreeColumns(tree);
        TreeColumn statusColumn = new TreeColumn(tree, SWT.NONE);
        statusColumn.setText(Messages.getString("GridJobView.status_column")); //$NON-NLS-1$
        statusColumn.setAlignment(SWT.LEFT);
        statusColumn.setWidth(100);
        TreeColumn reasonColumn = new TreeColumn(tree, SWT.NONE);
        reasonColumn.setText(Messages.getString("GridJobView.reason_column")); //$NON-NLS-1$
        reasonColumn.setAlignment(SWT.LEFT);
        reasonColumn.setWidth(100);

        TreeColumn submissionTimeColumn = new TreeColumn(tree, SWT.NONE);
        submissionTimeColumn.setText(Messages.getString("GridJobView.columnSubmitted")); //$NON-NLS-1$
        submissionTimeColumn.setWidth(120);

        TreeColumn lastUpdateColumn = new TreeColumn(tree, SWT.NONE);
        lastUpdateColumn.setText(Messages.getString("GridJobView.last_update_column")); //$NON-NLS-1$
        lastUpdateColumn.setAlignment(SWT.LEFT);
        lastUpdateColumn.setWidth(120);

        TreeColumn idColumn = new TreeColumn(tree, SWT.NONE);
        idColumn.setText(Messages.getString("GridJobView.id_column")); //$NON-NLS-1$
        idColumn.setAlignment(SWT.LEFT);
        idColumn.setWidth(200);

        tree.setSortColumn(submissionTimeColumn);

        return true;
    }

    /*
     * (non-Javadoc)
     * 
     * @see eu.geclipse.ui.views.ElementManagerViewPart#contributeAdditionalActions(eu.geclipse.ui.internal.actions.ActionGroupManager)
     */
    @Override
    protected void contributeAdditionalActions(final ActionGroupManager groups) {
        IWorkbenchSite site = getSite();
        this.jobActions = new JobViewActions(site);
        groups.addGroup(this.jobActions);
        groups.addGroup(new FilterActions(getSite(), this.filterConfigurationsManager));
        super.contributeAdditionalActions(groups);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite,
     *      org.eclipse.ui.IMemento)
     */
    @Override
    public void init(final IViewSite site, final IMemento mem) throws PartInitException {
        super.init(site, mem);
        GridModel.getJobManager().addJobStatusListener(this);

        IPreferenceStore preferenceStore = new ScopedPreferenceStore(new InstanceScope(), "eu.geclipse.core"); //$NON-NLS-1$
        preferenceStore.addPropertyChangeListener(new IPropertyChangeListener() {

            public void propertyChange(final PropertyChangeEvent event) {
                if (GridJobView.this.jobActions != null) {
                    GridJobView.this.jobActions
                            .setJobsUpdateStatus(eu.geclipse.core.Preferences.getUpdateJobsStatus());
                }
            }
        });
    }

    /*
     * (non-Javadoc)
     * 
     * @see eu.geclipse.ui.views.GridModelViewPart#initViewer(org.eclipse.jface.viewers.StructuredViewer)
     */
    @Override
    protected void initViewer(final StructuredViewer sViewer) {
        super.initViewer(sViewer);
        createFilterConfigurationsManager(sViewer);
        readPreferences();
    }

    private void createFilterConfigurationsManager(final StructuredViewer sViewer) {
        this.filterConfigurationsManager = new GridFilterConfigurationsManager(
                GridFilterConfigurationsManager.ID_JOBVIEW) {

            @Override
            public IGridFilterConfiguration createConfiguration(final String name) {
                return new JobViewFilterConfiguration(name);
            }
        };
        this.filterConfigurationsManager.addConfigurationListener(this);
    }

    public void configurationChanged() {
        // ignore changes in configurations
    }

    public void filterConfigurationSelected(final ViewerFilter[] filters) {
        if (this.getViewer() != null) {
            this.getViewer().setFilters(filters);
        }
    }

    private void savePreferences() {
        Preferences preferences = Activator.getDefault().getPluginPreferences();
        saveFilters(preferences);
        Activator.getDefault().savePluginPreferences();
    }

    private void saveFilters(final Preferences preferences) {
        XMLMemento memento = XMLMemento.createWriteRoot(XML_MEMENTO_FILTERS);
        if (this.filterConfigurationsManager != null) {
            this.filterConfigurationsManager.saveState(memento);
        }
        preferences.setValue(PREFERENCE_NAME_FILTERS, getMementoString(memento));
    }

    private String getMementoString(final XMLMemento memento) {
        StringWriter writer = new StringWriter();
        try {
            memento.save(writer);
        } catch (IOException exc) {
            Activator.logException(exc);
        }
        return writer.toString();
    }

    private void readPreferences() {
        Preferences pluginPreferences = Activator.getDefault().getPluginPreferences();
        readFilters(pluginPreferences);
        readColumns(createMemento(pluginPreferences.getString(PREFERENCE_NAME_COLUMNS)));
    }

    private void readFilters(final Preferences preferences) {
        XMLMemento memento = createMemento(preferences.getString(PREFERENCE_NAME_FILTERS));
        if (memento != null) {
            this.filterConfigurationsManager.readState(memento);
        }
    }

    private XMLMemento createMemento(final String string) {
        XMLMemento memento = null;
        if (string != null && string.length() > 0) {
            try {
                memento = XMLMemento.createReadRoot(new StringReader(string));
            } catch (WorkbenchException exception) {
                Activator.logException(exception);
            }
        }
        return memento;
    }

    private void saveColumns(final IMemento parent) {
        IMemento memento = parent.createChild(XML_MEMENTO_COLUMNS);
        TreeViewer vwr = (TreeViewer) getViewer();
        Tree tree = vwr.getTree();
        int colNr = 0, sorted = 0;
        for (TreeColumn column : tree.getColumns()) {
            memento.putInteger(String.format(XML_MEMENTO_COLUMN_WIDTH, Integer.valueOf(colNr)), column.getWidth());
            if (tree.getSortColumn().equals(column)) {
                sorted = colNr;
            }
            colNr++;
        }

        memento.putInteger(XML_MEMENTO_COLUMN_SORTED, sorted);
        memento.putInteger(XML_MEMENTO_COLUMN_SORTED_DIRECTON, tree.getSortDirection());
    }

    private void readColumns(final IMemento parent) {
        int sortedDirection = SWT.DOWN;
        TreeViewer vwr = (TreeViewer) getViewer();
        Tree tree = vwr.getTree();
        TreeColumn sortedColumn = tree.getColumn(5);

        if (parent != null) {
            IMemento memento = parent.getChild(XML_MEMENTO_COLUMNS);

            if (memento != null) {
                int colNr = 0;
                for (TreeColumn column : tree.getColumns()) {
                    Integer width = memento
                            .getInteger(String.format(XML_MEMENTO_COLUMN_WIDTH, Integer.valueOf(colNr)));

                    if (width != null) {
                        column.setWidth(width.intValue());
                    }
                    colNr++;
                }

                Integer sortedColumnInt = memento.getInteger(XML_MEMENTO_COLUMN_SORTED);
                Integer sortDirectionInt = memento.getInteger(XML_MEMENTO_COLUMN_SORTED_DIRECTON);

                if (sortedColumnInt != null && sortDirectionInt != null
                        && sortedColumnInt.intValue() < tree.getColumnCount()) {
                    sortedColumn = tree.getColumn(sortedColumnInt.intValue());
                    sortedDirection = sortDirectionInt.intValue();
                }
            }
        }

        tree.setSortColumn(sortedColumn);
        tree.setSortDirection(sortedDirection);
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.ViewPart#saveState(org.eclipse.ui.IMemento)
     */
    @Override
    public void saveState(final IMemento mem) {
        // eclipse memento is not stored, when view is closed during closing
        // eclipse, so we are using our own memento
        XMLMemento memento = XMLMemento.createWriteRoot(XML_MEMENTO_COLUMNS);
        saveColumns(memento);
        Activator.getDefault().getPluginPreferences().setValue(PREFERENCE_NAME_COLUMNS, getMementoString(memento));

        super.saveState(mem);
    }

    @Override
    public boolean isDragSource(final IGridElement element) {
        return element instanceof IGridConnectionElement;
    }

}