Statistics
| Revision:

gvsig-lrs / org.gvsig.lrs / trunk / org.gvsig.lrs / org.gvsig.lrs.swing / org.gvsig.lrs.swing.impl / src / main / java / org / gvsig / lrs / swing / impl / JLrsCreateRouteParamsController.java @ 9

History | View | Annotate | Download (27.8 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2015 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.lrs.swing.impl;
24

    
25
import java.awt.Component;
26
import java.awt.event.ActionEvent;
27
import java.awt.event.ActionListener;
28
import java.awt.event.ItemEvent;
29
import java.awt.event.ItemListener;
30
import java.io.File;
31
import java.util.Locale;
32

    
33
import javax.swing.ComboBoxModel;
34
import javax.swing.DefaultComboBoxModel;
35
import javax.swing.DefaultListCellRenderer;
36
import javax.swing.JComponent;
37
import javax.swing.JLabel;
38
import javax.swing.JList;
39
import javax.swing.JOptionPane;
40
import javax.swing.ListCellRenderer;
41

    
42
import org.apache.commons.io.FileUtils;
43
import org.apache.commons.lang3.StringUtils;
44
import org.cresques.cts.IProjection;
45
import org.gvsig.fmap.dal.DALLocator;
46
import org.gvsig.fmap.dal.DataManager;
47
import org.gvsig.fmap.dal.DataParameters;
48
import org.gvsig.fmap.dal.DataStoreParameters;
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.exception.ReadException;
51
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
52
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
53
import org.gvsig.fmap.dal.feature.EditableFeatureType;
54
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
58
import org.gvsig.fmap.dal.store.shp.SHPNewStoreParameters;
59
import org.gvsig.fmap.geom.DataTypes;
60
import org.gvsig.fmap.geom.Geometry;
61
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
62
import org.gvsig.fmap.geom.Geometry.TYPES;
63
import org.gvsig.fmap.geom.GeometryException;
64
import org.gvsig.fmap.geom.GeometryLocator;
65
import org.gvsig.fmap.mapcontext.layers.FLayer;
66
//import org.gvsig.fmap.mapcontext.layers.FLayers;
67
import org.gvsig.fmap.mapcontext.layers.operations.LayerCollection;
68
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
69
import org.gvsig.lrs.lib.api.LrsAlgorithmParams;
70
import org.gvsig.lrs.lib.api.LrsAlgorithmsLocator;
71
import org.gvsig.lrs.lib.api.LrsAlgorithmsManager;
72
import org.gvsig.lrs.lib.api.LrsCalibrateRouteAlgorithmParams;
73
import org.gvsig.lrs.lib.api.LrsCoordinatesPriority;
74
import org.gvsig.lrs.lib.api.LrsCreateRouteAlgorithmParams;
75
import org.gvsig.lrs.lib.api.LrsSourceOfMeasures;
76
import org.gvsig.lrs.lib.api.exceptions.LrsGettingParametersException;
77
import org.gvsig.lrs.lib.api.exceptions.LrsNeededParameterException;
78
import org.gvsig.lrs.swing.api.JLrsAlgorithmParams;
79
import org.gvsig.tools.ToolsLocator;
80
import org.gvsig.tools.dynobject.DynClass;
81
import org.gvsig.tools.dynobject.DynObject;
82
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
83
import org.gvsig.tools.dynobject.exception.DynMethodException;
84
import org.gvsig.tools.exception.BaseException;
85
import org.gvsig.tools.i18n.I18nManager;
86
import org.gvsig.tools.locator.LocatorException;
87
import org.gvsig.tools.persistence.PersistentState;
88
import org.gvsig.tools.persistence.exception.PersistenceException;
89
import org.gvsig.tools.swing.api.ActionListenerSupport;
90
import org.gvsig.tools.swing.api.ToolsSwingLocator;
91
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
92
import org.slf4j.Logger;
93
import org.slf4j.LoggerFactory;
94

    
95
/**
96
 * @author fdiaz
97
 *
98
 */
99
public class JLrsCreateRouteParamsController extends JLrsCreateRouteParamsView implements JLrsAlgorithmParams {
100

    
101
    /**
102
     *
103
     */
104
    private static final long serialVersionUID = 273909136196706713L;
105

    
106
    private static final Logger logger = LoggerFactory.getLogger(JLrsCreateRouteParamsController.class);
107

    
108
    private boolean canceled;
109
    private ActionListenerSupport listeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
110

    
111
    private LayerCollection layers;
112

    
113
    /**
114
     * @param layers
115
     * @throws LrsNeededParameterException
116
     *
117
     */
118
    public JLrsCreateRouteParamsController(LayerCollection layers, LrsAlgorithmParams params) throws LrsNeededParameterException {
119
        super();
120
        this.layers = layers;
121
        initComponents();
122
        translate();
123
        setParams(params);
124
    }
125

    
126
    public void addActionListener(ActionListener listener) {
127
        listeners.addActionListener(listener);
128
    }
129

    
130
    public void removeActionListener(ActionListener listener) {
131
        listeners.removeActionListener(listener);
132
    }
133

    
134
    private void translate() {
135
        I18nManager i18nManager = ToolsLocator.getI18nManager();
136

    
137
        lblInputLayer.setText(i18nManager.getTranslation(lblInputLayer.getText()));
138
        lblIdRouteField.setText(i18nManager.getTranslation(lblIdRouteField.getText()));
139
        lblOutputFile.setText(i18nManager.getTranslation(lblOutputFile.getText()));
140
        lblMeasureSource.setText(i18nManager.getTranslation(lblMeasureSource.getText()));
141
        lblFromMeasureField.setText(i18nManager.getTranslation(lblFromMeasureField.getText()));
142
        lblToMeasureField.setText(i18nManager.getTranslation(lblToMeasureField.getText()));
143
        lblCoordinatesPriority.setText(i18nManager.getTranslation(lblCoordinatesPriority.getText()));
144
        lblMeasureFactor.setText(i18nManager.getTranslation(lblMeasureFactor.getText()));
145
        lblMeasureOffset.setText(i18nManager.getTranslation(lblMeasureOffset.getText()));
146
        chkIgnoreSpatialGaps.setText(i18nManager.getTranslation(chkIgnoreSpatialGaps.getText()));
147
        btnBrowser.setText("\u2026");
148
        btnAccept.setText(i18nManager.getTranslation(btnAccept.getText()));
149
        btnCancel.setText(i18nManager.getTranslation(btnCancel.getText()));
150

    
151
    }
152

    
153
    /**
154
     *
155
     */
156
    public void setLocate(Locale locale) {
157
        Locale l = super.getLocale();
158
        if (!l.equals(locale)) {
159
            translate();
160
        }
161
        super.setLocale(locale);
162
    }
163

    
164
    /**
165
     * Validates the layers:
166
     *  - At least 1 curve layer with at least 1 non-geometrical field
167
     *  if they are not correct throws an exception
168
     * @throws LrsNeededParameterException
169
     */
170
    public static void validateLayers(LayerCollection layers)throws LrsNeededParameterException {
171
        logger.debug("Validating layers for Create Route");
172
        if (layers==null||layers.getLayersCount()<1){
173
            logger.error("Al least one layer is needed");
174
            throw new LrsNeededParameterException("at_least_one_layer_needed", null);
175
        }
176

    
177
        if (!correctLayerFound(layers)){
178
            logger.error("Impossible to find the layer needed");
179
            throw new LrsNeededParameterException("impossible_to_find_needed_layer",null);
180
        }
181
    }
182

    
183
    /**
184
     * @throws LrsNeededParameterException
185
     */
186
    private void initComponents() throws LrsNeededParameterException {
187

    
188
        validateLayers(layers);
189

    
190
        // Modelos de los combos
191
        FLayersComboBoxModel inputLayerModel = new FLayersComboBoxModel(this.layers);
192
        FeatureAttributeDescriptorsComboBoxModel idRouteFieldComboBoxModel =
193
            new FeatureAttributeDescriptorsComboBoxModel();
194
        FeatureAttributeDescriptorsComboBoxModel fromMeasureFieldComboBoxModel =
195
            new FeatureAttributeDescriptorsComboBoxModel();
196
        FeatureAttributeDescriptorsComboBoxModel toMeasureFieldComboBoxModel =
197
            new FeatureAttributeDescriptorsComboBoxModel();
198

    
199
        // Renderer para los combos de attributeDescriptors
200
        ListCellRenderer featureAttributeDescriptorCellRenderer = new FLayersAttributeDescriptorCellRenderer();
201
        // asignaci?n de renderers y modelos
202
        cmbIdRouteField.setRenderer(featureAttributeDescriptorCellRenderer);
203
        cmbFromMeasureField.setRenderer(featureAttributeDescriptorCellRenderer);
204
        cmbToMeasureField.setRenderer(featureAttributeDescriptorCellRenderer);
205
        cmbIdRouteField.setModel(idRouteFieldComboBoxModel);
206
        cmbFromMeasureField.setModel(fromMeasureFieldComboBoxModel);
207
        cmbToMeasureField.setModel(toMeasureFieldComboBoxModel);
208

    
209
        // renderer para el combo de capas
210
        ListCellRenderer layerNameCellRenderer=new FLayersLayerNameCellRenderer();
211
        // renderer para el combo de capas
212
        cmbInputLayer.setRenderer(layerNameCellRenderer);
213

    
214
        // asignaci?n modelo al combo de capas
215
        cmbInputLayer.setModel(inputLayerModel);
216
        // listener del combo de capas para que actualice el resto de
217
        // componentes
218
        cmbInputLayer.addItemListener(new ItemListener() {
219

    
220
            public void itemStateChanged(ItemEvent e) {
221
                Object item = e.getItem();
222
                if (item instanceof FLyrVect) {
223
                    FLyrVect layer = (FLyrVect) item;
224
                    updateLayer(layer);
225
                }
226
            }
227
        });
228

    
229
        ComboBoxModel<LrsSourceOfMeasures> measureSourceModel =
230
            new DefaultComboBoxModel<LrsSourceOfMeasures>(LrsSourceOfMeasures.values());
231

    
232
        cmbMeasureSource.setModel(measureSourceModel);
233
        cmbMeasureSource.addItemListener(new ItemListener() {
234

    
235
            public void itemStateChanged(ItemEvent event) {
236
                if (event.getStateChange() == ItemEvent.SELECTED) {
237
                    LrsSourceOfMeasures item = (LrsSourceOfMeasures) event.getItem();
238
                    updateSourceOfMeasures(item);
239
                }
240
            }
241
        });
242

    
243
        ComboBoxModel<LrsCoordinatesPriority> coordinatePriorityModel =
244
            new DefaultComboBoxModel<LrsCoordinatesPriority>(LrsCoordinatesPriority.values());
245

    
246
        cmbCoordinatePriority.setModel(coordinatePriorityModel);
247

    
248
        this.btnBrowser.addActionListener(new ActionListener() {
249

    
250
            public void actionPerformed(ActionEvent e) {
251
                doSelectOuputFile();
252
            }
253
        });
254

    
255
        this.btnAccept.addActionListener(new ActionListener() {
256

    
257
            public void actionPerformed(ActionEvent e) {
258
                canceled = false;
259
                doClose();
260
                listeners.fireActionEvent(new ActionEvent(JLrsCreateRouteParamsController.this, 0, "accept"));
261

    
262
            }
263
        });
264

    
265
        this.btnCancel.addActionListener(new ActionListener() {
266

    
267
            public void actionPerformed(ActionEvent e) {
268
                canceled = true;
269
                doClose();
270
                listeners.fireActionEvent(new ActionEvent(JLrsCreateRouteParamsController.this, 0, "cancel"));
271
            }
272
        });
273

    
274
        setVisibleAceptCancel(false);
275
        canceled = false;
276
    }
277

    
278
    private void doSelectOuputFile() {
279
        final I18nManager i18nManager = ToolsLocator.getI18nManager();
280
        ThreadSafeDialogsManager manager = ToolsSwingLocator.getThreadSafeDialogsManager();
281
        File[] files = manager.showSaveFileDialog(i18nManager.getTranslation("output_file"), null);
282
        if (files != null && files.length > 0) {
283
            File file = files[0];
284
            String absolutePath = file.getAbsolutePath();
285
            if(!StringUtils.endsWithIgnoreCase(absolutePath, ".shp")){
286
                absolutePath = new StringBuilder().append(absolutePath).append(".shp").toString();
287
            }
288
            File outputFile = FileUtils.getFile(absolutePath);
289
            if(outputFile.exists()) {
290
                int resp = JOptionPane.showOptionDialog(
291
                    this.asJComponent(),
292
                    i18nManager.getTranslation("file_already_exists_do_you_want_overwrite_it"),
293
                    i18nManager.getTranslation("output_file"),
294
                    JOptionPane.OK_CANCEL_OPTION,
295
                    JOptionPane.QUESTION_MESSAGE,
296
                    null,
297
                    null,
298
                    JOptionPane.OK_OPTION);
299
                if (resp == JOptionPane.OK_OPTION){
300
                    this.txtOutputFile.setText(absolutePath);
301
                } else {
302
                    doSelectOuputFile();
303
                }
304
            } else {
305
                this.txtOutputFile.setText(absolutePath);
306
            }
307
        }
308

    
309
    }
310

    
311
    private void doClose() {
312
        this.setVisible(false);
313
    }
314

    
315
    public boolean isCanceled() {
316
        return this.canceled;
317
    }
318

    
319
    public void setVisibleAceptCancel(boolean visible) {
320
        this.btnAccept.setVisible(visible);
321
        this.btnCancel.setVisible(visible);
322
    }
323

    
324
    public boolean getVisibleAceptCancel() {
325
        return this.btnAccept.isVisible();
326
    }
327

    
328
    public JComponent asJComponent() {
329
        return this;
330
    }
331

    
332
    public LrsAlgorithmParams getParams() throws LrsGettingParametersException, LrsNeededParameterException {
333
        LrsAlgorithmsManager manager = LrsAlgorithmsLocator.getLrsAlgorithmsManager();
334
        LrsCreateRouteAlgorithmParams params = manager.createLrsCreateRouteAlgorithmParams();
335
        // Recorrer todo del interfaz y rellenar los parametros
336

    
337
      //cmbInputLayer
338
        if (!(this.cmbInputLayer.getSelectedItem() instanceof FLyrVect)){
339
            logger.error("Error getting selected item from cmbInputLayer");
340
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbInputLayer", null);
341
        }
342
        FLyrVect fLyrVect = (FLyrVect) this.cmbIdRouteField.getSelectedItem();
343
        if (!(fLyrVect.getFeatureStore() instanceof FeatureStore)){
344
            logger.error("Error getting selected item from cmbInputLayer");
345
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbInputLayer", null);
346
        }
347
        FeatureStore sourceFeatureStore = (FeatureStore)fLyrVect.getFeatureStore();
348
        if (sourceFeatureStore == null) {
349
            throw new LrsNeededParameterException("need_to_select_a_source_layer", null);
350
        }
351
        params.setSourceFeatureStore(sourceFeatureStore);
352

    
353
        //cmbIdRouteField
354
        if (!(this.cmbIdRouteField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
355
            logger.error("Error getting selected item from cmbIdRouteField");
356
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbIdRouteField", null);
357
        }
358
        FeatureAttributeDescriptor idRouteField = (FeatureAttributeDescriptor) this.cmbIdRouteField.getSelectedItem();
359
        if (idRouteField == null) {
360
            throw new LrsNeededParameterException("need_to_select_a_route_identifier_field", null);
361
        }
362
        params.setIdRouteField(idRouteField);
363

    
364
        //OutputStore
365
        String outputLayerPath = this.txtOutputFile.getText();
366
        if(StringUtils.isEmpty(outputLayerPath)){
367
            throw new LrsNeededParameterException("need_to_fill_the_target_path", null);
368
        }
369
        SHPNewStoreParameters sHPNewStoreParameters=new SHPNewStoreParameters();
370
        sHPNewStoreParameters.setFile(outputLayerPath);
371
        params.setNewFeatureStoreParameters((NewFeatureStoreParameters)sHPNewStoreParameters);
372

    
373
        LrsSourceOfMeasures measureSources = (LrsSourceOfMeasures) this.cmbMeasureSource.getSelectedItem();
374
        FeatureAttributeDescriptor fromMeasureField = (FeatureAttributeDescriptor) this.cmbFromMeasureField.getSelectedItem();
375
        FeatureAttributeDescriptor toMeasureField = (FeatureAttributeDescriptor) this.cmbToMeasureField.getSelectedItem();
376
        params.setSourceOfMeasures(measureSources);
377
        switch (measureSources) {
378
        case ONE_FIELD:
379
            if (fromMeasureField == null) {
380
                throw new LrsNeededParameterException("need_to_select_a_length_measure_field", null);
381
            }
382
            params.setFromMeasureField((FeatureAttributeDescriptor) this.cmbFromMeasureField.getSelectedItem());
383
            params.setToMeasureField(null);
384
            break;
385
        case TWO_FIELDS:
386
            if (fromMeasureField == null) {
387
                throw new LrsNeededParameterException("need_to_select_a_from_measure_field", null);
388
            }
389
            params.setFromMeasureField((FeatureAttributeDescriptor) this.cmbFromMeasureField.getSelectedItem());
390
            if (toMeasureField == null) {
391
                throw new LrsNeededParameterException("need_to_select_a_to_measure_field", null);
392
            }
393
            params.setToMeasureField((FeatureAttributeDescriptor) this.cmbToMeasureField.getSelectedItem());
394
            break;
395
        case LENGTH:
396
        default:
397
            params.setFromMeasureField(null);
398
            params.setToMeasureField(null);
399
            break;
400
        }
401
        params.setCoordinatePriority((LrsCoordinatesPriority) this.cmbCoordinatePriority.getSelectedItem());
402

    
403

    
404
        Double measureFactor = (Double) this.txtMeasureFactor.getValue();
405
        params.setMeasureFactor(measureFactor);
406
        Double measureOffset = (Double) this.txtMeasureOffset.getValue();
407
        params.setMeasureOffset(measureOffset);
408
        params.setIgnoreSpatialGaps(this.chkIgnoreSpatialGaps.isSelected());
409

    
410
        return params;
411
    }
412

    
413
    public void setParams(LrsAlgorithmParams params) {
414
        if (params == null) {
415
            clear();
416
            return;
417
        }
418
        // Rellena los campos con los valores de params
419
        LrsCreateRouteAlgorithmParams parameters = (LrsCreateRouteAlgorithmParams) params;
420

    
421
        this.cmbMeasureSource.setSelectedItem(parameters.getSourceOfMeasures());
422
        this.cmbCoordinatePriority.setSelectedItem(parameters.getCoordinatePriority());
423

    
424
        FeatureStore sourceFeatureStore = parameters.getSourceFeatureStore();
425
        if(layers!=null && sourceFeatureStore!=null){
426
            FLayer layer = layers.getLayer(sourceFeatureStore.getName());
427
            this.cmbInputLayer.setSelectedItem(layer);
428
        }
429

    
430
        NewFeatureStoreParameters newFeatureStoreParameters = parameters.getNewFeatureStoreParameters();
431
        if(newFeatureStoreParameters instanceof SHPNewStoreParameters){
432
            this.txtOutputFile.setText(((SHPNewStoreParameters)newFeatureStoreParameters).getSHPFile().getAbsolutePath());
433
        }
434

    
435
        this.cmbIdRouteField.setSelectedItem(parameters.getIdRouteField());
436
        this.cmbFromMeasureField.setSelectedItem(parameters.getFromMeasureField());
437
        this.cmbToMeasureField.setSelectedItem(parameters.getToMeasureField());
438
        this.txtMeasureFactor.setValue(parameters.getMeasureFactor());
439
        this.txtMeasureOffset.setValue(parameters.getMeasureOffset());
440

    
441
    }
442

    
443
    public void clear() {
444
        this.txtOutputFile.setText("");
445
        this.txtMeasureFactor.setValue(1.0);
446
        this.txtMeasureOffset.setValue(0.0);
447
        this.cmbMeasureSource.setSelectedIndex(0);
448
        this.cmbFromMeasureField.setEnabled(false);
449
        this.cmbToMeasureField.setEnabled(false);
450
        this.cmbCoordinatePriority.setSelectedIndex(0);
451
        Object inputLayerSelected = this.cmbInputLayer.getSelectedItem();
452
        if (inputLayerSelected != null) {
453
            this.updateLayer((FLyrVect) inputLayerSelected);
454
        }
455
        Object measureSourceSelected = this.cmbMeasureSource.getSelectedItem();
456
        if (measureSourceSelected != null) {
457
            this.updateSourceOfMeasures((LrsSourceOfMeasures) measureSourceSelected);
458
        }
459

    
460
    }
461

    
462
    private void updateLayer(FLyrVect layer) {
463
        logger.info(new StringBuilder().append("Setting layer ").append(layer.getName()).toString());
464
        FeatureStore featureStore = layer.getFeatureStore();
465
        try {
466
            FeatureType type = featureStore.getDefaultFeatureType();
467
            // Se renuevan los combos de attributeDescriptors
468
            FeatureAttributeDescriptorsComboBoxModel idRouteFieldComboBoxModel =
469
                new FeatureAttributeDescriptorsComboBoxModel();
470
            FeatureAttributeDescriptorsComboBoxModel fromMeasureFieldComboBoxModel =
471
                new FeatureAttributeDescriptorsComboBoxModel();
472
            FeatureAttributeDescriptorsComboBoxModel toMeasureFieldComboBoxModel =
473
                new FeatureAttributeDescriptorsComboBoxModel();
474

    
475
            this.cmbIdRouteField.setModel(idRouteFieldComboBoxModel);
476
            this.cmbFromMeasureField.setModel(fromMeasureFieldComboBoxModel);
477
            this.cmbToMeasureField.setModel(toMeasureFieldComboBoxModel);
478

    
479
            FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
480
            for (int i = 0; i < attributeDescriptors.length; i++) {
481
                FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
482
                if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
483
                    logger.info(new StringBuilder().append("Adding field ")
484
                        .append(featureAttributeDescriptor.getName()).toString());
485

    
486
                    JLrsCreateRouteParamsController.this.cmbIdRouteField.addItem(featureAttributeDescriptor);
487
                    if (featureAttributeDescriptor.getDataType().isNumeric()) {
488
                        JLrsCreateRouteParamsController.this.cmbFromMeasureField.addItem(featureAttributeDescriptor);
489
                        JLrsCreateRouteParamsController.this.cmbToMeasureField.addItem(featureAttributeDescriptor);
490
                    }
491
                }
492
            }
493
            this.cmbIdRouteField.invalidate();
494
            this.cmbFromMeasureField.invalidate();
495
            this.cmbToMeasureField.invalidate();
496

    
497
        } catch (DataException e1) {
498
            logger.warn(
499
                new StringBuilder().append("Error getting default feature type from layer ").append(layer.getName())
500
                    .toString(), e1);
501
        }
502
    }
503

    
504
    private void updateSourceOfMeasures(LrsSourceOfMeasures item) {
505
        switch (item) {
506
        case LENGTH:
507
            cmbFromMeasureField.setEnabled(false);
508
            cmbToMeasureField.setEnabled(false);
509
            break;
510
        case ONE_FIELD:
511
            cmbFromMeasureField.setEnabled(true);
512
            cmbToMeasureField.setEnabled(false);
513
            break;
514
        case TWO_FIELDS:
515
            cmbFromMeasureField.setEnabled(true);
516
            cmbToMeasureField.setEnabled(true);
517
            break;
518
        default:
519
            break;
520
        }
521
    }
522

    
523
    protected FeatureStore getFeatureStore(String outputLayerPath, IProjection projection) throws Exception {
524

    
525
        DataManager dataManager = DALLocator.getDataManager();
526
        DataStoreParameters dataStoreParams = dataManager.createStoreParameters("Shape");
527
        dataStoreParams.setDynValue("shpfile", outputLayerPath);
528
        dataStoreParams.setDynValue("CRS", projection);
529
        dataStoreParams.setDynValue("useNullGeometry", false);
530
        dataStoreParams.validate();
531

    
532
        return (FeatureStore) dataManager.openStore("Shape", dataStoreParams);
533
    }
534

    
535

    
536
    /**
537
     * Tries to find the correct layers:
538
     *   - At least 1 curve layer with at least 1 non-geometrical field
539
     * @param LayerCollection layers
540
     * @return true if finds the correct layers
541
     */
542
    private static boolean correctLayerFound(LayerCollection layers){
543
        boolean correctCurveLayerFound = false;
544

    
545
        for (int i = 0; i < layers.getLayersCount() && !correctCurveLayerFound; i++) {
546
            FLayer layer = layers.getLayer(i);
547
            if (layer instanceof FLyrVect) {
548
                FLyrVect lyrVect = (FLyrVect) layer;
549
                try {
550
                    if (!correctCurveLayerFound) {
551
                        logger.debug(
552
                            "Finding a curve layer with at least one non-geometrical field");
553
                        correctCurveLayerFound =
554
                            correctCurveLayerFound(lyrVect);
555
                    }
556
                } catch (BaseException e1) {
557
                    logger.error("Can't get linear vector layers", e1);
558
                }
559
            }
560
        }
561
        return correctCurveLayerFound;
562
    }
563

    
564
    /**
565
     * Tries to find one curve layer with at least one non-geometrical field
566
     * @param lyrVect
567
     * @return
568
     * @throws ReadException
569
     */
570
    private static boolean correctCurveLayerFound(FLyrVect lyrVect) throws ReadException{
571
        boolean correctCurveLayerFound = false;
572
        if (lyrVect!=null&&(lyrVect.getGeometryType().isTypeOf(Geometry.TYPES.CURVE)
573
            || lyrVect.getGeometryType()
574
                .isTypeOf(Geometry.TYPES.MULTICURVE))) {
575

    
576
            FeatureStore featureStore = lyrVect.getFeatureStore();
577
            try {
578
                FeatureType type = featureStore.getDefaultFeatureType();
579

    
580
                FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
581
                for (int i = 0; i < attributeDescriptors.length; i++) {
582
                    FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
583
                    if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
584
                        logger.debug("Correct curve layer found");
585
                        correctCurveLayerFound = true;
586
                    }
587
                }
588
            } catch (DataException e1) {
589
                logger.warn(
590
                    new StringBuilder().append("Error getting default feature type from layer ").append(lyrVect.getName())
591
                        .toString(), e1);
592
            }
593
        }
594
        return correctCurveLayerFound;
595
    }
596

    
597

    
598
//    private void test() {
599
//        WindowManager winManager = ToolsSwingLocator.getWindowManager();
600
//
601
//        LrsAlgorithmsSwingManager manager = LrsAlgorithmsSwingLocator.getLrsAlgorithmsSwingManager();
602
//
603
//        JLrsAlgorithmParams panel = manager.createJLrsCreateRouteAlgorithmParameters(null, null);
604
//        panel.setVisibleAceptCancel(true);
605
//        winManager.showWindow(panel.asJComponent(), "titulo", WindowManager.MODE.DIALOG);
606
//        if (panel.isCanceled()) {
607
//            return;
608
//        }
609
//        LrsAlgorithmParams params = panel.getParams();
610
//        // FIXME: Crear algoritmo con estos parametros
611
//    }
612
//
613
//    private void test2() {
614
//        final WindowManager winManager = ToolsSwingLocator.getWindowManager();
615
//
616
//        LrsAlgorithmsSwingManager manager = LrsAlgorithmsSwingLocator.getLrsAlgorithmsSwingManager();
617
//
618
//        JLrsAlgorithmParams panel = manager.createJLrsCreateRouteAlgorithmParameters(null, null);
619
//        panel.setVisibleAceptCancel(true);
620
//        panel.addActionListener(new ActionListener() {
621
//
622
//            public void actionPerformed(ActionEvent e) {
623
//                JLrsAlgorithmParams panel = (JLrsAlgorithmParams) e.getSource();
624
//                if (panel.isCanceled()) {
625
//                    return;
626
//                }
627
//                LrsAlgorithmParams params = panel.getParams();
628
//                // FIXME: Crear algoritmo con estos parametros
629
//
630
//                LrsAlgorithmsManager algorithmsManager = LrsAlgorithmsLocator.getLrsAlgorithmsManager();
631
//                final LrsAlgorithm algorithm = algorithmsManager.createLrsAlgorithm(params);
632
//                final SimpleTaskStatus taskStatus =
633
//                    ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("");
634
//
635
//                // FIXME:
636
//                DefaultProgressDialogController progressDialog = new DefaultProgressDialogController(taskStatus);
637
//
638
//                // winManager.showWindow(progressDialog.asJComponent(), "TIT",
639
//                // WindowManager.MODE.WINDOW);
640
//                winManager.showWindow(progressDialog, "TIT", WindowManager.MODE.WINDOW);
641
//
642
//                Thread task = new Thread(new Runnable() {
643
//
644
//                    public void run() {
645
//                        algorithm.execute(taskStatus);
646
//                    }
647
//                });
648
//                task.start();
649
//
650
//            }
651
//        });
652
//     winManager.showWindow(panel.asJComponent(), "titulo",
653
//     WindowManager.MODE.WINDOW);
654
//
655
//     }
656
}