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 @ 11

History | View | Annotate | Download (28.2 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
        txtMeasureFactor.setValue(new Double(1));
249
        txtMeasureOffset.setValue(new Double(0));
250

    
251
        this.btnBrowser.addActionListener(new ActionListener() {
252

    
253
            public void actionPerformed(ActionEvent e) {
254
                doSelectOuputFile();
255
            }
256
        });
257

    
258
        this.btnAccept.addActionListener(new ActionListener() {
259

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

    
265
            }
266
        });
267

    
268
        this.btnCancel.addActionListener(new ActionListener() {
269

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

    
277
        setVisibleAceptCancel(false);
278
        canceled = false;
279
    }
280

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

    
312
    }
313

    
314
    private void doClose() {
315
        this.setVisible(false);
316
    }
317

    
318
    public boolean isCanceled() {
319
        return this.canceled;
320
    }
321

    
322
    public void setVisibleAceptCancel(boolean visible) {
323
        this.btnAccept.setVisible(visible);
324
        this.btnCancel.setVisible(visible);
325
    }
326

    
327
    public boolean getVisibleAceptCancel() {
328
        return this.btnAccept.isVisible();
329
    }
330

    
331
    public JComponent asJComponent() {
332
        return this;
333
    }
334

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

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

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

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

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

    
406
        Object measureFactor = this.txtMeasureFactor.getValue();
407
        if (measureFactor!=null && measureFactor instanceof Double){
408
            params.setMeasureFactor((Double)measureFactor);
409
        }else {
410
            params.setMeasureFactor(0);
411
        }
412
        Object measureOffset = this.txtMeasureOffset.getValue();
413
        if (measureOffset!=null && measureOffset instanceof Double){
414
            params.setMeasureOffset((Double)measureOffset);
415
        }else {
416
            params.setMeasureOffset(0);
417
        }
418

    
419
        params.setIgnoreSpatialGaps(this.chkIgnoreSpatialGaps.isSelected());
420

    
421
        return params;
422
    }
423

    
424
    public void setParams(LrsAlgorithmParams params) {
425
        if (params == null) {
426
            clear();
427
            return;
428
        }
429
        // Rellena los campos con los valores de params
430
        LrsCreateRouteAlgorithmParams parameters = (LrsCreateRouteAlgorithmParams) params;
431

    
432
        this.cmbMeasureSource.setSelectedItem(parameters.getSourceOfMeasures());
433
        this.cmbCoordinatePriority.setSelectedItem(parameters.getCoordinatePriority());
434

    
435
        FeatureStore sourceFeatureStore = parameters.getSourceFeatureStore();
436
        if(layers!=null && sourceFeatureStore!=null){
437
            FLayer layer = layers.getLayer(sourceFeatureStore.getName());
438
            this.cmbInputLayer.setSelectedItem(layer);
439
        }
440

    
441
        NewFeatureStoreParameters newFeatureStoreParameters = parameters.getNewFeatureStoreParameters();
442
        if(newFeatureStoreParameters instanceof SHPNewStoreParameters){
443
            this.txtOutputFile.setText(((SHPNewStoreParameters)newFeatureStoreParameters).getSHPFile().getAbsolutePath());
444
        }
445

    
446
        this.cmbIdRouteField.setSelectedItem(parameters.getIdRouteField());
447
        this.cmbFromMeasureField.setSelectedItem(parameters.getFromMeasureField());
448
        this.cmbToMeasureField.setSelectedItem(parameters.getToMeasureField());
449
        this.txtMeasureFactor.setValue(parameters.getMeasureFactor());
450
        this.txtMeasureOffset.setValue(parameters.getMeasureOffset());
451

    
452
    }
453

    
454
    public void clear() {
455
        this.txtOutputFile.setText("");
456
        this.txtMeasureFactor.setValue(1.0);
457
        this.txtMeasureOffset.setValue(0.0);
458
        this.cmbMeasureSource.setSelectedIndex(0);
459
        this.cmbFromMeasureField.setEnabled(false);
460
        this.cmbToMeasureField.setEnabled(false);
461
        this.cmbCoordinatePriority.setSelectedIndex(0);
462
        Object inputLayerSelected = this.cmbInputLayer.getSelectedItem();
463
        if (inputLayerSelected != null) {
464
            this.updateLayer((FLyrVect) inputLayerSelected);
465
        }
466
        Object measureSourceSelected = this.cmbMeasureSource.getSelectedItem();
467
        if (measureSourceSelected != null) {
468
            this.updateSourceOfMeasures((LrsSourceOfMeasures) measureSourceSelected);
469
        }
470

    
471
    }
