/***************************************************************************** * Copyright (c) 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 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.wizards; import java.net.URI; import java.net.URL; import java.util.Hashtable; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.window.Window; 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.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import eu.geclipse.core.Extensions; import eu.geclipse.core.model.IGridElement; import eu.geclipse.core.model.IGridElementCreator; import eu.geclipse.core.model.IGridService; import eu.geclipse.core.model.impl.GenericVirtualOrganization; import eu.geclipse.core.model.impl.GenericVoCreator; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.ui.dialogs.ServiceDialog; import eu.geclipse.ui.internal.Activator; public class VoServiceSelectionPage extends WizardPage { private static final String SERVICE_IMAGE = "icons/obj16/service_obj.gif"; //$NON-NLS-1$ private static final String SERVICE_NEW_IMAGE = "icons/obj16/service_new_obj.gif"; //$NON-NLS-1$ private static final String CONFIGURATION_DATA_KEY = "configuration"; //$NON-NLS-1$ private static final String SERVICE_DATA_KEY = "service"; //$NON-NLS-1$ private static final String URI_DATA_KEY = "uri"; //$NON-NLS-1$ private static Hashtable< String, Image > images = new Hashtable< String, Image >(); private GenericVirtualOrganization initialVo; private Table serviceTable; private Button addButton; private Button removeButton; public VoServiceSelectionPage() { super( "voServiceSelectionPage", //$NON-NLS-1$ "Service Selection", null ); setDescription( "Add services to your VO" ); URL imgUrl = Activator.getDefault().getBundle().getEntry( "icons/wizban/vo_wiz.gif" ); //$NON-NLS-1$ setImageDescriptor( ImageDescriptor.createFromURL( imgUrl ) ); } public IStatus apply( final GenericVoCreator creator ) { IStatus result = Status.OK_STATUS; TableItem[] items = this.serviceTable.getItems(); for ( TableItem item : items ) { try { IGridService service = ( IGridService ) item.getData( SERVICE_DATA_KEY ); IConfigurationElement element = ( IConfigurationElement ) item.getData( CONFIGURATION_DATA_KEY ); URI uri = ( URI ) item.getData( URI_DATA_KEY ); if ( service != null ) { creator.maintainService( service ); } else if ( ( element != null ) && ( uri != null ) ) { IGridElementCreator serviceCreator = ( IGridElementCreator ) element.createExecutableExtension( Extensions.GRID_ELEMENT_CREATOR_EXECUTABLE ); creator.createService( serviceCreator, uri ); } } catch ( Exception exc ) { result = new Status( IStatus.ERROR, Activator.PLUGIN_ID, exc.getLocalizedMessage(), exc ); break; } } return result; } public void createControl( final Composite parent ) { Composite mainComp = new Composite( parent, SWT.NONE ); mainComp.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); mainComp.setLayout( new GridLayout( 2, false ) ); Label label = new Label( mainComp, SWT.NONE ); label.setText( "Services" ); GridData labelData = new GridData( SWT.BEGINNING, SWT.CENTER, false, false ); labelData.horizontalSpan = 2; label.setLayoutData( labelData ); this.serviceTable = new Table( mainComp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION ); this.serviceTable.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); this.serviceTable.setHeaderVisible( true ); this.serviceTable.setLinesVisible( true ); TableColumn typeColumn = new TableColumn( this.serviceTable, SWT.NULL ); typeColumn.setText( "Type/Name" ); typeColumn.setWidth( 150 ); TableColumn urlColumn = new TableColumn( this.serviceTable, SWT.NULL ); urlColumn.setText( "Endpoint" ); urlColumn.setWidth( 300 ); Composite buttonComp = new Composite( mainComp, SWT.NONE ); buttonComp.setLayoutData( new GridData( SWT.BEGINNING, SWT.BEGINNING, false, false ) ); buttonComp.setLayout( new GridLayout( 1, false ) ); this.addButton = new Button( buttonComp, SWT.NONE ); this.addButton.setText( "&Add..." ); this.addButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, true, false ) ); this.removeButton = new Button( buttonComp, SWT.NONE ); this.removeButton.setText( "&Remove" ); this.removeButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, true, false ) ); this.serviceTable.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { updateUI(); } } ); this.addButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { showServiceDialog(); } } ); this.removeButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { removeSelectedServices(); updateUI(); } } ); if ( this.initialVo != null ) { initVo( this.initialVo ); } updateUI(); setControl( mainComp ); } /** * Initializes the controls of this wizard page with the attributes * of the specified VO. * * @param vo The VO whose attributes should be set to the page's controls. * @throws ProblemException If any error occurs. */ protected void initVo( final GenericVirtualOrganization vo ) { try { IGridElement[] children = vo.getChildren( null ); for ( IGridElement child : children ) { if ( child instanceof IGridService ) { IGridService service = ( IGridService ) child; TableItem item = new TableItem( this.serviceTable, SWT.NONE ); item.setText( 0, service.getName() ); item.setText( 1, service.getURI().toString() ); item.setImage( getImage( SERVICE_IMAGE ) ); item.setData( SERVICE_DATA_KEY, service ); } } } catch ( ProblemException pExc ) { Activator.logException( pExc ); } } protected void removeSelectedServices() { int[] indices = this.serviceTable.getSelectionIndices(); this.serviceTable.remove( indices ); } /** * Set the specified VO as initial VO. This means that the controls * of the page will be initialized with the attributes of the specified * VO. * * @param vo The initial VO. */ protected void setInitialVo( final GenericVirtualOrganization vo ) { this.initialVo = vo; } protected void showServiceDialog() { ServiceDialog dialog = new ServiceDialog( getShell() ); if ( dialog.open() == Window.OK ) { IConfigurationElement selectedElement = dialog.getSelectedElement(); URI selectedURI = dialog.getSelectedURI(); TableItem item = new TableItem( this.serviceTable, SWT.NONE ); item.setText( 0, selectedElement.getAttribute( Extensions.GRID_ELEMENT_CREATOR_NAME_ATTRIBUTE ) ); item.setText( 1, selectedURI.toString() ); item.setData( CONFIGURATION_DATA_KEY, selectedElement ); item.setData( URI_DATA_KEY, selectedURI ); item.setImage( getImage( SERVICE_NEW_IMAGE ) ); } } protected static Image getImage( final String name ) { Image result = images.get( name ); if ( result == null ) { URL url = Activator.getDefault().getBundle().getResource( name ); ImageDescriptor desc = ImageDescriptor.createFromURL( url ); result = desc.createImage(); images.put( name, result ); } return result; } protected void updateUI() { boolean selected = this.serviceTable.getSelectionCount() > 0; this.removeButton.setEnabled( selected ); } }