code: package org.applause.lang.ui.wizard;
  
  import java.util.Arrays;
  
  import org.applause.lang.ui.builder.BuildStrategyRegistry;
  import org.applause.lang.ui.builder.MobilePlatform;
  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.ITableLabelProvider;
  import org.eclipse.jface.viewers.LabelProvider;
  import org.eclipse.jface.wizard.WizardPage;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.graphics.Image;
  import org.eclipse.swt.layout.GridData;
  import org.eclipse.swt.layout.GridLayout;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Table;
  
  public class GeneratorFragmentSelectionWizardPage extends WizardPage {
  	private class TableLabelProvider extends LabelProvider implements ITableLabelProvider {
  		public Image getColumnImage(Object element, int columnIndex) {
  			return null;
  		}
  		public String getColumnText(Object element, int columnIndex) {
  			if (element instanceof MobilePlatform) {
  				MobilePlatform platform = (MobilePlatform) element;
  				return platform.getName();
  			}
  			return element.toString();
  		}
  	}
  	private Table table;
  	private CheckboxTableViewer checkboxTableViewer;
  
  	/**
  	 * Create the wizard.
  	 */
  	public GeneratorFragmentSelectionWizardPage() {
  		super("platformSelectionPage");
  		setTitle("Target Platform Selection");
  		setDescription("Choose one or more target platforms for your project.");
  		validatePage();
  	}
  	
  	private void validatePage() {
  		if (getSelectedPlatforms().length > 0) {
  			setPageComplete(true);
  			setErrorMessage(null);
  		}
  		else {
  			setPageComplete(false);
  			setErrorMessage("Please choose one or more target platforms for your project.");
  		}
  	}
  
  	/**
  	 * Create contents of the wizard.
  	 * @param parent
  	 */
  	public void createControl(Composite parent) {
  		Composite container = new Composite(parent, SWT.NULL);
  
  		setControl(container);
  		container.setLayout(new GridLayout(1, false));
  		
  		checkboxTableViewer = CheckboxTableViewer.newCheckList(container, SWT.BORDER | SWT.FULL_SELECTION);
  		table = checkboxTableViewer.getTable();
  		GridData gd_table = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
  		gd_table.heightHint = 272;
  		gd_table.widthHint = 581;
  		table.setLayoutData(gd_table);
  		checkboxTableViewer.setLabelProvider(new TableLabelProvider());
  		checkboxTableViewer.setContentProvider(new ArrayContentProvider());
  		checkboxTableViewer.setInput(BuildStrategyRegistry.getSupportedMobilePlatforms());
  		
  		checkboxTableViewer.addCheckStateListener((new ICheckStateListener() {
  			@Override
  			public void checkStateChanged(CheckStateChangedEvent event) {
  				validatePage();	
  			}
  		}));
  	}
  	
  	public MobilePlatform[] getSelectedPlatforms() {
  		if (isControlCreated() ) {
  			Object[] checkedElements = checkboxTableViewer.getCheckedElements();
  			MobilePlatform[] platforms = Arrays.asList(checkedElements).toArray(new MobilePlatform[checkedElements.length]);
  			return platforms;
  		}
  		else {
  			return new MobilePlatform[0];
  		}
  	}
  	
  }
  