package eu.esdihumboldt.hale.io.interpolation.ui; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; 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 eu.esdihumboldt.hale.common.core.io.IOProvider; import eu.esdihumboldt.hale.common.core.io.Value; import eu.esdihumboldt.hale.common.instance.geometry.InterpolationHelper; import eu.esdihumboldt.hale.ui.io.IOWizard; import eu.esdihumboldt.hale.ui.io.config.AbstractConfigurationPage; import eu.esdihumboldt.util.geometry.interpolation.extension.InterpolationAlgorithmFactory; import eu.esdihumboldt.util.geometry.interpolation.extension.InterpolationExtension; import eu.esdihumboldt.util.geometry.interpolation.grid.GridInterpolation; /** * Configuration page for specifying maximum position error for interpolation * * @author Arun * */ public class InterpolationSettingPage extends AbstractConfigurationPage<IOProvider, IOWizard<IOProvider>> { private Text error; private Button moveToGrid; private ComboViewer algorithms; /** * Default constructor */ public InterpolationSettingPage() { super("interpolation.basicSettings", "Interpolation", null); setDescription("Settings for geometry interpolation (Arcs)"); } @Override public void enable() { // do nothing } @Override public void disable() { // do nothing } @Override public boolean updateConfiguration(IOProvider provider) { // set interpolation algorithm Value alg = null; ISelection sel = algorithms.getSelection(); if (!sel.isEmpty() && sel instanceof IStructuredSelection) { Object selected = ((IStructuredSelection) sel).getFirstElement(); if (selected instanceof InterpolationAlgorithmFactory) { String id = ((InterpolationAlgorithmFactory) selected).getIdentifier(); alg = Value.of(id); } } provider.setParameter(InterpolationHelper.PARAMETER_INTERPOLATION_ALGORITHM, alg); // set maximum positional error provider.setParameter(InterpolationHelper.PARAMETER_MAX_POSITION_ERROR, Value.of(error.getText())); // set move to grid flag provider.setParameter(GridInterpolation.PARAMETER_MOVE_ALL_TO_GRID, Value.of(moveToGrid.getSelection())); return true; } @Override protected void createContent(Composite page) { // page.setLayout(GridLayoutFactory.swtDefaults().numColumns(3).create()); page.setLayout(new GridLayout(1, false)); Group groupError = new Group(page, SWT.NONE); GridLayoutFactory.swtDefaults().numColumns(3).applyTo(groupError); // GridDataFactory.fillDefaults().grab(true, false).applyTo(groupError); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(groupError); groupError.setText("Interpolated geometries"); // Interpolation algorithm Label labelAlg = new Label(groupError, SWT.NONE); labelAlg.setText("Interpolation algorithm: "); labelAlg.setLayoutData(GridDataFactory.swtDefaults().align(SWT.END, SWT.CENTER).create()); algorithms = new ComboViewer(groupError, SWT.READ_ONLY); algorithms.setContentProvider(ArrayContentProvider.getInstance()); algorithms.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof InterpolationAlgorithmFactory) { return ((InterpolationAlgorithmFactory) element).getDisplayName(); } return super.getText(element); } }); algorithms.getControl().setLayoutData(GridDataFactory.swtDefaults() .align(SWT.FILL, SWT.CENTER).grab(true, false).span(2, 1).create()); algorithms.setInput(InterpolationExtension.getInstance().getFactories()); algorithms.setSelection(new StructuredSelection(InterpolationExtension.getInstance() .getFactory(InterpolationHelper.DEFAULT_ALGORITHM))); algorithms.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateState(); } }); // label error Label labelError = new Label(groupError, SWT.NONE); labelError.setText("Maximum Position Error: "); labelError.setLayoutData(GridDataFactory.swtDefaults().align(SWT.END, SWT.CENTER).create()); error = new Text(groupError, SWT.BORDER | SWT.SINGLE); error.setLayoutData(GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER) .grab(true, false).create()); error.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { updateState(); } }); // label unit Label labelUnit = new Label(groupError, SWT.NONE); labelUnit.setText("(unit)"); labelUnit.setLayoutData(GridDataFactory.swtDefaults().align(SWT.END, SWT.CENTER).create()); Label positionErrorDesc = new Label(groupError, SWT.NONE); positionErrorDesc.setText( "The maximum positional error is used by the interpolation algorithm to ensure a certain level of accuracy."); GridDataFactory.fillDefaults().span(3, 1).applyTo(positionErrorDesc); Group group = new Group(page, SWT.NONE); group.setLayout(new GridLayout(1, false)); group.setText("Other geometries"); GridDataFactory.fillDefaults().span(3, 1).applyTo(group); moveToGrid = new Button(group, SWT.CHECK); moveToGrid.setText("Move all geometries to interpolation grid (if applicable)"); GridDataFactory.fillDefaults().grab(true, false).applyTo(moveToGrid); // default moveToGrid.setSelection(false); Label desc = new Label(group, SWT.NONE); desc.setText( "Moves all geometries coordinates to the interpolation grid to allow for topological consistency with interpolated geometries."); GridDataFactory.fillDefaults().grab(true, false).applyTo(desc); // filler new Label(page, SWT.NONE); // label with warning message Composite warnComp = new Composite(page, SWT.NONE); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(warnComp); GridDataFactory.fillDefaults().grab(true, false).applyTo(warnComp); updateState(); setPageComplete(false); } @Override protected void onShowPage(boolean firstShow) { if (firstShow) { loadPreValue(getWizard().getProvider()); setPageComplete(true); } } private boolean validateMaxError() { String txt = error.getText(); if (txt == null || txt.equals("")) { return false; } else { try { @SuppressWarnings("unused") double val = Double.parseDouble(txt); return true; } catch (NumberFormatException ex) { return false; } } } /** * Load max position error value * * @param provider the I/O provider to get */ private void loadPreValue(IOProvider provider) { // load interpolation algorithm String id = provider.getParameter(InterpolationHelper.PARAMETER_INTERPOLATION_ALGORITHM) .as(String.class, InterpolationHelper.DEFAULT_ALGORITHM); InterpolationAlgorithmFactory fact = InterpolationExtension.getInstance().getFactory(id); if (fact == null) { fact = InterpolationExtension.getInstance() .getFactory(InterpolationHelper.DEFAULT_ALGORITHM); } ISelection selection; if (fact == null) { selection = new StructuredSelection(); } else { selection = new StructuredSelection(fact); } algorithms.setSelection(selection); // load maximum positional error Double value = provider.getParameter(InterpolationHelper.PARAMETER_MAX_POSITION_ERROR) .as(Double.class); if (value != null) { error.setText(Double.toString(value.doubleValue())); } else { error.setText(Double.toString(InterpolationHelper.DEFAULT_MAX_POSITION_ERROR)); } // load move to grid flag moveToGrid.setSelection(provider.getParameter(GridInterpolation.PARAMETER_MOVE_ALL_TO_GRID) .as(Boolean.class, false)); updateState(); } /** * Update the page state. */ private void updateState() { boolean complete = true; // enable/disable move to grid setting ISelection sel = algorithms.getSelection(); boolean isGridSelected = false; if (!sel.isEmpty() && sel instanceof IStructuredSelection) { Object selected = ((IStructuredSelection) sel).getFirstElement(); if (selected instanceof InterpolationAlgorithmFactory) { if (GridInterpolation.EXTENSION_ID .equals(((InterpolationAlgorithmFactory) selected).getIdentifier())) { isGridSelected = true; } } } moveToGrid.setEnabled(isGridSelected); if (!sel.isEmpty() && !isGridSelected) { // disable setting when other algorithm than grid interpolation is // selected moveToGrid.setSelection(false); } // state of maximum positional error if (!validateMaxError()) { setErrorMessage("The maximum positional error must be a floating point number."); complete = false; } else { setErrorMessage(null); } setPageComplete(complete); } }