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