472

    
473
    private void updateLayer(FLyrVect layer) {
474
        logger.info(new StringBuilder().append("Setting layer ").append(layer.getName()).toString());
475
        FeatureStore featureStore = layer.getFeatureStore();
476
        try {
477
            FeatureType type = featureStore.getDefaultFeatureType();
478
            // Se renuevan los combos de attributeDescriptors
479
            FeatureAttributeDescriptorsComboBoxModel idRouteFieldComboBoxModel =
480
                new FeatureAttributeDescriptorsComboBoxModel();
481
            FeatureAttributeDescriptorsComboBoxModel fromMeasureFieldComboBoxModel =
482
                new FeatureAttributeDescriptorsComboBoxModel();
483
            FeatureAttributeDescriptorsComboBoxModel toMeasureFieldComboBoxModel =
484
                new FeatureAttributeDescriptorsComboBoxModel();
485

    
486
            this.cmbIdRouteField.setModel(idRouteFieldComboBoxModel);
487
            this.cmbFromMeasureField.setModel(fromMeasureFieldComboBoxModel);
488
            this.cmbToMeasureField.setModel(toMeasureFieldComboBoxModel);
489

    
490
            FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
491
            for (int i = 0; i < attributeDescriptors.length; i++) {
492
                FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
493
                if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
494
                    logger.info(new StringBuilder().append("Adding field ")
495
                        .append(featureAttributeDescriptor.getName()).toString());
496

    
497
                    JLrsCreateRouteParamsController.this.cmbIdRouteField.addItem(featureAttributeDescriptor);
498
                    if (featureAttributeDescriptor.getDataType().isNumeric()) {
499
                        JLrsCreateRouteParamsController.this.cmbFromMeasureField.addItem(featureAttributeDescriptor);
500
                        JLrsCreateRouteParamsController.this.cmbToMeasureField.addItem(featureAttributeDescriptor);
501
                    }
502
                }
503
            }
504
            this.cmbIdRouteField.invalidate();
505
            this.cmbFromMeasureField.invalidate();
506
            this.cmbToMeasureField.invalidate();
507

    
508
        } catch (DataException e1) {
509
            logger.warn(
510
                new StringBuilder().append("Error getting default feature type from layer ").append(layer.getName())
511
                    .toString(), e1);
512
        }
513
    }
514

    
515
    private void updateSourceOfMeasures(LrsSourceOfMeasures item) {
516
        switch (item) {
517
        case LENGTH:
518
            cmbFromMeasureField.setEnabled(false);
519
            cmbToMeasureField.setEnabled(false);
520
            break;
521
        case ONE_FIELD:
522
            cmbFromMeasureField.setEnabled(true);
523
            cmbToMeasureField.setEnabled(false);
524
            break;
525
        case TWO_FIELDS:
526
            cmbFromMeasureField.setEnabled(true);
527
            cmbToMeasureField.setEnabled(true);
528
            break;
529
        default:
530
            break;
531
        }
532
    }
533

    
534
    protected FeatureStore getFeatureStore(String outputLayerPath, IProjection projection) throws Exception {
535

    
536
        DataManager dataManager = DALLocator.getDataManager();
537
        DataStoreParameters dataStoreParams = dataManager.createStoreParameters("Shape");
538
        dataStoreParams.setDynValue("shpfile", outputLayerPath);
539
        dataStoreParams.setDynValue("CRS", projection);
540
        dataStoreParams.setDynValue("useNullGeometry", false);
541
        dataStoreParams.validate();
542

    
543
        return (FeatureStore) dataManager.openStore("Shape", dataStoreParams);
544
    }
545

    
546

    
547
    /**
548
     * Tries to find the correct layers:
549
     *   - At least 1 curve layer with at least 1 non-geometrical field
550
     * @param LayerCollection layers
551
     * @return true if finds the correct layers
552
     */
553
    private static boolean correctLayerFound(LayerCollection layers){
554
        boolean correctCurveLayerFound = false;
555

    
556
        for (int i = 0; i < layers.getLayersCount() && !correctCurveLayerFound; i++) {
557
            FLayer layer = layers.getLayer(i);
558
            if (layer instanceof FLyrVect) {
559
                FLyrVect lyrVect = (FLyrVect) layer;
560
                try {
561
                    if (!correctCurveLayerFound) {
562
                        logger.debug(
563
                            "Finding a curve layer with at least one non-geometrical field");
564
                        correctCurveLayerFound =
565
                            correctCurveLayerFound(lyrVect);
566
                    }
567
                } catch (BaseException e1) {
568
                    logger.error("Can't get linear vector layers", e1);
569
                }
570
            }
571
        }
572
        return correctCurveLayerFound;
573
    }
574

    
575
    /**
576
     * Tries to find one curve layer with at least one non-geometrical field
577
     * @param lyrVect
578
     * @return
579
     * @throws ReadException
580
     */
581
    private static boolean correctCurveLayerFound(FLyrVect lyrVect) throws ReadException{
582
        boolean correctCurveLayerFound = false;
583
        if (lyrVect!=null&&(lyrVect.getGeometryType().isTypeOf(Geometry.TYPES.CURVE)
584
            || lyrVect.getGeometryType()
585
                .isTypeOf(Geometry.TYPES.MULTICURVE))) {
586

    
587
            FeatureStore featureStore = lyrVect.getFeatureStore();
588
            try {
589
                FeatureType type = featureStore.getDefaultFeatureType();
590

    
591
                FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
592
                for (int i = 0; i < attributeDescriptors.length; i++) {
593
                    FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
594
                    if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
595
                        logger.debug("Correct curve layer found");
596
                        correctCurveLayerFound = true;
597
                        return correctCurveLayerFound;
598
                    }
599
                }
600
            } catch (DataException e1) {
601
                logger.warn(
602
                    new StringBuilder().append("Error getting default feature type from layer ").append(lyrVect.getName())
603
                        .toString(), e1);
604
            }
605
        }
606
        return correctCurveLayerFound;
607
    }
608

    
609

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