/*****************************************************************************
* Copyright (c) 2006-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
* Ariel Garcia - updated to new problem reporting
*****************************************************************************/
package eu.geclipse.ui.internal.wizards;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import eu.geclipse.core.model.IVoLoader;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.ui.dialogs.ProblemDialog;
/**
* Wizard page for selection VOs to be imported.
*/
public class VoChooserPage extends WizardPage {
protected CheckboxTableViewer viewer;
private static class VoFilter extends ViewerFilter {
private String filterText;
/**
* This filters's default constructor.
*/
public VoFilter() {
super();
}
/**
* Set the filter's text that is used to filter the view's content.
*
* @param text The text that has to match the beginning of the VO name.
*/
public void setFilterText( final String text ) {
this.filterText = text;
}
@Override
public boolean select( final Viewer viewer,
final Object parentElement,
final Object element ) {
return ( this.filterText == null )
|| ( this.filterText.trim().length() == 0)
|| ( ( String ) element ).toLowerCase().startsWith( this.filterText.toLowerCase() );
}
}
protected Text filterText;
protected VoFilter voFilter;
protected List< Object > selection = new ArrayList< Object >();
private VoImportLocationChooserPage locationChooserPage;
/**
* Construct a new chooser page.
*
* @param locationChooserPage The location chooser page of the same wizard.
*/
public VoChooserPage( final VoImportLocationChooserPage locationChooserPage ) {
super( "voChooserPage", //$NON-NLS-1$
Messages.getString("VoChooserPage.title"), //$NON-NLS-1$
null );
setDescription( Messages.getString("VoChooserPage.description") ); //$NON-NLS-1$
this.locationChooserPage = locationChooserPage;
}
public void createControl( final Composite parent ) {
GridData gData;
Composite mainComp = new Composite( parent, SWT.NULL );
mainComp.setLayout( new GridLayout( 1, false ) );
gData = new GridData( GridData.FILL_BOTH );
mainComp.setLayoutData( gData );
this.filterText = new Text( mainComp, SWT.BORDER | SWT.SEARCH );
this.filterText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
this.filterText.setText( Messages.getString("VoChooserPage.initial_filter_text") ); //$NON-NLS-1$
this.filterText.selectAll();
Table table = new Table( mainComp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CHECK );
gData = new GridData( GridData.FILL_BOTH );
gData.grabExcessHorizontalSpace = true;
gData.grabExcessVerticalSpace = true;
table.setLayoutData( gData );
this.viewer = new CheckboxTableViewer( table );
this.viewer.setContentProvider( new ArrayContentProvider() );
this.voFilter = new VoFilter();
this.viewer.addFilter( this.voFilter );
Composite buttonComp = new Composite( mainComp, SWT.NULL );
buttonComp.setLayout( new GridLayout( 3, false ) );
gData = new GridData();
buttonComp.setLayoutData( gData );
Button selectAllButton = new Button( buttonComp, SWT.PUSH );
selectAllButton.setText( Messages.getString("VoChooserPage.select_all_button") ); //$NON-NLS-1$
gData = new GridData();
selectAllButton.setLayoutData( gData );
Button deselectAllButton = new Button( buttonComp, SWT.PUSH );
deselectAllButton.setText( Messages.getString("VoChooserPage.deselect_all_button") ); //$NON-NLS-1$
gData = new GridData();
deselectAllButton.setLayoutData( gData );
Button invertButton = new Button( buttonComp, SWT.PUSH );
invertButton.setText( Messages.getString("VoChooserPage.invert_selection_button") ); //$NON-NLS-1$
gData = new GridData();
invertButton.setLayoutData( gData );
this.viewer.addCheckStateListener( new ICheckStateListener() {
public void checkStateChanged( final CheckStateChangedEvent event ) {
handleCheckStateChanged( event );
}
} );
this.filterText.addModifyListener( new ModifyListener() {
public void modifyText( final ModifyEvent e ) {
VoChooserPage.this.voFilter.setFilterText( VoChooserPage.this.filterText.getText() );
VoChooserPage.this.viewer.refresh();
VoChooserPage.this.viewer.setCheckedElements( VoChooserPage.this.selection.toArray( new Object[ VoChooserPage.this.selection.size() ] ) );
}
} );
selectAllButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
selectAll();
}
} );
deselectAllButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
deselectAll();
}
} );
invertButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( final SelectionEvent e ) {
invertSelection();
}
} );
setControl( mainComp );
}
/**
* Get all selected VOs.
*
* @return A list containing the names of all selected VOs.
*/
public String[] getSelectedVos() {
String[] result = null;
result = new String[ this.selection.size() ];
for ( int i = 0 ; i < this.selection.size() ; i++ ) {
result[ i ] = ( String ) this.selection.get( i );
}
return result;
}
@Override
public void setVisible( final boolean visible ) {
super.setVisible( visible );
if ( visible ) {
loadVoList();
if ( ! this.filterText.isDisposed() ) {
this.filterText.setFocus();
}
}
}
protected void handleCheckStateChanged( final CheckStateChangedEvent event ) {
Object element = event.getElement();
if ( event.getChecked() ) {
addToSelection( new Object[] { element } );
} else if ( ! event.getChecked() ) {
removeFromSelection( new Object[] { element } );
}
}
protected void selectAll() {
this.viewer.setAllChecked( true );
addToSelection( this.viewer.getCheckedElements() );
}
protected void deselectAll() {
removeFromSelection( this.viewer.getCheckedElements() );
this.viewer.setAllChecked( false );
}
protected void invertSelection() {
TableItem[] items = this.viewer.getTable().getItems();
for ( TableItem item : items ) {
String element = ( String ) item.getData();
boolean state = this.viewer.getChecked( element );
this.viewer.setChecked( element, ! state );
if ( state ) {
removeFromSelection( new Object[] { element } );
} else {
addToSelection( new Object[] { element } );
}
}
}
private void addToSelection( final Object[] elements ) {
for ( Object element : elements ) {
if ( ! this.selection.contains( element ) ) {
this.selection.add( element );
}
}
}
private void removeFromSelection( final Object[] elements ) {
for ( Object element : elements ) {
if ( this.selection.contains( element ) ) {
this.selection.remove( element );
}
}
}
private void loadVoList() {
final IVoLoader loader = this.locationChooserPage.getLoader();
final URI uri = this.locationChooserPage.getSelectedLocation();
try {
getContainer().run( false, true, new IRunnableWithProgress() {
public void run( final IProgressMonitor monitor )
throws InvocationTargetException, InterruptedException {
try {
String[] voArray = loader.getVoList( uri, monitor );
List< String > voList = new ArrayList< String >();
for ( String vo : voArray ) {
if ( ! voList.contains( vo ) ) {
voList.add( vo );
}
}
VoChooserPage.this.viewer.setInput( voList );
} catch ( ProblemException pExc ) {
throw new InvocationTargetException( pExc );
}
}
} );
} catch ( InvocationTargetException itExc ) {
Throwable cause = itExc.getCause();
ProblemDialog.openProblem( getShell(),
Messages.getString("VoChooserPage.import_failed_title"), //$NON-NLS-1$
Messages.getString("VoChooserPage.import_failed_error"), //$NON-NLS-1$
cause );
setErrorMessage( cause.getLocalizedMessage() );
} catch ( InterruptedException intExc ) {
// Do nothing on user interrupt
}
}
}