package eu.geclipse.ui.internal.wizards;
import java.net.URI;
import java.net.URISyntaxException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.viewers.ISelection;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import eu.geclipse.core.ExtensionManager;
import eu.geclipse.core.Extensions;
import eu.geclipse.core.security.ICertificateLoader;
import eu.geclipse.ui.widgets.StoredCombo;
public class CertificateLoaderSelectionPage extends WizardPage {
private StoredCombo uriCombo;
private TreeViewer certLoaderViewer;
private Text descriptionText;
public CertificateLoaderSelectionPage() {
super( "certLoaderPage", //$NON-NLS-1$
"Certificate Repository",
null );
setDescription( "Select one of the available repositories" );
}
public void createControl( final Composite parent ) {
GridData gData;
Composite mainComp = new Composite( parent, SWT.NULL );
mainComp.setLayout( new GridLayout( 2, false ) );
gData = new GridData( GridData.FILL_BOTH );
mainComp.setLayoutData( gData );
Label uriLabel = new Label( mainComp, SWT.NONE );
uriLabel.setText( "URI:" );
uriLabel.setLayoutData( new GridData() );
this.uriCombo = new StoredCombo( mainComp, SWT.NONE );
this.uriCombo.setLayoutData( new GridData( GridData.FILL, GridData.CENTER, true, false ) );
Label repoLabel = new Label( mainComp, SWT.NONE );
repoLabel.setText( "Certificate repositories:" );
gData = new GridData();
gData.horizontalSpan = 2;
repoLabel.setLayoutData( gData );
this.certLoaderViewer = new TreeViewer( mainComp, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE );
gData = new GridData( GridData.FILL, GridData.FILL, true, true );
gData.horizontalSpan = 2;
gData.heightHint = 150;
certLoaderViewer.getTree().setLayoutData( gData );
certLoaderViewer.setContentProvider( new CertificateLoaderContentProvider() );
certLoaderViewer.setLabelProvider( new CertificateLoaderLabelProvider() );
ExtensionManager manager = new ExtensionManager();
certLoaderViewer.setInput(
manager.getConfigurationElements(
Extensions.CERT_LOADER_POINT,
Extensions.CERT_LOADER_ELEMENT
)
);
Label descLabel = new Label( mainComp, SWT.NONE );
descLabel.setText( "Description:" );
gData = new GridData();
gData.horizontalSpan = 2;
descLabel.setLayoutData( gData );
this.descriptionText = new Text( mainComp, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI | SWT.READ_ONLY );
gData = new GridData( GridData.FILL, GridData.CENTER, true, false );
gData.horizontalSpan = 2;
gData.heightHint = 50;
this.descriptionText.setLayoutData( gData );
certLoaderViewer.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged( final SelectionChangedEvent event ) {
setSelection( event.getSelection() );
}
} );
this.uriCombo.addModifyListener( new ModifyListener() {
public void modifyText( final ModifyEvent e ) {
validatePage();
}
} );
certLoaderViewer.expandAll();
TreeItem[] items = certLoaderViewer.getTree().getItems();
while ( ( items != null ) && ( items.length > 0 ) ) {
Object data = items[ 0 ].getData();
if ( ( data instanceof IConfigurationElement )
&& Extensions.CERT_LOADER_DISTRIBUTION_ELEMENT.equals( ( ( IConfigurationElement ) data ).getName() ) ) {
certLoaderViewer.setSelection( new StructuredSelection( data ) );
break;
}
items = items[ 0 ].getItems();
}
validatePage();
setControl( mainComp );
}
public ICertificateLoader getSelectedLoader() {
ICertificateLoader result = null;
ISelection selection = this.certLoaderViewer.getSelection();
IConfigurationElement element = null;
if ( selection instanceof IStructuredSelection ) {
Object object = ( ( IStructuredSelection ) selection ).getFirstElement();
while ( ( object != null ) && ( object instanceof IConfigurationElement ) ) {
element = ( IConfigurationElement ) object;
object = element.getParent();
}
}
if ( ( element != null ) && Extensions.CERT_LOADER_ELEMENT.equals( element.getName() ) ) {
try {
result = ( ICertificateLoader ) element.createExecutableExtension( Extensions.CERT_LOADER_CLASS_ATTRIBUTE );
} catch ( CoreException cExc ) {
setErrorMessage( "No valid certificate loader found: " + cExc.getLocalizedMessage() );
}
} else {
setErrorMessage( "No valid certificate loader found" );
}
return result;
}
public URI getURI() {
URI result = null;
String text = this.uriCombo.getText().trim();
if ( text.length() > 0 ) {
try {
result = new URI( text );
setErrorMessage( null );
setDescription( "Select one of the available repositories" );
} catch ( URISyntaxException uriExc ) {
setErrorMessage( "Invalid URI: " + uriExc.getLocalizedMessage() );
}
}
return result;
}
protected void setSelection( final ISelection selection ) {
if ( selection instanceof IStructuredSelection ) {
Object element = ( ( IStructuredSelection ) selection ).getFirstElement();
if ( element instanceof IConfigurationElement ) {
setSelection( ( IConfigurationElement ) element );
}
}
}
protected void validatePage() {
URI uri = getURI();
ICertificateLoader loader = getSelectedLoader();
setPageComplete( ( uri != null ) && ( loader != null ) );
}
private void setSelection( final IConfigurationElement element ) {
String url = ""; //$NON-NLS-1$
String description = ""; //$NON-NLS-1$
String name = element.getName();
if ( Extensions.CERT_LOADER_AUTHORITY_ELEMENT.equals( name ) ) {
description = element.getAttribute( Extensions.CERT_LOADER_AUTHORITY_DESCRIPTION_ATTRIBUTE );
} else if ( Extensions.CERT_LOADER_DISTRIBUTION_ELEMENT.equals( name ) ) {
url = element.getAttribute( Extensions.CERT_LOADER_DISTRIBUTION_URL_ATTRIBUTE );
description = element.getAttribute( Extensions.CERT_LOADER_DISTRIBUTION_DESCRIPTION_ATTRIBUTE );
}
this.uriCombo.setText( url );
this.descriptionText.setText( description );
}
}