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