/******************************************************************************
* Copyright (c) 2007-2008 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):
* PSNC:
* - Katarzyna Bylec (katis@man.poznan.pl)
* - Szymon Mueller
*****************************************************************************/
package eu.geclipse.servicejob.ui.views;
import java.net.URL;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.model.IGridElementManager;
import eu.geclipse.core.model.IGridModelEvent;
import eu.geclipse.core.model.IServiceJob;
import eu.geclipse.core.model.IServiceJobStatusListener;
import eu.geclipse.servicejob.ui.Activator;
import eu.geclipse.servicejob.ui.actions.OpenServiceJobDialogAction;
import eu.geclipse.servicejob.ui.providers.ServiceJobContentProvider;
import eu.geclipse.servicejob.ui.providers.ServiceJobLabelProvider;
import eu.geclipse.servicejob.ui.wizard.JobSubmissionServiceWizard;
import eu.geclipse.ui.views.ElementManagerViewPart;
/**
* View responsible for displaying managed Operator's Jobs.
*/
public class ServiceJobView extends ElementManagerViewPart
implements IServiceJobStatusListener, ISelectionProvider,
ISelectionChangedListener
{
boolean refreshedFirstTime;
private OpenServiceJobDialogAction wizardAction;
private StructuredViewer myViewer;
private Action runJobAction;
@Override
protected IGridElementManager getManager() {
return GridModel.getServiceJobManager();
}
@Override
protected boolean createTreeColumns( final Tree tree ) {
TreeColumn nameColumn = new TreeColumn( tree, SWT.NONE );
nameColumn.setText( "Name" ); //$NON-NLS-1$
nameColumn.setAlignment( SWT.LEFT );
nameColumn.setWidth( 160 );
TreeColumn projectColumn = new TreeColumn( tree, SWT.NONE );
projectColumn.setText( "Project" ); //$NON-NLS-1$
projectColumn.setAlignment( SWT.LEFT );
projectColumn.setWidth( 100 );
TreeColumn statusColumn = new TreeColumn( tree, SWT.NONE );
statusColumn.setText( Messages.getString( "ServiceJobsView.status" ) ); //$NON-NLS-1$
statusColumn.setAlignment( SWT.LEFT );
statusColumn.setWidth( 130 );
TreeColumn dateColumn = new TreeColumn( tree, SWT.NONE );
dateColumn.setText( Messages.getString( "ServiceJobsView.operator_job_date" ) ); //$NON-NLS-1$
dateColumn.setAlignment( SWT.LEFT );
dateColumn.setWidth( 130 );
TreeColumn typeColumn = new TreeColumn( tree, SWT.NONE );
typeColumn.setText( Messages.getString( "ServiceJobsView.type" ) ); //$NON-NLS-1$
typeColumn.setAlignment( SWT.LEFT );
typeColumn.setWidth( 60 );
return true;
}
@Override
public void gridModelChanged( final IGridModelEvent event ) {
super.gridModelChanged( event );
if( event.getType() == IGridModelEvent.ELEMENTS_CHANGED
|| event.getType() == IGridModelEvent.ELEMENTS_ADDED
|| event.getType() == IGridModelEvent.ELEMENTS_REMOVED )
{
IGridElement[] removedElements = event.getElements();
Control control = getViewer().getControl();
for( IGridElement elem : removedElements ) {
if( elem instanceof IServiceJob ) {
if( !control.isDisposed() ) {
Display display = control.getDisplay();
display.asyncExec( new Runnable() {
public void run() {
if( ServiceJobView.this.refreshedFirstTime ) {
ServiceJobView.this.getViewer().refresh( true );
ServiceJobView.this.refreshedFirstTime = false;
}
ServiceJobView.this.getViewer().refresh( true );
}
} );
refreshViewer();
}
}
}
}
}
@Override
protected IBaseLabelProvider createLabelProvider() {
return new ServiceJobLabelProvider();
// return super.createLabelProvider();
}
@Override
protected IContentProvider createContentProvider() {
return new ServiceJobContentProvider();
}
@Override
public void init( final IViewSite site ) throws PartInitException {
super.init( site );
GridModel.getServiceJobManager().addServiceJobStatusListener( this );
addSelectionChangedListener( this );
}
@Override
protected void initViewer( final StructuredViewer viewer ) {
super.initViewer( viewer );
this.myViewer = viewer;
this.myViewer.addSelectionChangedListener( this );
}
@Override
public void createPartControl( final Composite parent ) {
super.createPartControl( parent );
createButtons();
createMenu();
getSite().setSelectionProvider( this.myViewer );
this.refreshedFirstTime = true;
}
private void createButtons() {
IToolBarManager mgr = getViewSite().getActionBars().getToolBarManager();
this.wizardAction = new OpenServiceJobDialogAction();
this.wizardAction.setToolTipText( Messages.getString( "ServiceJobsView.new_operators_job_wizard" ) ); //$NON-NLS-1$
ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
this.wizardAction.setImageDescriptor( sharedImages.getImageDescriptor( ISharedImages.IMG_TOOL_NEW_WIZARD ) );
URL runURL = Activator.getDefault()
.getBundle()
.getEntry( "icons/obj16/debugt_obj.gif" ); //$NON-NLS-1$
ImageDescriptor runDesc = ImageDescriptor.createFromURL( runURL );
URL runDisabledURL = Activator.getDefault()
.getBundle()
.getEntry( "icons/obj16/debugt_obj_disabled1.gif" ); //$NON-NLS-1$
ImageDescriptor runDisabledDesc = ImageDescriptor.createFromURL( runDisabledURL );
this.runJobAction = new Action() {
@Override
public void run() {
ISelection sel = ServiceJobView.this.getSelection();
if( !sel.isEmpty() ) {
if( sel instanceof IStructuredSelection ) {
IStructuredSelection sSel = ( IStructuredSelection )sel;
for( Object obj : sSel.toList() ) {
if( obj instanceof IServiceJob ) {
IServiceJob serviceJob = ( IServiceJob )obj;
if( serviceJob.needsSubmissionWizard() ) {
JobSubmissionServiceWizard serviceWizard = new JobSubmissionServiceWizard( serviceJob.getParent()
.getProject()
.getVO() );
WizardDialog dialog = new WizardDialog( PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getShell(),
serviceWizard );
if( dialog.open() == WizardDialog.OK ) {
serviceJob.setSubmissionService( serviceWizard.getSelectedService() );
serviceJob.run();
}
} else {
serviceJob.run();
}
}
}
}
}
super.run();
}
};
this.runJobAction.setImageDescriptor( runDesc );
this.runJobAction.setDisabledImageDescriptor( runDisabledDesc );
this.runJobAction.setEnabled( !getSelection().isEmpty() );
this.runJobAction.setToolTipText( Messages.getString( "ServiceJobsView.run_button_tooltip" ) );
mgr.add( this.runJobAction );
mgr.add( this.wizardAction );
refreshViewer();
}
private void createMenu() {
// Empty
}
public void statusChanged( final IServiceJob serviceJob ) {
// ServiceJobDecorator decorator = ServiceJobDecorator.getDecorator();
// if( decorator != null ) {
// decorator.refresh( serviceJob );
// }
refreshViewer( serviceJob );
}
public void addSelectionChangedListener( final ISelectionChangedListener listener )
{
// empty implementation
}
public ISelection getSelection() {
return this.myViewer.getSelection();
}
public void removeSelectionChangedListener( final ISelectionChangedListener listener )
{
// empty implementation
}
public void setSelection( final ISelection selection ) {
this.myViewer.setSelection( selection );
}
public void selectionChanged( final SelectionChangedEvent event ) {
this.runJobAction.setEnabled( !getSelection().isEmpty() );
}
}