/* uDig-Spatial Operations plugins
* http://b5m.gipuzkoa.net
* (C) 2006, DiputaciĆ³n Foral de Gipuzkoa, OrdenaciĆ³n Territorial.
*
* This library is free software; 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.clip;
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.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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.ClipCommand;
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;
/**
* Content for Clip operation.
* <p>
* This contains the widgets required to capture the inputs for clip operation.
* </p>
*
* @author Mauricio Pazos (www.axios.es)
* @author Aritz Davila (www.axios.es)
* @author Alain Jimeno (www.axios.es)
*
* @since 1.1.0
*/
final class ClipComposite extends AggregatedPresenter {
private static final int GRID_DATA_1_WIDTH_HINT = 100;
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$
private Group groupSource = null;
private CLabel cLabelClippingLayer = null;
private CCombo cComboUsingLayer = null;
private CLabel cLabel = null;
private CLabel textClippingFeatures = null;
private CLabel cLabelSourceToClipLayer = null;
private CCombo cComboSourceClipLayer = null;
private CLabel cLabelSourceFeaturesToClip = null;
private CLabel textSourceFeaturesToClip = null;
private Group groupTargetInputs = null;
private ResultLayerComposite resultComposite = null;
private TabFolder tabFolder = null;
private Composite basicComposite = null;
private Composite advancedComposite = null;
private CLabel sourceLegend = null;
private CLabel referenceLegend = null;
// data
private ILayer currentUsingLayer = null;
private ILayer currentSourceClipLayer = null;
private ImageRegistry imagesRegistry = null;
public ClipComposite(Composite parent, int style) {
super(parent, style);
super.initialize();
}
/**
* Initializes the content for inputs parameters
*/
@Override
protected final 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);
GridLayout sourceLayout = new GridLayout();
sourceLayout.numColumns = 5;
GridData gridData1 = new GridData();
gridData1.horizontalAlignment = GridData.FILL;
gridData1.grabExcessHorizontalSpace = true;
gridData1.verticalAlignment = GridData.CENTER;
groupSource = new Group(basicComposite, SWT.NONE);
groupSource.setLayoutData(gridData1);
groupSource.setLayout(sourceLayout);
groupSource.setText(Messages.ClipComposite_using_as_clip);
createGroupToClipLayer(groupSource);
createGroupClippingLayer(groupSource);
createGroupResult();
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(ClipComposite.class, imgFile));
imgFile = "images/" + REFERENCE_LEGEND + ".gif"; //$NON-NLS-1$ //$NON-NLS-2$
registry.put(REFERENCE_LEGEND, ImageDescriptor.createFromFile(ClipComposite.class, imgFile));
return registry;
}
/**
* This method initializes groupSource
*
* @param groupSource
*/
private void createGroupClippingLayer(final Group groupSource) {
GridData gridData1 = new GridData();
gridData1.horizontalAlignment = GridData.BEGINNING;
gridData1.verticalAlignment = GridData.CENTER;
gridData1.widthHint = GRID_DATA_1_WIDTH_HINT;
GridData gridData2 = new GridData();
gridData2.horizontalAlignment = GridData.BEGINNING;
gridData2.grabExcessHorizontalSpace = false;
gridData2.heightHint = -1;
gridData2.widthHint = GRID_DATA_2_WIDTH_HINT;
gridData2.verticalAlignment = GridData.CENTER;
GridData gridData3 = new GridData();
gridData3.horizontalAlignment = GridData.BEGINNING;
gridData3.grabExcessHorizontalSpace = false;
gridData3.heightHint = -1;
// gridData3.widthHint = GRID_DATA_3_WIDTH_HINT;
gridData3.verticalAlignment = GridData.CENTER;
GridData gridData4 = new GridData();
gridData4.grabExcessHorizontalSpace = true;
gridData4.verticalAlignment = GridData.CENTER;
gridData4.horizontalAlignment = GridData.BEGINNING;
gridData4.widthHint = GRID_DATA_4_WIDTH_HINT;
GridData gridData5 = new GridData();
gridData5.horizontalAlignment = GridData.BEGINNING;
gridData5.grabExcessHorizontalSpace = false;
gridData5.verticalAlignment = GridData.CENTER;
cLabelClippingLayer = new CLabel(groupSource, SWT.NONE);
cLabelClippingLayer.setText(Messages.ClipComposite_clipping_layer + ":"); //$NON-NLS-1$
cLabelClippingLayer.setLayoutData(gridData1);
cComboUsingLayer = new CCombo(groupSource, SWT.BORDER | SWT.READ_ONLY);
cComboUsingLayer.setLayoutData(gridData2);
cComboUsingLayer.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
selectedUsingLayerActions(cComboUsingLayer);
}
});
referenceLegend = new CLabel(groupSource, SWT.NONE);
referenceLegend.setText(""); //$NON-NLS-1$
referenceLegend.setLayoutData(gridData5);
referenceLegend.setImage(this.imagesRegistry.get(REFERENCE_LEGEND));
cLabel = new CLabel(groupSource, SWT.NONE);
cLabel.setText(Messages.ClipComposite_clipping_features + ":"); //$NON-NLS-1$
cLabel.setLayoutData(gridData3);
textClippingFeatures = new CLabel(groupSource, SWT.NONE);
textClippingFeatures.setText(""); //$NON-NLS-1$
textClippingFeatures.setLayoutData(gridData4);
textClippingFeatures.setEnabled(false);
}
/**
* creates "to clip layer" widgets
*
* @param groupSource
*
*/
private void createGroupToClipLayer(final Group groupSource) {
GridData gridData4 = new GridData();
gridData4.grabExcessHorizontalSpace = true;
gridData4.verticalAlignment = GridData.CENTER;
gridData4.horizontalAlignment = GridData.BEGINNING;
gridData4.widthHint = GRID_DATA_4_WIDTH_HINT;
GridData gridData3 = new GridData();
gridData3.horizontalAlignment = GridData.BEGINNING;
gridData3.grabExcessHorizontalSpace = false;
gridData3.verticalAlignment = GridData.CENTER;
// gridData3.widthHint = GRID_DATA_3_WIDTH_HINT;
GridData gridData2 = new GridData();
gridData2.horizontalAlignment = GridData.BEGINNING;
gridData2.grabExcessHorizontalSpace = false;
gridData2.verticalAlignment = GridData.CENTER;
gridData2.widthHint = GRID_DATA_2_WIDTH_HINT;
GridData gridData1 = new GridData();
gridData1.horizontalAlignment = GridData.BEGINNING;
gridData1.grabExcessHorizontalSpace = false;
gridData1.verticalAlignment = GridData.CENTER;
gridData1.widthHint = GRID_DATA_1_WIDTH_HINT;
GridData gridData5 = new GridData();
gridData5.horizontalAlignment = GridData.BEGINNING;
gridData5.grabExcessHorizontalSpace = false;
gridData5.verticalAlignment = GridData.CENTER;
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 5;
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = false;
gridData.grabExcessHorizontalSpace = true;
gridData.verticalAlignment = GridData.CENTER;
cLabelSourceToClipLayer = new CLabel(groupSource, SWT.NONE);
cLabelSourceToClipLayer.setText(Messages.ClipComposite_layer_to_clip + ":"); //$NON-NLS-1$
cLabelSourceToClipLayer.setLayoutData(gridData1);
cComboSourceClipLayer = new CCombo(groupSource, SWT.BORDER | SWT.READ_ONLY);
cComboSourceClipLayer.setLayoutData(gridData2);
cComboSourceClipLayer.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
selectedClipLayerActions(cComboSourceClipLayer);
}
});
sourceLegend = new CLabel(groupSource, SWT.NONE);
sourceLegend.setText(""); //$NON-NLS-1$
sourceLegend.setLayoutData(gridData5);
sourceLegend.setImage(this.imagesRegistry.get(SOURCE_LEGEND));
cLabelSourceFeaturesToClip = new CLabel(groupSource, SWT.NONE);
cLabelSourceFeaturesToClip.setText(Messages.ClipComposite_features_to_clip + ":"); //$NON-NLS-1$
cLabelSourceFeaturesToClip.setLayoutData(gridData3);
textSourceFeaturesToClip = new CLabel(groupSource, SWT.NONE);
textSourceFeaturesToClip.setText(""); //$NON-NLS-1$
textSourceFeaturesToClip.setLayoutData(gridData4);
}
private void createGroupResult() {
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.IntersectComposite_result);
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();
}
});
}
/**
* Reinitialize parameter values
*/
@Override
protected final void clearInputs() {
// initializes data using the values set by user in this session
ClipCommand cmd = (ClipCommand) getCommand();
this.currentUsingLayer = cmd.getCurrentUsingLayer();
this.currentSourceClipLayer = cmd.getCurrentSourceClipLayer();
// initializes widgets
this.cComboUsingLayer.removeAll();
this.cComboSourceClipLayer.removeAll();
this.textClippingFeatures.setText(""); //$NON-NLS-1$
this.textSourceFeaturesToClip.setText(""); //$NON-NLS-1$
tabFolder.setSelection(tabFolder.getItem(0));
}
/**
* Populates layer comboboxs with the current layers. Sets the current layer
* current has default for clipping layer.
*
*/
@Override
protected void populate() {
loadComboWithLayerList(this.cComboSourceClipLayer);
loadComboWithLayerList(this.cComboUsingLayer);
selectDefaultLayer();
}
/**
* 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.currentSourceClipLayer)) {
presentSelectionAllOrBBox(this.currentSourceClipLayer, newFilter, this.textSourceFeaturesToClip);
}
if (layer.equals(this.currentUsingLayer)) {
presentSelectionAllOrBBox(this.currentUsingLayer, newFilter, this.textClippingFeatures);
}
validateParameters();
}
/**
* Sets the selected layer in map has default clipping layer.
*/
private void selectDefaultLayer() {
ClipCommand cmd = (ClipCommand) getCommand();
this.currentSourceClipLayer = cmd.getCurrentSourceClipLayer();
if (this.currentSourceClipLayer == null) {
ILayer selected = MapUtil.getSelectedLayer(getCurrentMap());
if (LayerUtil.isCompatible(selected, cmd.getDomainValues(ParameterName.SOURCE_GEOMETRY_CLASS))) {
this.currentSourceClipLayer = selected;
}
}
setCurrentSourceClipLayer(this.currentSourceClipLayer);
changeSelectedLayer(this.currentSourceClipLayer, this.cComboSourceClipLayer);
this.currentUsingLayer = cmd.getCurrentUsingLayer();
setCurrentUsingLayer(this.currentUsingLayer);
changeSelectedLayer(this.currentUsingLayer, this.cComboUsingLayer);
}
@Override
public void setEnabled(boolean enabled) {
groupSource.setEnabled(enabled);
cComboUsingLayer.setEnabled(enabled);
cComboSourceClipLayer.setEnabled(enabled);
groupTargetInputs.setEnabled(enabled);
resultComposite.setEnabled(enabled);
}
/**
* @param selectedLayer
*/
private void setCurrentUsingLayer(ILayer selectedLayer) {
if (selectedLayer == null) {
return;
}
this.currentUsingLayer = selectedLayer;
presentSelectionAllOrBBox(this.currentUsingLayer, this.currentUsingLayer.getFilter(), this.textClippingFeatures);
validateParameters();
}
/**
* @param selectedLayer
*/
private void setCurrentSourceClipLayer(final ILayer selectedLayer) {
if (selectedLayer == null) {
return;
}
this.currentSourceClipLayer = selectedLayer;
presentSelectionAllOrBBox(this.currentSourceClipLayer, this.currentSourceClipLayer.getFilter(),
this.textSourceFeaturesToClip);
validateParameters();
}
/**
* Actions associated with layer selection.
*
* @param comboLayer
* @param textFeatures
*/
private void selectedClipLayerActions(final CCombo comboLayer) {
ILayer selectedLayer = getSelecedLayer(comboLayer);
if (selectedLayer == null) {
return;
}
setCurrentSourceClipLayer(selectedLayer);
}
/**
* Actions associated with layer selection.
*
* @param comboLayer
* @param textFeatures
*/
private void selectedUsingLayerActions(final CCombo comboLayer) {
ILayer selectedLayer = getSelecedLayer(comboLayer);
if (selectedLayer == null) {
return;
}
setCurrentUsingLayer(selectedLayer);
}
/**
* Sets the clip command parameters
*/
@Override
protected void setParametersOnCommand(ISOCommand command) {
// Sets the parameters values in controller to do the validation
ClipCommand cmd = (ClipCommand) command;
Filter usingFilter = null;
Filter clipSourceFilter = null;
CoordinateReferenceSystem currentUsingCRS = null;
CoordinateReferenceSystem currentSourceCRS = null;
if (this.currentUsingLayer != null) {
usingFilter = getFilter(this.currentUsingLayer);
currentUsingCRS = this.currentUsingLayer.getCRS();
}
if (this.currentSourceClipLayer != null) {
clipSourceFilter = getFilter(this.currentSourceClipLayer);
currentSourceCRS = this.currentSourceClipLayer.getCRS();
}
// Start setting the parameters on the command.
cmd.setInputParams(this.currentUsingLayer, currentUsingCRS, this.currentSourceClipLayer, currentSourceCRS,
usingFilter, clipSourceFilter);
if (this.resultComposite.isLayerSelected()) {
final ILayer targetLayer = this.resultComposite.getCurrentTargetLayer();
cmd.setOutputParams(targetLayer);
} else {
final String newFeatureTypeName = this.resultComposite.getNewLayerName();
if (newFeatureTypeName != null) {
final CoordinateReferenceSystem targetCrs = getCurrentMapCrs();
final Class<? extends Geometry> targetClass = this.resultComposite.getTargetClass();
cmd.setOutputParams(newFeatureTypeName, targetCrs, targetClass);
}
}
}
/**
* Initializes the widgets with default values.
*/
@Override
protected final void changedLayerListActions() {
// change the list of layers
cComboUsingLayer.removeAll();
cComboSourceClipLayer.removeAll();
populate();
// FIXME this has been already done inside populate()
// changeSelectedLayer(this.currentSourceClipLayer, this.cComboSourceClipLayer);
selectedClipLayerActions(this.cComboSourceClipLayer);
//
// changeSelectedLayer(this.currentUsingLayer, this.cComboUsingLayer);
selectedUsingLayerActions(this.cComboUsingLayer);
}
@Override
protected void removeLayerListActions(ILayer layer) {
if (layer.equals(this.currentSourceClipLayer)) {
currentSourceClipLayer = null;
}
validateParameters();
}
} // @jve:decl-index=0:visual-constraint="10,10"