/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.ui.wizards.templates;
import java.util.Iterator;
import net.rim.ejde.internal.ui.wizards.BlackBerryProjectWizardPageTwo;
import net.rim.ejde.internal.util.Messages;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
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.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.IWizardNode;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardSelectionPage;
import org.eclipse.pde.internal.ui.IHelpContextIds;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.elements.ElementList;
import org.eclipse.pde.internal.ui.elements.ListContentProvider;
import org.eclipse.pde.internal.ui.parts.FormBrowser;
import org.eclipse.pde.internal.ui.wizards.ListUtil;
import org.eclipse.pde.ui.IBasePluginWizard;
import org.eclipse.pde.ui.IPluginContentWizard;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.PlatformUI;
public class BBTemplateSelectionPage extends WizardSelectionPage implements ISelectionChangedListener {
private BlackBerryProjectWizardPageTwo fContentPage;
private String fInitialTemplateId;
protected TableViewer wizardSelectionViewer;
protected ElementList wizardElements;
private WizardSelectedAction doubleClickAction = new WizardSelectedAction();
private String label;
private FormBrowser descriptionBrowser;
private boolean _firstTimeShow = true;
private class WizardSelectedAction extends Action {
public WizardSelectedAction() {
super( "wizardSelection" ); //$NON-NLS-1$
}
public void run() {
selectionChanged( new SelectionChangedEvent( wizardSelectionViewer, wizardSelectionViewer.getSelection() ) );
advanceToNextPage();
}
}
static class WizardFilter extends ViewerFilter {
public boolean select( Viewer viewer, Object parentElement, Object element ) {
return true;
}
}
/**
* Constructor
*
* @param wizardElements
* a list of TemplateElementWizard objects
* @param page
* content wizard page
* @param message
* message to provide to the user
*/
public BBTemplateSelectionPage( ElementList wizardElements, BlackBerryProjectWizardPageTwo page, String message ) {
super( "List Selection" );
this.wizardElements = wizardElements;
this.label = message;
fContentPage = page;
descriptionBrowser = new FormBrowser( SWT.BORDER | SWT.V_SCROLL );
descriptionBrowser.setText( "" ); //$NON-NLS-1$
setTitle( Messages.BBTemplateSelectionPage_title );
setDescription( Messages.BBTemplateSelectionPage_desc );
}
/*
* (non-Javadoc)
*
* @see org.eclipse.pde.internal.ui.wizards.WizardListSelectionPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl( Composite parent ) {
Composite container = new Composite( parent, SWT.NONE );
GridLayout layout = new GridLayout();
layout.verticalSpacing = 10;
container.setLayout( layout );
container.setLayoutData( new GridData( GridData.FILL_BOTH ) );
createAbove( container, 1 );
Label label = new Label( container, SWT.NONE );
label.setText( getLabel() );
GridData gd = new GridData();
label.setLayoutData( gd );
SashForm sashForm = new SashForm( container, SWT.HORIZONTAL );
gd = new GridData( GridData.FILL_BOTH );
gd.widthHint = 300;
sashForm.setLayoutData( gd );
wizardSelectionViewer = new TableViewer( sashForm, SWT.BORDER );
wizardSelectionViewer.setContentProvider( new ListContentProvider() );
wizardSelectionViewer.setLabelProvider( ListUtil.TABLE_LABEL_PROVIDER );
// don't sort the template list
// wizardSelectionViewer.setComparator( ListUtil.NAME_COMPARATOR );
wizardSelectionViewer.addDoubleClickListener( new IDoubleClickListener() {
public void doubleClick( DoubleClickEvent event ) {
doubleClickAction.run();
}
} );
createDescriptionIn( sashForm );
createBelow( container, 1 );
initializeViewer();
wizardSelectionViewer.setInput( wizardElements );
wizardSelectionViewer.addSelectionChangedListener( this );
Dialog.applyDialogFont( container );
setControl( container );
PlatformUI.getWorkbench().getHelpSystem().setHelp( getControl(), IHelpContextIds.NEW_PROJECT_CODE_GEN_PAGE );
}
public void createAbove( Composite container, int span ) {
// do nothing
}
protected void initializeViewer() {
wizardSelectionViewer.addFilter( new WizardFilter() );
if( getInitialTemplateId() != null )
selectInitialTemplate();
}
private void selectInitialTemplate() {
Object[] children = wizardElements.getChildren();
for( int i = 0; i < children.length; i++ ) {
BBWizardElement welement = (BBWizardElement) children[ i ];
if( welement.getID().equals( getInitialTemplateId() ) ) {
wizardSelectionViewer.setSelection( new StructuredSelection( welement ), true );
setSelectedNode( createWizardNode( welement ) );
setDescriptionText( welement.getDescription() );
break;
}
}
}
protected IWizardNode createWizardNode( BBWizardElement element ) {
return new BBWizardNode( this, element ) {
public IBasePluginWizard createWizard() throws CoreException {
IPluginContentWizard wizard = (IPluginContentWizard) wizardElement.createExecutableExtension();
wizard.init( fContentPage.getData() );
return wizard;
}
};
}
public IPluginContentWizard getSelectedWizard() {
IWizardNode node = getSelectedNode();
if( node != null ) {
return (IPluginContentWizard) node.getWizard();
}
return null;
}
public boolean isPageComplete() {
return true;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.wizard.WizardSelectionPage#canFlipToNextPage()
*/
public boolean canFlipToNextPage() {
IStructuredSelection ssel = (IStructuredSelection) wizardSelectionViewer.getSelection();
if( ssel != null && !ssel.isEmpty() ) {
return true;
}
return false;
}
/**
* @return Returns the fInitialTemplateId.
*/
public String getInitialTemplateId() {
return fInitialTemplateId;
}
/**
* @param initialTemplateId
* The fInitialTemplateId to set.
*/
public void setInitialTemplateId( String initialTemplateId ) {
fInitialTemplateId = initialTemplateId;
}
public void setVisible( boolean visible ) {
if( visible ) {
wizardSelectionViewer.refresh();
}
super.setVisible( visible );
if( visible && _firstTimeShow ) {
_firstTimeShow = false;
focusAndSelectFirst();
}
}
/**
* @return Returns <code>false</code> if no Template is available, and <code>true</code> otherwise.
*/
public boolean isAnyTemplateAvailable() {
if( wizardSelectionViewer != null ) {
wizardSelectionViewer.refresh();
Object firstElement = wizardSelectionViewer.getElementAt( 0 );
if( firstElement != null ) {
return true;
}
}
return false;
}
protected void createBelow( Composite container, int span ) {
}
public void selectionChanged( SelectionChangedEvent event ) {
setErrorMessage( null );
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
BBWizardElement currentWizardSelection = null;
Iterator iter = selection.iterator();
if( iter.hasNext() )
currentWizardSelection = (BBWizardElement) iter.next();
if( currentWizardSelection == null ) {
setDescriptionText( "" ); //$NON-NLS-1$
setSelectedNode( null );
return;
}
final BBWizardElement finalSelection = currentWizardSelection;
setSelectedNode( createWizardNode( finalSelection ) );
setDescriptionText( finalSelection.getDescription() );
getContainer().updateButtons();
}
public IWizardPage getNextPage( boolean shouldCreate ) {
if( !shouldCreate )
return super.getNextPage();
IWizardNode selectedNode = getSelectedNode();
selectedNode.dispose();
IWizard wizard = selectedNode.getWizard();
if( wizard == null ) {
super.setSelectedNode( null );
return null;
}
if( shouldCreate )
// Allow the wizard to create its pages
wizard.addPages();
return wizard.getStartingPage();
}
protected void focusAndSelectFirst() {
Table table = wizardSelectionViewer.getTable();
table.setFocus();
TableItem[] items = table.getItems();
if( items.length > 0 ) {
TableItem first = items[ 0 ];
Object obj = first.getData();
wizardSelectionViewer.setSelection( new StructuredSelection( obj ) );
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
* java.lang.String, java.lang.Object)
*/
public void setInitializationData( IConfigurationElement config, String propertyName, Object data ) throws CoreException {
}
public void createDescriptionIn( Composite composite ) {
descriptionBrowser.createControl( composite );
Control c = descriptionBrowser.getControl();
GridData gd = new GridData( GridData.FILL_BOTH );
gd.widthHint = 200;
c.setLayoutData( gd );
}
public String getLabel() {
return label;
}
public void setDescriptionText( String text ) {
if( text == null )
text = PDEUIMessages.BaseWizardSelectionPage_noDesc;
descriptionBrowser.setText( text );
}
public void setDescriptionEnabled( boolean enabled ) {
Control dcontrol = descriptionBrowser.getControl();
if( dcontrol != null )
dcontrol.setEnabled( enabled );
}
public void advanceToNextPage() {
getContainer().showPage( getNextPage() );
}
public ElementList getWizardElements() {
return wizardElements;
}
}