package au.gov.ga.earthsci.model.ui.raster.wizard; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.gdal.gdal.Band; import org.gdal.gdal.Dataset; import au.gov.ga.earthsci.model.core.raster.GDALRasterModelParameters; /** * A wizard page that allows the user to select which raster band to use for * model generation * * @author James Navin (james.navin@ga.gov.au) * */ public class DatasetBandSelectPage extends AbstractWizardPage<GDALRasterModelParameters> { private final Dataset dataset; private Text scaleField; private Text offsetField; private Combo bandDropdown; private Text subsampleField; protected DatasetBandSelectPage(Dataset dataset, GDALRasterModelParameters params) { super(params, Messages.RasterModelBandSelectPage_PageTitle, Messages.RasterModelBandSelectPage_PageDescription); this.dataset = dataset; } @Override protected void addContents(Composite container) { // Raster band select addRasterBandGroup(container); // Scale and offset addScaleOffsetGroup(container); // Subsample addSubsampleGroup(container); } private void addRasterBandGroup(Composite container) { Group rasterBandGroup = addGroup(Messages.RasterModelBandSelectPage_BandSelectGroupTitle, Messages.RasterModelBandSelectPage_BandSelectGroupDescription, container); Label bandLabel = new Label(rasterBandGroup, SWT.NONE); bandLabel.setText(Messages.RasterModelBandSelectPage_BandSelectDropdownLabel); bandDropdown = createBandDropdown(rasterBandGroup); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; bandDropdown.setLayoutData(gd); } private void addScaleOffsetGroup(Composite container) { Group scaleOffsetBandGroup = addGroup(Messages.RasterModelBandSelectPage_ScaleOffsetGroupTitle, Messages.RasterModelBandSelectPage_ScaleOffsetGroupDescription, container); Label scaleLabel = new Label(scaleOffsetBandGroup, SWT.NONE); scaleLabel.setText(Messages.RasterModelBandSelectPage_ScaleFieldLabel); scaleField = new Text(scaleOffsetBandGroup, SWT.SINGLE | SWT.BORDER); scaleField.setText(params.getScaleFactor() == null ? "" : params.getScaleFactor().toString()); //$NON-NLS-1$ scaleField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); registerField(scaleField); Label offsetLabel = new Label(scaleOffsetBandGroup, SWT.NONE); offsetLabel.setText(Messages.RasterModelBandSelectPage_OffsetFieldLabel); offsetField = new Text(scaleOffsetBandGroup, SWT.SINGLE | SWT.BORDER); offsetField.setText(params.getOffset() == null ? "" : params.getOffset().toString()); //$NON-NLS-1$ offsetField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); registerField(offsetField); } private void addSubsampleGroup(Composite container) { Group subsampleGroup = addGroup( Messages.RasterModelBandSelectPage_SubsampleGroupTitle, Messages.RasterModelBandSelectPage_SubsampleGroupDescription, container, 1, true); Label subsampleLabel = new Label(subsampleGroup, SWT.NONE); subsampleLabel.setText(Messages.RasterModelBandSelectPage_SubsampleFactorLabel); subsampleField = new Text(subsampleGroup, SWT.BORDER); subsampleField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); registerField(subsampleField); } public Combo createBandDropdown(Composite parent) { Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.SINGLE | SWT.READ_ONLY); for (int i = 1; i <= dataset.GetRasterCount(); i++) { Band band = dataset.GetRasterBand(i); if (band == null) { continue; } String entry = Messages.RasterModelBandSelectPage_BandDropdownPrefix + band.GetBand() + " " //$NON-NLS-1$ + band.GetDescription(); combo.add(entry); } combo.select(params.getElevationBandIndex() - 1); return combo; } @Override public void bind() { params.setElevationBandIndex(bandDropdown.getSelectionIndex() + 1); // Bands are 1-indexed params.setScaleFactor(getDoubleOrNull(scaleField.getText())); params.setOffset(getDoubleOrNull(offsetField.getText())); params.setSubsample(getIntegerOrNull(subsampleField.getText())); } @Override protected void validate() { if (!isNumericOrEmpty(scaleField.getText())) { markInvalid(scaleField, Messages.RasterModelBandSelectPage_InvalidScaleMessage); } if (!isNumericOrEmpty(offsetField.getText())) { markInvalid(offsetField, Messages.RasterModelBandSelectPage_InvalidOffsetMessage); } if (!isIntegerOrEmpty(subsampleField.getText())) { markInvalid(subsampleField, Messages.RasterModelBandSelectPage_SubsampleFactorValidationMessage); } } }