/* Spatial Operations & Editing Tools for uDig * * Axios Engineering under a funding contract with: * Diputación Foral de Gipuzkoa, Ordenación Territorial * * http://b5m.gipuzkoa.net * http://www.axios.es * * (C) 2006, Diputación Foral de Gipuzkoa, Ordenación Territorial (DFG-OT). * DFG-OT agrees to licence under Lesser General Public License (LGPL). * * You can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software * Foundation; version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package es.axios.udig.spatialoperations.internal.ui.parameters.fill; import net.refractions.udig.project.ILayer; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Group; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.opengis.filter.Filter; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.Geometry; import es.axios.udig.spatialoperations.internal.i18n.Messages; import es.axios.udig.spatialoperations.internal.ui.processconnectors.FillCommand; import es.axios.udig.spatialoperations.ui.common.ResultLayerComposite; import es.axios.udig.spatialoperations.ui.common.TargetLayerListenerAdapter; import es.axios.udig.spatialoperations.ui.parameters.AggregatedPresenter; import es.axios.udig.spatialoperations.ui.parameters.ISOCommand; import es.axios.udig.spatialoperations.ui.parameters.SpatialOperationCommand.ParameterName; import es.axios.udig.ui.commons.util.LayerUtil; import es.axios.udig.ui.commons.util.MapUtil; /** * Input data for fill operation. * <p> * This contains the widgets required to capture the inputs for fill operation. * </p> * * @author Aritz Davila (www.axios.es) * @author Mauricio Pazos (www.axios.es) * @author Alain Jimeno (www.axios.es) * @since 1.2.0 */ final class FillComposite extends AggregatedPresenter { private static final int GRID_DATA_1_WIDTH_HINT = 105; private static final int GRID_DATA_2_WIDTH_HINT = 150; private static final int GRID_DATA_4_WIDTH_HINT = 45; private static final String SOURCE_LEGEND = "SourceLegend"; //$NON-NLS-1$ private static final String REFERENCE_LEGEND = "ReferenceLegend"; //$NON-NLS-1$ // widgets private Group groupSourceInputs = null; private Group groupTargetInputs = null; private Button checkButtonCopy = null; private ResultLayerComposite resultComposite = null; private CLabel cLabel = null; private CLabel cLabel1 = null; private CLabel cLabelFeaturesInFirstLayer = null; private CLabel cLabel3 = null; private CCombo comboSecondLayer = null; private CLabel cLabel4 = null; private CLabel cLabelFeaturesInSecondLayer = null; private CCombo comboFirstLayer = null; private CLabel sourceLegend = null; private CLabel referenceLegend = null; private TabFolder tabFolder = null; private Composite basicComposite = null; private Composite advancedComposite = null; private ImageRegistry imagesRegistry = null; // parameters private ILayer currentFirstLayer = null; private ILayer currentSecondLayer = null; public FillComposite(Composite parent, int style) { super(parent, style); super.initialize(); } @Override protected void createContents() { GridLayout gridLayout = new GridLayout(); setLayout(gridLayout); this.imagesRegistry = CreateImageRegistry(); GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.grabExcessVerticalSpace = true; gridData.grabExcessHorizontalSpace = true; gridData.verticalAlignment = GridData.FILL; tabFolder = new TabFolder(this, SWT.NONE); tabFolder.setLayoutData(gridData); basicComposite = new Composite(tabFolder, SWT.NONE); basicComposite.setLayoutData(gridData); basicComposite.setLayout(gridLayout); advancedComposite = new Composite(tabFolder, SWT.NONE); advancedComposite.setLayoutData(gridData); advancedComposite.setLayout(gridLayout); createGroupSourceInputs(basicComposite); createGroupTargetInputs(basicComposite); TabItem tabItem = new TabItem(tabFolder, SWT.NONE); tabItem.setText(Messages.Composite_tab_folder_basic); tabItem.setControl(basicComposite); } private ImageRegistry CreateImageRegistry() { ImageRegistry registry = new ImageRegistry(); String imgFile = "images/" + SOURCE_LEGEND + ".gif"; //$NON-NLS-1$ //$NON-NLS-2$ registry.put(SOURCE_LEGEND, ImageDescriptor.createFromFile(FillComposite.class, imgFile)); imgFile = "images/" + REFERENCE_LEGEND + ".gif"; //$NON-NLS-1$ //$NON-NLS-2$ registry.put(REFERENCE_LEGEND, ImageDescriptor.createFromFile(FillComposite.class, imgFile)); return registry; } /** * This method initializes group for source inputs */ private void createGroupSourceInputs(Composite basicComposite) { GridData gridData11 = new GridData(); gridData11.horizontalAlignment = GridData.BEGINNING; gridData11.grabExcessHorizontalSpace = false; gridData11.grabExcessVerticalSpace = true; gridData11.verticalAlignment = GridData.CENTER; gridData11.widthHint = GRID_DATA_1_WIDTH_HINT; GridData gridData12 = new GridData(); gridData12.horizontalAlignment = GridData.BEGINNING; gridData12.grabExcessHorizontalSpace = false; gridData12.grabExcessVerticalSpace = true; gridData12.verticalAlignment = GridData.CENTER; gridData12.widthHint = GRID_DATA_2_WIDTH_HINT; GridData gridData13 = new GridData(); gridData13.horizontalAlignment = GridData.BEGINNING; gridData13.grabExcessHorizontalSpace = false; gridData13.grabExcessVerticalSpace = true; gridData13.verticalAlignment = GridData.CENTER; // gridData13.widthHint = GRID_DATA_3_WIDTH_HINT; GridData gridData14 = new GridData(); gridData14.horizontalAlignment = GridData.BEGINNING; gridData14.grabExcessHorizontalSpace = true; gridData14.verticalAlignment = GridData.CENTER; gridData14.widthHint = GRID_DATA_4_WIDTH_HINT; GridData gridData21 = new GridData(); gridData21.horizontalAlignment = GridData.BEGINNING; gridData21.grabExcessHorizontalSpace = false; gridData21.grabExcessVerticalSpace = true; gridData21.verticalAlignment = GridData.CENTER; gridData21.widthHint = GRID_DATA_1_WIDTH_HINT; GridData gridData22 = new GridData(); gridData22.horizontalAlignment = GridData.BEGINNING; gridData22.grabExcessHorizontalSpace = false; gridData22.grabExcessVerticalSpace = true; gridData22.verticalAlignment = GridData.CENTER; gridData22.widthHint = GRID_DATA_2_WIDTH_HINT; GridData gridData23 = new GridData(); gridData23.horizontalAlignment = GridData.BEGINNING; gridData23.grabExcessHorizontalSpace = false; gridData23.grabExcessVerticalSpace = true; gridData23.verticalAlignment = GridData.CENTER; // gridData23.widthHint = GRID_DATA_3_WIDTH_HINT; GridData gridData24 = new GridData(); gridData24.horizontalAlignment = GridData.BEGINNING; gridData24.grabExcessHorizontalSpace = true; gridData24.verticalAlignment = GridData.CENTER; gridData24.widthHint = GRID_DATA_4_WIDTH_HINT; GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = false; gridData.verticalAlignment = GridData.CENTER; GridData gridData5 = new GridData(); gridData5.horizontalAlignment = GridData.BEGINNING; gridData5.grabExcessHorizontalSpace = false; gridData5.verticalAlignment = GridData.CENTER; GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 5; groupSourceInputs = new Group(basicComposite, SWT.NONE); groupSourceInputs.setText(Messages.Composite_source_group); groupSourceInputs.setLayout(gridLayout); groupSourceInputs.setLayoutData(gridData); cLabel = new CLabel(groupSourceInputs, SWT.NONE); cLabel.setText(Messages.FillComposite_Source_layer + ":"); //$NON-NLS-1$ cLabel.setLayoutData(gridData11); comboFirstLayer = new CCombo(groupSourceInputs, SWT.BORDER | SWT.READ_ONLY); comboFirstLayer.setLayoutData(gridData12); this.comboFirstLayer.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectedFirstLayerActions(); } }); sourceLegend = new CLabel(groupSourceInputs, SWT.NONE); sourceLegend.setText(""); //$NON-NLS-1$ sourceLegend.setLayoutData(gridData5); sourceLegend.setImage(this.imagesRegistry.get(SOURCE_LEGEND)); cLabel1 = new CLabel(groupSourceInputs, SWT.NONE); cLabel1.setText(Messages.DissolveComposite_selected_features + ":"); //$NON-NLS-1$ cLabel1.setLayoutData(gridData13); cLabelFeaturesInFirstLayer = new CLabel(groupSourceInputs, SWT.NONE); cLabelFeaturesInFirstLayer.setText(""); //$NON-NLS-1$ cLabelFeaturesInFirstLayer.setLayoutData(gridData14); cLabel3 = new CLabel(groupSourceInputs, SWT.NONE); cLabel3.setText(Messages.FillComposite_Reference_layer + ":"); //$NON-NLS-1$ cLabel3.setLayoutData(gridData21); comboSecondLayer = new CCombo(groupSourceInputs, SWT.BORDER | SWT.READ_ONLY); comboSecondLayer.setLayoutData(gridData22); this.comboSecondLayer.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectedSecondLayerActions(); } }); referenceLegend = new CLabel(groupSourceInputs, SWT.NONE); referenceLegend.setText(""); //$NON-NLS-1$ referenceLegend.setLayoutData(gridData5); referenceLegend.setImage(this.imagesRegistry.get(REFERENCE_LEGEND)); cLabel4 = new CLabel(groupSourceInputs, SWT.NONE); cLabel4.setText(Messages.DissolveComposite_selected_features + ":"); //$NON-NLS-1$ cLabel4.setLayoutData(gridData23); cLabelFeaturesInSecondLayer = new CLabel(groupSourceInputs, SWT.NONE); cLabelFeaturesInSecondLayer.setText(""); //$NON-NLS-1$ cLabelFeaturesInSecondLayer.setLayoutData(gridData24); } private void createGroupTargetInputs(Composite basicComposite) { GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.grabExcessHorizontalSpace = true; gridData.grabExcessVerticalSpace = false; gridData.verticalAlignment = GridData.BEGINNING; groupTargetInputs = new Group(basicComposite, SWT.NONE); groupTargetInputs.setText(Messages.Composite_result_group); groupTargetInputs.setLayout(new GridLayout()); groupTargetInputs.setLayoutData(gridData); this.resultComposite = new ResultLayerComposite(this, groupTargetInputs, SWT.NONE, GRID_DATA_1_WIDTH_HINT); GridData resultCompositeGridData = new GridData(); resultCompositeGridData.horizontalAlignment = GridData.FILL; resultCompositeGridData.grabExcessHorizontalSpace = true; resultCompositeGridData.grabExcessVerticalSpace = true; resultCompositeGridData.verticalAlignment = GridData.FILL; this.resultComposite.setLayoutData(resultCompositeGridData); this.resultComposite.addSpecifiedLayerListener(new TargetLayerListenerAdapter() { @Override public void validateTargetLayer() { validateParameters(); enableCopyFeatures(); } }); // copy check box checkButtonCopy = new Button(groupTargetInputs, SWT.CHECK); checkButtonCopy.setText(Messages.FillComposite_CopyText); checkButtonCopy.setToolTipText(Messages.FillComposite_ToolTip); checkButtonCopy.setLayoutData(gridData); checkButtonCopy.addMouseListener(new MouseAdapter() { @Override public void mouseUp(MouseEvent e) { validateParameters(); } }); } /** * Copy Features check button behavior */ private void enableCopyFeatures() { FillCommand cmd = (FillCommand) getCommand(); ILayer firstLayer = cmd.getFirstLayer(); ILayer targetLayer = cmd.getTargetLayer(); boolean enabled = (firstLayer != null) && !firstLayer.equals(targetLayer); checkButtonCopy.setEnabled(enabled); if (!enabled) { checkButtonCopy.setSelection(false); } } /** * Populates layers comboBox with the current layers. */ @Override protected void populate() { loadComboWithLayerList(this.comboFirstLayer, ParameterName.SOURCE_GEOMETRY_CLASS); loadComboWithLayerList(this.comboSecondLayer, ParameterName.REFERENCE_GEOMETRY_CLASS); selectDefaultLayer(); } /** * Sets the selected First layer and its features has current. */ private void selectedFirstLayerActions() { ILayer selectedLayer = getSelecedLayer(this.comboFirstLayer); if (selectedLayer == null) { return; } setCurrentFirstLayer(selectedLayer); validateParameters(); } /** * Sets the selected layer in map has default for first layer. */ private void selectDefaultLayer() { // synchronizes the command values with the default widget values FillCommand cmd = (FillCommand) getCommand(); // sets the first layer as current this.currentFirstLayer = cmd.getFirstLayer(); if (this.currentFirstLayer == null) { ILayer selected = MapUtil.getSelectedLayer(getCurrentMap()); if (LayerUtil.isCompatible(selected, cmd.getDomainValues(ParameterName.SOURCE_GEOMETRY_CLASS))) { this.currentFirstLayer = selected; } } setCurrentFirstLayer(this.currentFirstLayer); changeSelectedLayer(this.currentFirstLayer, this.comboFirstLayer); // sets the second layer as current this.currentSecondLayer = cmd.getSecondLayer(); setCurrentSecondLayer(this.currentSecondLayer); changeSelectedLayer(this.currentSecondLayer, this.comboSecondLayer); } private void setCurrentFirstLayer(final ILayer selectedLayer) { if (selectedLayer == null) { return; } this.currentFirstLayer = selectedLayer; presentSelectionAllOrBBox(this.currentFirstLayer, this.currentFirstLayer.getFilter(), this.cLabelFeaturesInFirstLayer); } private void setCurrentSecondLayer(final ILayer selectedLayer) { if (selectedLayer == null) { return; } this.currentSecondLayer = selectedLayer; presentSelectionAllOrBBox(this.currentSecondLayer, this.currentSecondLayer.getFilter(), this.cLabelFeaturesInSecondLayer); } /** * Sets the selected Second layer and its features has current. */ private void selectedSecondLayerActions() { ILayer selectedLayer = getSelecedLayer(this.comboSecondLayer); if (selectedLayer == null) { return; } setCurrentSecondLayer(selectedLayer); validateParameters(); } @Override public void setEnabled(boolean enabled) { groupSourceInputs.setEnabled(enabled); groupTargetInputs.setEnabled(enabled); resultComposite.setEnabled(enabled); comboSecondLayer.setEnabled(enabled); comboFirstLayer.setEnabled(enabled); } /** * sets the fill command parameters */ @Override protected void setParametersOnCommand(ISOCommand command) { // Sets the parameters values in controller to do the validation FillCommand cmd = (FillCommand) command; Filter filterInFirstLayer = null; Filter filterInSecondLayer = null; CoordinateReferenceSystem currentFirstCRS = null; CoordinateReferenceSystem currentSecondCRS = null; if (this.currentFirstLayer != null) { currentFirstCRS = this.currentFirstLayer.getCRS(); filterInFirstLayer = getFilter(this.currentFirstLayer); } if (this.currentSecondLayer != null) { currentSecondCRS = this.currentSecondLayer.getCRS(); filterInSecondLayer = getFilter(this.currentSecondLayer); } // Start setting the parameters on the command. cmd.setInputParams(this.currentFirstLayer, currentFirstCRS, this.currentSecondLayer, currentSecondCRS, filterInFirstLayer, filterInSecondLayer); if (this.resultComposite.isLayerSelected()) { final ILayer targetLayer = this.resultComposite.getCurrentTargetLayer(); cmd.setOutputParams(targetLayer, checkButtonCopy.getSelection()); } else { // requires create a new layer final String layerName = this.resultComposite.getNewLayerName(); if (layerName != null) { final Class<? extends Geometry> targetClass = this.resultComposite.getTargetClass(); final CoordinateReferenceSystem targetCRS = getCurrentMapCrs(); cmd.setOutputParams(layerName, targetCRS, targetClass, checkButtonCopy.getSelection()); } } ; } /** * Changes the count of features selected of the selected layer */ @Override protected final void changedFilterSelectionActions(final ILayer layer, final Filter newFilter) { assert layer != null; assert newFilter != null; if (layer.equals(this.currentFirstLayer)) { presentSelectionAllOrBBox(this.currentFirstLayer, newFilter, this.cLabelFeaturesInFirstLayer); } if (layer.equals(this.currentSecondLayer)) { presentSelectionAllOrBBox(this.currentSecondLayer, newFilter, this.cLabelFeaturesInSecondLayer); } validateParameters(); } @Override protected void removeLayerListActions(ILayer layer) { if (layer.equals(this.currentFirstLayer)) { currentFirstLayer = null; } validateParameters(); } protected final void changedLayerListActions() { // change the list of layers comboFirstLayer.removeAll(); comboSecondLayer.removeAll(); populate(); selectedFirstLayerActions(); selectedSecondLayerActions(); } }