/*****************************************************************************
* 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
*****************************************************************************/
package eu.geclipse.ui.wizards;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URL;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import eu.geclipse.core.ICoreProblems;
import eu.geclipse.core.model.GridModel;
import eu.geclipse.core.model.IGridContainer;
import eu.geclipse.core.model.IGridElement;
import eu.geclipse.core.reporting.ProblemException;
import eu.geclipse.ui.actions.MountAction;
import eu.geclipse.ui.dialogs.ProblemDialog;
import eu.geclipse.ui.internal.Activator;
/**
* Wizard for the creation of new connections. Can both create local
* and global connections.
*/
public class ConnectionWizard
extends Wizard
implements INewWizard {
protected static final String CONNECTION_PREFIX = "."; //$NON-NLS-1$
protected static final String CONNECTION_SUFFIX = ".fs"; //$NON-NLS-1$
IWizardPage firstPage;
private boolean createGlobalConnection;
private ISelection initialSelection;
private URI initialURI;
private String initialName;
private ConnectionDefinitionWizardPage definitionPage;
/**
* Create a new connection wizard for local connections.
*/
public ConnectionWizard() {
this( null, null, false );
}
public ConnectionWizard( final URI initialURI,
final String initialName ) {
this( initialURI, initialName, false );
}
/**
* Create a new connection wizard.
*
* @param createGlobalConnection If true a connection wizard for
* the creation of global connections will be initialized.
*/
public ConnectionWizard( final boolean createGlobalConnection ) {
this( null, null, createGlobalConnection );
}
public ConnectionWizard( final URI initialURI,
final String initialName,
final boolean createGlobalConnection ) {
URL imgURL = Activator.getDefault().getBundle().getResource( "icons/wizban/newconn_wiz.gif" ); //$NON-NLS-1$
setDefaultPageImageDescriptor( ImageDescriptor.createFromURL( imgURL ) );
setNeedsProgressMonitor( true );
this.createGlobalConnection = createGlobalConnection;
this.initialURI = initialURI;
this.initialName = initialName;
}
@Override
public void addPages() {
if ( this.initialSelection == null ) {
this.initialSelection = StructuredSelection.EMPTY;
}
if ( this.createGlobalConnection ) {
this.firstPage = new ConnectionNameWizardPage( this.initialName );
} else {
this.firstPage
= new ConnectionLocationWizardPage( Messages.getString("ConnectionWizard.location_page_name"), //$NON-NLS-1$
( IStructuredSelection ) this.initialSelection );
this.firstPage.setTitle( Messages.getString("ConnectionWizard.location_page_title") ); //$NON-NLS-1$
this.firstPage.setDescription( Messages.getString("ConnectionWizard.location_page_description") ); //$NON-NLS-1$
if ( this.initialName != null ) {
( ( ConnectionLocationWizardPage ) this.firstPage ).setFileName( this.initialName );
}
}
addPage( this.firstPage );
IGridContainer mountPoint = getMountPoint();
this.definitionPage = new ConnectionDefinitionWizardPage( mountPoint, this.initialURI );
addPage( this.definitionPage );
}
@Override
public boolean canFinish() {
IWizardContainer container = getContainer();
IWizardPage currentPage = container.getCurrentPage();
return ( ( currentPage != this.firstPage ) || ( this.initialURI != null ) ) && super.canFinish();
}
@Override
public String getWindowTitle() {
return Messages.getString("ConnectionWizard.window_title"); //$NON-NLS-1$
}
@Override
public boolean performFinish() {
boolean result = true;
URI uri = this.definitionPage.getURI();
if ( uri != null ) {
try {
if ( ConnectionWizard.this.createGlobalConnection ) {
result = createGlobalConnection( uri );
} else {
result = createLocalConnection( uri );
}
} catch ( ProblemException pExc ) {
ProblemDialog.openProblem(
getShell(),
"Mount failed",
"Unable to create connection",
pExc );
result = false;
}
}
return result;
}
public void init( final IWorkbench workbench,
final IStructuredSelection selection ) {
this.initialSelection = selection;
}
protected boolean createGlobalConnection( final URI uri )
throws ProblemException {
boolean result = true;
ConnectionNameWizardPage page
= ( ConnectionNameWizardPage ) this.firstPage;
final String name = page.getConnectionName();
try {
getContainer().run( true, true, new IRunnableWithProgress() {
public void run( final IProgressMonitor monitor )
throws InvocationTargetException ,InterruptedException {
try {
MountAction.createGlobalMount( uri, name, monitor );
} catch ( CoreException pExc ) {
throw new InvocationTargetException( pExc );
} finally {
monitor.done();
}
}
} );
} catch ( InvocationTargetException itExc ) {
Throwable t = itExc.getCause();
if ( t instanceof ProblemException ) {
throw ( ProblemException ) t;
}
if ( t == null ) {
t = itExc;
}
throw new ProblemException(
ICoreProblems.MODEL_ELEMENT_CREATE_FAILED,
"Unable to create connection",
t,
Activator.PLUGIN_ID );
} catch ( InterruptedException intExc ) {
result = false;
}
return result;
}
protected boolean createLocalConnection( final URI uri )
throws ProblemException {
boolean result = true;
ConnectionLocationWizardPage page
= ( ConnectionLocationWizardPage ) this.firstPage;
final IPath path = page.getContainerFullPath().append( page.getFileName() );
try {
getContainer().run( true, true, new IRunnableWithProgress() {
public void run( final IProgressMonitor monitor )
throws InvocationTargetException, InterruptedException {
try {
MountAction.createLocalMount( uri, path, monitor );
} catch ( CoreException cExc ) {
throw new InvocationTargetException( cExc );
}
}
} );
} catch ( InvocationTargetException itExc ) {
Throwable t = itExc.getCause();
if ( t instanceof ProblemException ) {
throw ( ProblemException ) t;
}
if ( t == null ) {
t = itExc;
}
throw new ProblemException(
ICoreProblems.MODEL_ELEMENT_CREATE_FAILED,
"Unable to create connection",
t,
Activator.PLUGIN_ID );
} catch ( InterruptedException intExc ) {
result = false;
}
return result;
}
private IGridContainer getMountPoint() {
IGridContainer result = null;
if ( ( this.initialSelection != null ) && ( this.initialSelection instanceof StructuredSelection ) ) {
StructuredSelection sSelection = ( StructuredSelection ) this.initialSelection;
Object object = sSelection.getFirstElement();
if ( object instanceof IGridContainer ) {
result = ( IGridContainer ) object;
} else if ( object instanceof IResource ) {
IGridElement element = GridModel.getRoot().findElement( ( IResource ) object );
if ( ( element != null ) && ( element instanceof IGridContainer ) ) {
result = ( IGridContainer ) element;
}
} else if ( object instanceof IAdaptable ) {
result = ( IGridContainer ) ( ( IAdaptable ) object ).getAdapter( IGridContainer.class );
}
}
return result;
}
private void setCurrentErrorMessage( final IWizardPage fromPage ) {
String errorMessage = fromPage.getErrorMessage();
WizardPage toPage = ( WizardPage ) getContainer().getCurrentPage();
toPage.setErrorMessage( errorMessage );
}
}