/***************************************************************************** * 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 } } }