/****************************************************************************
*
* Copyright (c) 2010-2011, EBM WebSourcing
*
* This source code is available under agreement available at
* http://www.petalslink.com/legal/licenses/petals-studio
*
* You should have received a copy of the agreement along with this program.
* If not, write to EBM WebSourcing (4, rue Amelie - 31200 Toulouse, France).
*
*****************************************************************************/
package org.eclipse.bpel.common.wsdl.wizards;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import org.eclipse.bpel.common.wsdl.helpers.UriAndUrlHelper;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
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.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
* A wizard page to import a resource in the workspace.
* @author Vincent Zurczak - EBM WebSourcing
* FIXME: is there an existing page we could reuse?
*/
public class UriResourceImportWizardPage extends WizardPage {
private URI uri;
private IContainer outputContainer;
private boolean complete = false;
private String initialUri;
private final String shortName;
private final String[] filterNames, filterExtensions;
/**
* Constructor.
* @param selection
* @param shortName
* @param filterNames
* @param filterExtensions
*/
public UriResourceImportWizardPage(
IStructuredSelection selection,
String shortName,
String[] filterNames,
String[] filterExtensions ) {
super( "Import Page" );
this.shortName = shortName;
this.filterNames = filterNames;
this.filterExtensions = filterExtensions;
if( ! selection.isEmpty()) {
Object o = selection.getFirstElement();
IResource res = (IResource) getAdapter( o, IResource.class );
if( res instanceof IContainer )
this.outputContainer = (IContainer) res;
else if( res != null )
this.outputContainer = res.getParent();
}
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage
* #createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl( Composite parent ) {
Composite container = new Composite( parent, SWT.NONE );
GridLayout layout = new GridLayout( 2, false );
container.setLayout( layout );
container.setLayoutData( new GridData( GridData.FILL_BOTH ));
// WSDL field
Label l = new Label( container, SWT.NONE );
l.setText( this.shortName + " URI:" );
GridData layoutData = new GridData();
layoutData.verticalIndent = 6;
layoutData.horizontalSpan = 2;
l.setLayoutData( layoutData );
final Text text = new Text( container, SWT.BORDER | SWT.SINGLE );
text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
text.addModifyListener( new ModifyListener () {
@Override
public void modifyText( ModifyEvent e ) {
String uri = text.getText();
if( uri.trim().length() == 0 )
return;
try {
UriResourceImportWizardPage.this.uri = UriAndUrlHelper.urlToUri( uri );
} catch( Exception e1 ) {
UriResourceImportWizardPage.this.uri = null;
}
validate();
}
});
if( this.initialUri != null )
text.setText( this.initialUri );
Button b = new Button( container, SWT.PUSH );
b.setText( "Browse..." );
b.addSelectionListener( new SelectionAdapter () {
@Override
public void widgetDefaultSelected( SelectionEvent e ) {
widgetSelected( e );
}
@Override
public void widgetSelected( SelectionEvent e ) {
FileDialog dlg = new FileDialog( text.getShell(), SWT.SINGLE );
dlg.setFilterNames( UriResourceImportWizardPage.this.filterNames );
dlg.setFilterExtensions( UriResourceImportWizardPage.this.filterExtensions );
String path = dlg.open();
if( path != null ) {
String uri = new File( path ).toURI().toString();
text.setText( uri );
text.setSelection( uri.length());
text.setFocus();
}
}
});
// Container selection
l = new Label( container, SWT.NONE );
l.setText( "Select the container in which the " + this.shortName + " will be imported." );
layoutData = new GridData();
layoutData.verticalIndent = 10;
layoutData.horizontalSpan = 2;
l.setLayoutData( layoutData );
TreeViewer viewer = new TreeViewer( container, SWT.SINGLE | SWT.V_SCROLL | SWT.V_SCROLL | SWT.BORDER );
layoutData = new GridData( GridData.FILL_BOTH );
layoutData.heightHint = 200;
layoutData.horizontalSpan = 2;
viewer.getTree().setLayoutData( layoutData );
viewer.setLabelProvider( new WorkbenchLabelProvider ());
viewer.setContentProvider( new WorkbenchContentProvider () {
@Override
public Object[] getChildren( Object o ) {
if( o instanceof IContainer ) {
IResource[] members;
try {
members = ((IContainer) o).members();
} catch( Exception e ) {
return new Object[ 0 ];
}
ArrayList<IResource> results = new ArrayList<IResource> ();
for( IResource member : members ) {
if( member instanceof IContainer )
results.add( member);
}
return results.toArray();
}
return new Object[ 0 ];
}
});
// Set page input
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
viewer.setInput( root );
if( this.outputContainer != null ) {
viewer.setSelection( new StructuredSelection( this.outputContainer ), true );
viewer.expandToLevel( this.outputContainer, 1 );
viewer.reveal( this.outputContainer.getProject());
}
viewer.addSelectionChangedListener( new ISelectionChangedListener () {
@Override
public void selectionChanged( SelectionChangedEvent event ) {
IStructuredSelection s = (IStructuredSelection) event.getSelection();
if( !s.isEmpty())
UriResourceImportWizardPage.this.outputContainer = (IContainer) s.getFirstElement();
else
UriResourceImportWizardPage.this.outputContainer = null;
validate();
}
});
text.setFocus();
setControl( container );
}
/**
* Validates the page entries.
*/
private void validate() {
if( this.uri == null ) {
setErrorMessage( "The " + this.shortName + "'s URI is invalid." );
setPageComplete( false );
return;
}
if( "file".equals( this.uri.getScheme())
&& ! new File( this.uri ).exists()) {
setErrorMessage( "This URI points to a file that does not exist." );
setPageComplete( false );
return;
}
if( this.outputContainer == null ) {
setErrorMessage( "You must select the destination container." );
setPageComplete( false );
return;
}
setErrorMessage( null );
setPageComplete( true );
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage
* #isPageComplete()
*/
@Override
public boolean isPageComplete() {
return this.complete;
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.WizardPage
* #setPageComplete(boolean)
*/
@Override
public void setPageComplete( boolean complete ) {
this.complete = complete;
super.setPageComplete( complete );
}
/**
* @return the outputContainer
*/
public IContainer getOutputContainer() {
return this.outputContainer;
}
/**
* @return the uri
*/
public URI getUriToImport() {
return this.uri;
}
/**
* @param initialUri the initial URI to set
*/
public void setInitialUri( String initialUri ) {
this.initialUri = initialUri;
}
/**
* Gets the appropriate adapter.
* @param sourceObject
* @param adapterType
* @return
*/
public static Object getAdapter( Object sourceObject, Class<?> adapterType ) {
Assert.isNotNull(adapterType);
if (sourceObject == null) {
return null;
}
if (adapterType.isInstance(sourceObject)) {
return sourceObject;
}
if (sourceObject instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) sourceObject;
Object result = adaptable.getAdapter(adapterType);
if (result != null) {
// Sanity-check
Assert.isTrue(adapterType.isInstance(result));
return result;
}
}
if (!(sourceObject instanceof PlatformObject)) {
Object result = Platform.getAdapterManager().getAdapter(sourceObject, adapterType);
if (result != null) {
return result;
}
}
return null;
}
}