/******************************************************************************
* 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)
*
*****************************************************************************/
package eu.geclipse.servicejob.ui.wizard;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import eu.geclipse.core.model.IGridComputing;
import eu.geclipse.core.model.IGridResource;
import eu.geclipse.core.model.IGridResourceCategory;
import eu.geclipse.core.model.IGridService;
import eu.geclipse.core.model.IGridStorage;
import eu.geclipse.core.model.IVirtualOrganization;
import eu.geclipse.core.model.impl.GridResourceCategoryFactory;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.servicejob.ui.Activator;
import eu.geclipse.servicejob.ui.internal.CategoryContainer;
import eu.geclipse.servicejob.ui.internal.CategoryResourcesTreeCProvider;
import eu.geclipse.servicejob.ui.internal.CategoryResourcesTreeLProvider;
import eu.geclipse.ui.wizards.IProjectSelectionProvider;
/**
* Wizard page on which all resources (also services) taken form info system are
* displayed.
*/
public class ResourcesSelectionPage extends WizardPage {
CheckboxTreeViewer viewer;
private IProjectSelectionProvider projectProvider;
private IVirtualOrganization oldVO;
private List<IGridResourceCategory> visibleCategories = new ArrayList<IGridResourceCategory>();
private Button selectAllButton;
private Button revertSelectionButton;
private Button deselectAllButton;
// private List<IGridResource> selectedResources;
/**
* Constructor of ResourceSelectionPage objects.
*
* @param selectionProvider object implementing {@link IProjectSelectionProvider}
* interface. This object is a source of information for which VO
* resources should be presented.
* @param pageName name of this wizard page
*/
public ResourcesSelectionPage( final IProjectSelectionProvider selectionProvider,
final String pageName )
{
super( pageName );
this.projectProvider = selectionProvider;
setTitle( "Resource selection" );
setDescription( "Choose services to perform operator's job on." );
this.oldVO = null;
this.visibleCategories.add( GridResourceCategoryFactory.getCategory( GridResourceCategoryFactory.ID_COMPUTING ) );
this.visibleCategories.add( GridResourceCategoryFactory.getCategory( GridResourceCategoryFactory.ID_STORAGE ) );
}
public void addVisibleCategory( final IGridResourceCategory resourceCategory )
{
if( !this.visibleCategories.contains( resourceCategory ) ) {
this.visibleCategories.add( resourceCategory );
}
}
public void removeVisibleCategory( final IGridResourceCategory resourceCategory )
{
this.visibleCategories.remove( resourceCategory );
}
@Override
public void setVisible( final boolean visible ) {
super.setVisible( visible );
if( visible ) {
// if( this.oldVO != null
// && !this.oldVO.equals( this.projectProvider.getGridProject().getVO() ) )
// {
// this.selectedResources = new ArrayList<IGridResource>();
// }
setSelectedVO( this.projectProvider.getGridProject().getVO() );
} else {
this.oldVO = this.projectProvider.getGridProject().getVO();
}
updateButtons();
}
@Override
public boolean isPageComplete() {
return super.isPageComplete() && canFlipToNextPage();
}
@Override
public boolean canFlipToNextPage() {
boolean flag = false;
if( this.viewer.getCheckedElements().length != 0 ) {
flag = true;
}
return flag && getNextPage() != null;
}
/**
* Method to access list of selected resources.s
*
* @return list of resources which were selected by user
*/
public List<IGridResource> getSelectedResources() {
List<IGridResource> result = new ArrayList<IGridResource>();
for( Object checked : this.viewer.getCheckedElements() ) {
if( checked instanceof IGridResource ) {
result.add( ( IGridResource )checked );
}
}
return result;
}
public void createControl( final Composite parent ) {
Composite mainComp = new Composite( parent, SWT.NONE );
mainComp.setLayout( new GridLayout( 2, false ) );
GridData gd;
gd = new GridData( GridData.FILL_BOTH );
gd.grabExcessHorizontalSpace = true;
gd.grabExcessVerticalSpace = true;
gd.verticalSpan = 3;
gd.horizontalSpan = 1;
gd.widthHint = 300;
gd.heightHint = 100;
Tree tree = new Tree( mainComp, SWT.BORDER
| SWT.H_SCROLL
| SWT.V_SCROLL
| SWT.CHECK );
tree.setLayoutData( gd );
this.viewer = new CheckboxTreeViewer( tree );
this.viewer.setContentProvider( new CategoryResourcesTreeCProvider() );
this.viewer.setLabelProvider( new CategoryResourcesTreeLProvider() );
this.viewer.addCheckStateListener( new ICheckStateListener() {
public void checkStateChanged( final CheckStateChangedEvent event ) {
updateParent( event );
if( event.getChecked() ) {
ResourcesSelectionPage.this.viewer.setSubtreeChecked( event.getElement(),
true );
} else {
ResourcesSelectionPage.this.viewer.setSubtreeChecked( event.getElement(),
false );
}
updateButtons();
}
} );
createButtons( mainComp );
setControl( mainComp );
}
private void createButtons( final Composite composite ) {
Composite buttonsComp = new Composite( composite, SWT.NONE );
buttonsComp.setLayout( new GridLayout( 1, false ) );
GridData gd = new GridData();
buttonsComp.setLayoutData( gd );
this.selectAllButton = new Button( buttonsComp, SWT.PUSH );
gd = new GridData( GridData.FILL_HORIZONTAL );
this.selectAllButton.setText( "Select all" );
this.selectAllButton.setLayoutData( gd );
this.deselectAllButton = new Button( buttonsComp, SWT.PUSH );
gd = new GridData( GridData.FILL_HORIZONTAL );
this.deselectAllButton.setLayoutData( gd );
this.deselectAllButton.setText( "Deselect all" );
this.revertSelectionButton = new Button( buttonsComp, SWT.PUSH );
gd = new GridData( GridData.FILL_HORIZONTAL );
this.revertSelectionButton.setLayoutData( gd );
this.revertSelectionButton.setText( "Revert selection" );
createListenersForButtons();
}
private void changeStateAllTreeItems( final boolean checked ) {
CategoryContainer[] input = ( CategoryContainer[] )this.viewer.getInput();
for( CategoryContainer category : input ) {
this.viewer.setChecked( category, checked );
this.viewer.setSubtreeChecked( category, checked );
updateButtons();
}
}
private void revertSelection() {
CategoryContainer[] input = ( CategoryContainer[] )this.viewer.getInput();
for( CategoryContainer category : input ) {
IGridResource childRef = null;
boolean child = true;
for( IGridResource resource : category.getContainedResources() ) {
child = this.viewer.getChecked( resource );
this.viewer.setChecked( resource, !child );
if( child ) {
childRef = resource;
}
}
if( childRef == null ) {
childRef = category.getContainedResources().get( 0 );
}
updateParent( childRef );
}
}
private void createListenersForButtons() {
this.selectAllButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent event ) {
changeStateAllTreeItems( true );
updateButtons();
}
} );
this.deselectAllButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent event ) {
changeStateAllTreeItems( false );
updateButtons();
}
} );
this.revertSelectionButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent event ) {
revertSelection();
updateButtons();
}
} );
}
void updateParent( final Object element ) {
if( element instanceof IGridResource ) {
IGridResource gridResource = ( IGridResource )element;
CategoryContainer[] input = ( CategoryContainer[] )this.viewer.getInput();
CategoryContainer parent = null;
for( CategoryContainer category : input ) {
if( category.getContainedResources().contains( gridResource ) ) {
parent = category;
break;
}
}
if( parent != null ) {
// we've got the parent :)
if( this.viewer.getChecked( element ) ) {
boolean childrenChecked = true;
for( IGridResource child : parent.getContainedResources() ) {
if( !this.viewer.getChecked( child ) ) {
childrenChecked = false;
break;
}
}
this.viewer.setChecked( parent, childrenChecked );
} else {
this.viewer.setChecked( parent, false );
}
}
}
}
protected void updateButtons() {
getContainer().updateButtons();
}
/**
* Method to set (also change) the VO from which resources are displayed by
* this wizard page.
*
* @param vo VO object from which resources will be presented on this page
*/
public void setSelectedVO( final IVirtualOrganization vo ) {
if( this.viewer != null ) {
try {
List<CategoryContainer> categories = new ArrayList<CategoryContainer>();
for( IGridResourceCategory category : this.visibleCategories ) {
CategoryContainer catContainer = new CategoryContainer( category );
categories.add( catContainer );
IGridResource[] resources = vo.getAvailableResources( category,
false,
new NullProgressMonitor() );
if (resources != null){
for( IGridResource res : resources)
{
catContainer.addResource( res );
}
}
}
CategoryContainer[] input = new CategoryContainer[ categories.size() ];
input = categories.toArray( input );
this.viewer.setInput( input );
this.viewer.refresh();
this.viewer.expandAll();
} catch( ProblemException e ) {
// TODO Auto-generated catch block
Activator.logException( e );
}
}
}
@Override
public IWizardPage getNextPage() {
return super.getNextPage();
}
class ContentProvider implements IStructuredContentProvider {
public Object[] getElements( final Object inputElement ) {
Object[] result = null;
if( inputElement instanceof IGridResource[] ) {
IGridResource[] candidateHostsType = ( IGridResource[] )inputElement;
result = candidateHostsType;
} else if( inputElement instanceof String[] ) {
result = ( String[] )inputElement;
}
return result;
}
public void dispose() {
// Auto-generated method stub
}
public void inputChanged( final Viewer viewer1,
final Object oldInput,
final Object newInput )
{
// Auto-generated method stub
}
}
class LabelProvider1 extends LabelProvider implements ITableLabelProvider {
private Image argsImage;
// private Image candHostsImage;
private Image computingImg;
private Image storageImg;
private Image serviceImg;
/**
* Class Constructor
*/
public LabelProvider1() {
loadImages();
}
public Image getColumnImage( final Object element, final int columnIndex ) {
Image image = null;
switch( columnIndex ) {
case 0:
if( element instanceof IGridComputing ) {
image = this.computingImg;
} else if( element instanceof IGridStorage ) {
image = this.storageImg;
} else if( element instanceof IGridService ) {
image = this.serviceImg;
}
break;
default:
break;
} // end switch
return image;
}
public String getColumnText( final Object element, final int columnIndex ) {
String text = null;
Object[] array = null;
if( element instanceof Object[] ) {
array = ( Object[] )element;
} else if( element instanceof IGridResource ) {
switch( columnIndex ) {
case 0:
text = ( ( IGridResource )element ).getName();
break;
default:
// text = element.toString();
break;
} // end switch
} else if( element instanceof String ) {
text = element.toString();
}
if( ( array != null ) && ( columnIndex < array.length ) ) {
text = getText( array[ columnIndex ] );
}
return text;
}// End String getColumnText()
void loadImages() {
URL argsURL = Activator.getDefault()
.getBundle()
.getEntry( "icons/etool16/args.gif" ); //$NON-NLS-1$
URL candHostsURL = Activator.getDefault()
.getBundle()
.getEntry( "icons/etool16/computing_obj.gif" ); //$NON-NLS-1$
URL storageURL = Activator.getDefault()
.getBundle()
.getEntry( "icons/etool16/storage.gif" ); //$NON-NLS-1$
URL serviceURL = Activator.getDefault()
.getBundle()
.getEntry( "icons/etool16/service.gif" ); //$NON-NLS-1$
ImageDescriptor argsDesc = ImageDescriptor.createFromURL( argsURL );
ImageDescriptor candHostsDesc = ImageDescriptor.createFromURL( candHostsURL );
ImageDescriptor storageDesc = ImageDescriptor.createFromURL( storageURL );
ImageDescriptor serviceDesc = ImageDescriptor.createFromURL( serviceURL );
this.argsImage = argsDesc.createImage();
this.computingImg = candHostsDesc.createImage();
this.storageImg = storageDesc.createImage();
this.serviceImg = serviceDesc.createImage();
}
}
}