package net.refractions.linecleaner.ui; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import net.refractions.udig.project.ILayer; import net.refractions.udig.project.internal.ContextModel; import net.refractions.udig.project.internal.Layer; import net.refractions.udig.project.ui.internal.ApplicationGISInternal; import net.refractions.udig.project.ui.internal.ProjectUIPlugin; import net.refractions.udig.project.ui.internal.UDIGAdapterFactoryContentProvider; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.dialogs.ListSelectionDialog; public class DataSelectionPage extends WizardPage { private static final String TITLE = "Select the data to be used in the operation."; private static final String NAME = "Data Selection"; private static final ImageDescriptor IMAGE = null; private static final String PRIORITY_TIP = "The order of the layers determines the priority of the features when " + "a choice must be made between deleting two features. The feature with the highest " + "priority (at the top of the list) will be kept, and the others deleted."; protected List<ILayer> layers; protected org.eclipse.swt.widgets.List layersList; protected Button cleanse; protected Button clean; private Button up; private Button down; public DataSelectionPage(List<ILayer> incomingLayers) { super(NAME, TITLE, IMAGE); this.layers = new ArrayList<ILayer>(incomingLayers.size()); for (ILayer layer : incomingLayers) { this.layers.add(layer); } } private GridData createLeftGridData() { GridData leftGridData = new GridData(); leftGridData.horizontalAlignment = SWT.FILL; leftGridData.verticalAlignment = SWT.FILL; leftGridData.grabExcessHorizontalSpace = true; leftGridData.grabExcessVerticalSpace = true; return leftGridData; } private GridData createRightGridData() { GridData rightGridData = new GridData(); rightGridData.horizontalAlignment = SWT.BEGINNING; rightGridData.verticalAlignment = SWT.BEGINNING; rightGridData.grabExcessHorizontalSpace = false; rightGridData.grabExcessVerticalSpace = true; return rightGridData; } private GridData createTopGridData() { GridData topGridData = new GridData(); topGridData.horizontalAlignment = SWT.BEGINNING; topGridData.verticalAlignment = SWT.BEGINNING; topGridData.grabExcessHorizontalSpace = false; topGridData.grabExcessVerticalSpace = true; return topGridData; } private GridData createBottomGridData() { GridData bottomGridData = new GridData(); bottomGridData.horizontalAlignment = SWT.BEGINNING; bottomGridData.verticalAlignment = SWT.END; bottomGridData.grabExcessHorizontalSpace = false; bottomGridData.grabExcessVerticalSpace = false; return bottomGridData; } public void createControl(Composite parent) { /* * Grid Layouts and data configuration */ GridLayout mainLayout = new GridLayout(); mainLayout.numColumns = 2; mainLayout.makeColumnsEqualWidth = false; GridLayout columnGridLayout = new GridLayout(); columnGridLayout.numColumns = 1; /* * Composite configurations */ Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(mainLayout); Composite left = new Composite(composite, SWT.NULL); left.setLayoutData(createLeftGridData()); left.setLayout(columnGridLayout); Composite right = new Composite(composite, SWT.NULL); right.setLayoutData(createRightGridData()); right.setLayout(columnGridLayout); /* * Other widget configurations */ /* * Left column */ Label label = new Label(left, SWT.WRAP); label.setText("Choose the layers to process:"); label.setToolTipText(PRIORITY_TIP); label.setLayoutData(new GridData()); GridLayout layersGridLayout = new GridLayout(2, false); /* * LayersList sub-Composite */ Composite layersComposite = new Composite(left, SWT.NULL); layersComposite.setLayoutData(createLeftGridData()); layersComposite.setLayout(layersGridLayout); layersList = new org.eclipse.swt.widgets.List(layersComposite, SWT.SINGLE | SWT.BORDER); layersList.setToolTipText(PRIORITY_TIP); for (int i = 0; i < layers.size(); i++) { ILayer layer = layers.get(i); layersList.add(layer.getName()); } layersList.select(0); layersList.setLayoutData(createLeftGridData()); layersList.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { if (layersList.getSelectionCount() > 0) { up.setEnabled(true); down.setEnabled(true); } else { up.setEnabled(false); down.setEnabled(false); } updateButtons(); } public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } }); Composite layersRightColumn = new Composite(layersComposite, SWT.NULL); layersRightColumn.setLayout(new GridLayout(1, false)); Composite layersRightTopRow = new Composite(layersRightColumn, SWT.NULL); layersRightTopRow.setLayout(new GridLayout(1, false)); layersRightTopRow.setLayoutData(createRightGridData()); Composite layersRightBottomRow = new Composite(layersRightColumn, SWT.NULL); layersRightBottomRow.setLayout(new GridLayout(1, false)); layersRightBottomRow.setLayoutData(createRightGridData()); /* * Top of the layersList right column */ up = new Button(layersRightTopRow, SWT.PUSH); up.setText("Up"); up.setLayoutData(createTopGridData()); up.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { String[] items = layersList.getItems(); int index = layersList.getSelectionIndex(); if (index <= 0) { return; } swap (items, index, index-1); layersList.setItems(items); layersList.setSelection(index-1); } public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } }); down = new Button(layersRightTopRow, SWT.PUSH); down.setLayoutData(createTopGridData()); down.setText("Down"); down.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { String[] items = layersList.getItems(); int index = layersList.getSelectionIndex(); if (index >= items.length-1) { return; } swap (items, index, index+1); layersList.setItems(items); layersList.select(index+1); } public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } }); /* * Bottom of the layersList right column */ Button add = new Button(layersRightBottomRow, SWT.PUSH); add.setLayoutData(createBottomGridData()); add.setText("Add..."); add.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { String message = "Select one or more layers."; AdapterFactoryLabelProvider labelProvider = new AdapterFactoryLabelProvider(ProjectUIPlugin.getDefault().getAdapterFactory()); UDIGAdapterFactoryContentProvider contentProvider = new UDIGAdapterFactoryContentProvider(ProjectUIPlugin.getDefault().getAdapterFactory()); ContextModel contextModel = ApplicationGISInternal.getActiveMap().getContextModel(); Object input = contextModel; ListSelectionDialog dialog = new ListSelectionDialog( getWizard().getContainer().getShell(), input , contentProvider, labelProvider, message); int result = dialog.open(); if (result == Dialog.CANCEL) { return; } Object[] chosenLayers = dialog.getResult(); List<String> items = Arrays.asList(layersList.getItems()); List<String> results = new ArrayList<String>(); results.addAll(items); for (Object obj : chosenLayers) { ILayer layer = (ILayer) obj; String layerName = layer.getName(); if (!results.contains(layerName)) { results.add(layerName); layers.add(layer); } } layersList.setItems(results.toArray(new String[results.size()])); layersList.setSelection(0); updateButtons(); } public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } }); Button remove = new Button(layersRightBottomRow, SWT.PUSH); remove.setLayoutData(createBottomGridData()); remove.setText("Remove"); remove.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { List<String> items = Arrays.asList(layersList.getItems()); List<String> selected = Arrays.asList(layersList.getSelection()); List<String> result = new ArrayList<String>(); for (String string : items) { if (!selected.contains(string)) { result.add(string); } } layersList.setItems(result.toArray(new String[result.size()])); layersList.setSelection(0); updateButtons(); } public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } }); /* * End of LayersList sub-Composite */ /* * Right column */ label = new Label(right, SWT.WRAP); label.setText("Operations to be performed:"); cleanse = new Button(right, SWT.CHECK); cleanse.setText("Data Preparation"); cleanse.setSelection(true); cleanse.addSelectionListener(updateButtons); clean = new Button(right, SWT.CHECK); clean.setText("Light Conflation"); clean.setSelection(true); clean.addSelectionListener(updateButtons); setControl(composite); } protected void swap(String[] items, int index, int i) { String temp = items[index]; items[index] = items[i]; items[i] = temp; } @Override public boolean isPageComplete() { if (layersList.getSelectionCount() < 1 ) { setErrorMessage("At least one or more layers must be chosen."); return false; } if (!cleanse.getSelection() && !clean.getSelection()) { setErrorMessage("At least one of the operations must be checked."); return false; } setErrorMessage(null); return true; } private void updateButtons() { getWizard().getContainer().updateButtons(); } private UpdateSelectionListener updateButtons = new UpdateSelectionListener(); private class UpdateSelectionListener extends SelectionAdapter { @Override public void widgetSelected(SelectionEvent e) { widgetDefaultSelected(e); } @Override public void widgetDefaultSelected(SelectionEvent e) { updateButtons(); } } }