Statistics
| Revision:

root / trunk / extensions / extGraph / src / org / gvsig / graph / gui / RouteControlPanel.java @ 24989

History | View | Annotate | Download (36.9 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2005 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41

    
42
/* CVS MESSAGES:
43
 *
44
 * $Id: RouteControlPanel.java 24989 2008-11-12 12:28:13Z jcampos $
45
 * $Log$
46
 * Revision 1.26  2007-09-07 11:29:47  fjp
47
 * Casi compila. Falta arreglar lo de FArrowSymbol y retocar el graphiclist de FMap.
48
 *
49
 * Revision 1.25.2.5  2007/08/06 16:54:34  fjp
50
 * Versi?n en desarrollo con velocidades y un esbozo de ?reas de influencia
51
 *
52
 * Revision 1.25.2.4  2007/06/14 10:02:25  fjp
53
 * Pliego de redes a publicar SIN el cuadro de di?logo setVelocities (bueno, con , pero invisible)
54
 *
55
 * Revision 1.25.2.3  2007/05/24 11:33:36  fjp
56
 * Para que puedas a?adir los puntos que est?n cerca de la red. Los que no lo est?n, lanzan un error informando de qu? punto no est? cerca de la red.
57
 *
58
 * Revision 1.25.2.2  2007/05/15 07:08:21  fjp
59
 * Para calcular matrices de distancias
60
 *
61
 * Revision 1.25  2006/11/14 18:32:32  fjp
62
 * *** empty log message ***
63
 *
64
 * Revision 1.24  2006/11/14 16:12:01  fjp
65
 * *** empty log message ***
66
 *
67
 * Revision 1.23  2006/11/14 09:23:30  fjp
68
 * cargar paradas desde cualquier tema de puntos
69
 *
70
 * Revision 1.22  2006/11/10 13:57:04  fjp
71
 * *** empty log message ***
72
 *
73
 * Revision 1.21  2006/11/09 21:08:32  azabala
74
 * *** empty log message ***
75
 *
76
 * Revision 1.20  2006/11/09 12:51:12  jaume
77
 * *** empty log message ***
78
 *
79
 * Revision 1.19  2006/11/09 11:00:43  jaume
80
 * *** empty log message ***
81
 *
82
 * Revision 1.18  2006/11/09 10:59:53  jaume
83
 * *** empty log message ***
84
 *
85
 * Revision 1.17  2006/11/09 10:27:50  fjp
86
 * *** empty log message ***
87
 *
88
 * Revision 1.16  2006/11/09 10:24:11  fjp
89
 * *** empty log message ***
90
 *
91
 * Revision 1.15  2006/11/09 09:16:35  fjp
92
 * Ya va!!
93
 *
94
 * Revision 1.14  2006/11/08 20:14:52  azabala
95
 * *** empty log message ***
96
 *
97
 * Revision 1.13  2006/11/08 19:32:22  azabala
98
 * saveroute and saveflags modifications
99
 *
100
 * Revision 1.12  2006/11/08 18:16:28  fjp
101
 * *** empty log message ***
102
 *
103
 * Revision 1.11  2006/11/08 16:48:19  fjp
104
 * *** empty log message ***
105
 *
106
 * Revision 1.10  2006/11/08 16:00:39  fjp
107
 * Por terminar el enlace flags-cuadro de di?logo
108
 *
109
 * Revision 1.9  2006/11/08 13:18:46  fjp
110
 * Por terminar el enlace flags-cuadro de di?logo
111
 *
112
 * Revision 1.8  2006/11/07 19:49:38  azabala
113
 * *** empty log message ***
114
 *
115
 * Revision 1.7  2006/11/06 13:13:53  azabala
116
 * *** empty log message ***
117
 *
118
 * Revision 1.6  2006/11/06 10:29:32  jaume
119
 * *** empty log message ***
120
 *
121
 * Revision 1.5  2006/11/03 19:39:29  azabala
122
 * *** empty log message ***
123
 *
124
 * Revision 1.4  2006/10/27 18:26:22  azabala
125
 * added implementation of load stages method
126
 *
127
 * Revision 1.3  2006/10/27 12:41:09  jaume
128
 * GUI
129
 *
130
 * Revision 1.2  2006/10/26 16:31:21  jaume
131
 * GUI
132
 *
133
 * Revision 1.1  2006/10/25 10:50:41  jaume
134
 * movement of classes and gui stuff
135
 *
136
 * Revision 1.4  2006/10/24 08:04:41  jaume
137
 * *** empty log message ***
138
 *
139
 * Revision 1.3  2006/10/23 16:00:20  jaume
140
 * *** empty log message ***
141
 *
142
 * Revision 1.2  2006/10/23 08:05:39  jaume
143
 * GUI
144
 *
145
 * Revision 1.1  2006/10/20 12:02:50  jaume
146
 * GUI
147
 *
148
 *
149
 */
150
package org.gvsig.graph.gui;
151

    
152
import java.awt.BorderLayout;
153
import java.awt.Component;
154
import java.awt.Dimension;
155
import java.awt.FlowLayout;
156
import java.awt.Font;
157
import java.awt.GridLayout;
158
import java.awt.event.ActionEvent;
159
import java.awt.event.ActionListener;
160
import java.awt.geom.Point2D;
161
import java.awt.geom.Rectangle2D;
162
import java.text.NumberFormat;
163
import java.util.ArrayList;
164
import java.util.Hashtable;
165
import java.util.List;
166

    
167
import javax.swing.ImageIcon;
168
import javax.swing.JCheckBox;
169
import javax.swing.JComboBox;
170
import javax.swing.JLabel;
171
import javax.swing.JOptionPane;
172
import javax.swing.JPanel;
173
import javax.swing.JScrollPane;
174
import javax.swing.JTable;
175
import javax.swing.ListSelectionModel;
176
import javax.swing.event.ListSelectionEvent;
177
import javax.swing.event.ListSelectionListener;
178
import javax.swing.event.TableModelEvent;
179
import javax.swing.event.TableModelListener;
180
import javax.swing.table.AbstractTableModel;
181
import javax.swing.table.TableColumnModel;
182
import javax.swing.table.TableModel;
183

    
184
import org.apache.log4j.Logger;
185
import org.cresques.cts.IProjection;
186
import org.gvsig.exceptions.BaseException;
187
import org.gvsig.fmap.layers.LayerListenerAdapter;
188
import org.gvsig.graph.core.GraphException;
189
import org.gvsig.graph.core.GvFlag;
190
import org.gvsig.graph.core.IFlagListener;
191
import org.gvsig.graph.core.Network;
192
import org.gvsig.graph.core.NetworkUtils;
193
import org.gvsig.graph.solvers.FlagsMemoryDriver;
194
import org.gvsig.graph.solvers.Route;
195
import org.gvsig.graph.solvers.RouteMemoryDriver;
196
import org.gvsig.graph.tools.FlagListener;
197
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
198
import org.gvsig.gui.beans.swing.JBlank;
199
import org.gvsig.gui.beans.swing.JButton;
200

    
201
import com.hardcode.gdbms.engine.values.Value;
202
import com.hardcode.gdbms.engine.values.ValueFactory;
203
import com.iver.andami.PluginServices;
204
import com.iver.andami.messages.NotificationManager;
205
import com.iver.andami.ui.mdiManager.IWindow;
206
import com.iver.andami.ui.mdiManager.SingletonWindow;
207
import com.iver.andami.ui.mdiManager.WindowInfo;
208
import com.iver.cit.gvsig.addlayer.AddLayerDialog;
209
import com.iver.cit.gvsig.fmap.MapContext;
210
import com.iver.cit.gvsig.fmap.MapControl;
211
import com.iver.cit.gvsig.fmap.ViewPort;
212
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
213
import com.iver.cit.gvsig.fmap.core.FPoint2D;
214
import com.iver.cit.gvsig.fmap.core.FShape;
215
import com.iver.cit.gvsig.fmap.core.IGeometry;
216
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
217
import com.iver.cit.gvsig.fmap.layers.FLayer;
218
import com.iver.cit.gvsig.fmap.layers.FLayers;
219
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
220
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
221
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
222
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
223
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
224
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
225
import com.iver.cit.gvsig.project.documents.view.gui.IView;
226
import com.iver.cit.gvsig.project.documents.view.gui.View;
227
import com.iver.cit.gvsig.util.GvSession;
228
import com.vividsolutions.jts.geom.Coordinate;
229
import com.vividsolutions.jts.geom.Geometry;
230
import com.vividsolutions.jts.geom.MultiPoint;
231
import com.vividsolutions.jts.geom.Point;
232

    
233
public class RouteControlPanel extends JPanel implements SingletonWindow,
234
                ActionListener, IFlagListener {
235
        private static Logger logger = Logger.getLogger(RouteControlPanel.class.getName());
236
        
237
        WindowInfo wi;
238

    
239
        private JPanel westPanel = null;
240

    
241
        private JScrollPane scrlStages = null;
242

    
243
        private JTable tblStages = null;
244

    
245
        private GridBagLayoutPanel eastPanel = null;
246

    
247
        private MyTableModel tableModel = new MyTableModel(); // @jve:decl-index=0:visual-constraint=""
248

    
249
        private JButton btnLoadStage = null;
250

    
251
        private JButton btnSaveStage = null;
252
        
253
        private JButton btnSetVelocities = null;
254

    
255
        private Network network;
256

    
257
        private ArrayList routeFlags;
258

    
259
        private JLabel lblCost;
260

    
261
        private JLabel lblFlagAmout;
262

    
263
        private JButton btnPullDownStage;
264

    
265
        private JButton btnPushUpStage;
266

    
267
        private JButton btnRemoveStage;
268

    
269
        private JPanel southPanel;
270

    
271
        private final String[] colName = new String[] {
272
                        PluginServices.getText(this, "enable"),
273
                        PluginServices.getText(this, "stage"),
274
                        PluginServices.getText(this, "cost"), };
275

    
276
        private JButton btnCenterOnFlag;
277

    
278
        private JButton btnSaveRoute;
279

    
280
        private MapControl mapCtrl;
281

    
282
        private JCheckBox chkTSP;
283

    
284
        private JCheckBox chkReturnToOrigin;
285

    
286
        private boolean bDoTSP = false;
287

    
288
        private boolean bReturnToOrigin = false;
289

    
290
        private class MyTableModel extends AbstractTableModel {
291
                public int getColumnCount() {
292
                        return 3;
293
                }
294

    
295
                public int getRowCount() {
296
                        return _getFlags().size();
297
                }
298

    
299
                public Object getValueAt(int rowIndex, int columnIndex) {
300
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
301
                        switch (columnIndex) {
302
                        case 0:
303
                                return new Boolean(flag.isEnabled());
304
                        case 1:
305
                                return flag.getDescription();
306
                        case 2:
307
                                return new Double(flag.getCost());
308
                        }
309

    
310
                        return null;
311
                }
312

    
313
                public Class getColumnClass(int columnIndex) {
314
                        switch (columnIndex)
315
                        {
316
                        case 0:
317
                                return Boolean.class;
318
                        case 1:
319
                                return String.class;
320
                        case 2:
321
                                return Double.class;
322

    
323
                        }
324
                        return super.getColumnClass(columnIndex);
325
                }
326

    
327
                public String getColumnName(int column) {
328
                        return colName[column];
329
                }
330

    
331
                public boolean isCellEditable(int rowIndex, int columnIndex) {
332
                        if (columnIndex == 2)
333
                                return false;
334
                        return true;
335

    
336
                }
337

    
338
                public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
339
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
340
                        switch (columnIndex)
341
                        {
342
                        case 0:
343
                                Boolean bAux = (Boolean) aValue;
344
                                flag.setEnabled(bAux.booleanValue());
345
                                PluginServices.getMainFrame().enableControls();
346
                                return;
347
                        case 1:
348
                                String strAux = (String) aValue;
349
                                flag.setDescription(strAux);
350
                                return;
351

    
352
//                        case 2: // No es editable
353
//                                Double dblAux = (Double) aValue;
354
//                                flag.setCost(dblAux.doubleValue());
355
//                                return;
356

    
357
                        }
358

    
359
                }
360

    
361
        }
362

    
363
        /**
364
         * This method initializes
365
         *
366
         */
367
        public RouteControlPanel(Network network) {
368
                super();
369
                this.network = network;
370
//                GvFlag[] flags = network.getFlags();
371
//                List vflags = _getFlags();
372
//                for (int i = 0; i < flags.length; i++) {
373
//                        vflags.add(flags[i]);
374
//                }
375
                initialize();
376
        }
377

    
378
        /**
379
         * Method to remove all flags (use
380
         * */
381
        public void refresh(){
382
//                GvFlag[] flags = network.getFlags();
383
//                List vflags = _getFlags();
384
//                List tempFlags = Arrays.asList(flags);
385
//                vflags.addAll(tempFlags);
386
                lblFlagAmout.setText(String.valueOf(_getFlags()
387
                                .size()));
388
                updateTotalCost();
389
                ListSelectionModel rowSM = tblStages.getSelectionModel();
390
                getChkTSP().setEnabled((_getFlags().size() > 2));
391
                getChkReturnToOrigin().setEnabled((_getFlags().size() > 1));
392
                if (_getFlags().size() == 0)
393
                {
394
                        getBtnCenterOnFlag().setEnabled(false);                        
395
                }
396
                else
397
                {
398
                        getBtnCenterOnFlag().setEnabled(!rowSM.isSelectionEmpty());
399
                }
400
                getTblStages().revalidate();
401
                System.out.println("Actualizo tabla");
402

    
403
        }
404
        private void processLayer(FLayer layer) {
405
                if (layer.isActive()) {
406
                        if (layer instanceof FLyrVect) {
407
                                Network net = (Network) layer
408
                                                .getProperty("network");
409
                                if (net != null) {
410
                                        network = net;
411
                                        network.addFlagListener(this);
412
                                        refresh();
413
                                }// if
414
                        }// if
415
                }// if
416

    
417
        }
418

    
419
        public void setMapControl(MapControl mapCtrl, Network net) {
420
                if (mapCtrl != null) {
421
                        this.mapCtrl = mapCtrl;
422
                        LayerListenerAdapter listener = new LayerListenerAdapter() {
423
                                public void activationChanged(LayerEvent e) {
424
                                        processLayer(e.getSource());
425
                                }
426
                        };
427
                        mapCtrl.getMapContext().getLayers().addLayerListener(listener);
428
                        mapCtrl.getMapContext().getLayers().addLayerCollectionListener(
429
                                        listener);
430
                        if (net != null) {
431
                                network = net;
432
                                network.addFlagListener(this);
433
                        }
434
                }
435
        }
436

    
437
        public RouteControlPanel() {
438
                super();
439
                initialize();
440
        }
441

    
442
        public void setCostUnits(String unitsName) {
443
                colName[2] = unitsName;
444
                getTblStages().repaint();
445
        }
446

    
447
        /**
448
         * This method initializes this
449
         *
450
         */
451
        private void initialize() {
452
                BorderLayout borderLayout = new BorderLayout();
453
                borderLayout.setHgap(10);
454
                borderLayout.setVgap(10);
455
                JPanel cont = new JPanel(borderLayout);
456
//                cont.setPreferredSize(new Dimension(490, 320));
457
                this.setPreferredSize(new Dimension(460, 280));
458
                cont.add(getWestPanel(), BorderLayout.CENTER);
459
                cont.add(getEastPanel(), BorderLayout.EAST);
460
                cont.add(getSouthPanel(), BorderLayout.SOUTH);
461
                this.setLayout(new FlowLayout(FlowLayout.LEADING, 10, 10));
462
                this.add(cont);
463
                updateFlags();
464
        }
465

    
466
        private void updateFlags() {
467
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
468
                updateTotalCost();
469
                getTblStages().repaint();
470
        }
471

    
472
        private JPanel getSouthPanel() {
473
                if (southPanel == null) {
474
                        southPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
475
                        southPanel.add(getBtnRemoveStage());
476
                        southPanel.add(new JBlank(50, 20));
477
                        southPanel.add(getBtnPushUpStage());
478
                        southPanel.add(getBtnPullDownStage());
479
                        southPanel.add(new JLabel(PluginServices.getText(this,
480
                                        "flag_amount")));
481
                        lblFlagAmout = new JLabel();
482
                        lblFlagAmout.setFont(lblFlagAmout.getFont().deriveFont(Font.BOLD));
483
                        southPanel.add(lblFlagAmout);
484
                }
485
                return southPanel;
486
        }
487

    
488
        public Object getWindowModel() {
489
                return this.getClass();
490
        }
491

    
492
        public WindowInfo getWindowInfo() {
493
                if (wi == null) {
494
                        wi = new WindowInfo(WindowInfo.MODELESSDIALOG
495
                                    | WindowInfo.MAXIMIZABLE
496
                                        | WindowInfo.ICONIFIABLE | WindowInfo.PALETTE);
497
                        wi.setWidth((int) this.getPreferredSize().getWidth());
498
                        wi.setHeight((int) this.getPreferredSize().getHeight());
499
                        wi.setTitle(PluginServices.getText(this, "route_control_panel"));
500
                }
501
                return wi;
502
        }
503
        
504
        public Object getWindowProfile(){
505
                return WindowInfo.TOOL_PROFILE;
506
        }
507
        
508

    
509
        /**
510
         * This method initializes westPanel
511
         *
512
         * @return javax.swing.JPanel
513
         */
514
        private JPanel getWestPanel() {
515
                if (westPanel == null) {
516
                        westPanel = new JPanel(new BorderLayout(5, 5));
517
                        lblCost = new JLabel();
518
                        lblCost.setFont(lblCost.getFont().deriveFont(Font.BOLD));
519
                        GridBagLayoutPanel aux = new GridBagLayoutPanel();
520
                        aux.addComponent(PluginServices.getText(this, "total_route_cost")
521
                                        + ":", lblCost);
522
                        aux.addComponent(getScrlStages());
523

    
524
                        westPanel.add(aux);
525
                }
526
                return westPanel;
527
        }
528

    
529
        private JButton getBtnPullDownStage() {
530
                if (btnPullDownStage == null) {
531
                        btnPullDownStage = new JButton(new ImageIcon(this.getClass()
532
                                        .getClassLoader().getResource("images/down-arrow.png")));
533
                        // btnPullDownStage.setName("btnPullDownStage");
534
                        btnPullDownStage.addActionListener(this);
535
                }
536
                return btnPullDownStage;
537
        }
538

    
539
        private JButton getBtnPushUpStage() {
540
                if (btnPushUpStage == null) {
541
                        btnPushUpStage = new JButton(new ImageIcon(this.getClass()
542
                                        .getClassLoader().getResource("images/up-arrow.png")));
543
                        // btnPushUpStage.setName("btnPushUpStage");
544
                        btnPushUpStage.addActionListener(this);
545
                }
546
                return btnPushUpStage;
547
        }
548

    
549
        private JButton getBtnRemoveStage() {
550
                if (btnRemoveStage == null) {
551
                        btnRemoveStage = new JButton(new ImageIcon(this.getClass()
552
                                        .getClassLoader().getResource("images/delete.png")));
553
                        // btnRemoveStage.setName("btnRemoveStage");
554
                        btnRemoveStage.addActionListener(this);
555
                }
556
                return btnRemoveStage;
557
        }
558

    
559
        /**
560
         * This method initializes scrlStages
561
         *
562
         * @return javax.swing.JScrollPane
563
         */
564
        private JScrollPane getScrlStages() {
565
                if (scrlStages == null) {
566
                        scrlStages = new JScrollPane();
567
                        scrlStages.setViewportView(getTblStages());
568
                        scrlStages.setPreferredSize(new Dimension(270, 200));
569
                }
570
                return scrlStages;
571
        }
572

    
573
        /**
574
         * @deprecated
575
         * @param flag
576
         */
577
        public void addFlag(GvFlag flag) {
578
                _getFlags().add(flag);
579
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
580
                updateTotalCost();
581
                getTblStages().repaint();
582
        }
583

    
584
        private void updateTotalCost() {
585
                GvFlag[] flags = getFlags();
586
                double cost = 0;
587
                for (int i = 0; i < flags.length; i++) {
588
                        if (!flags[i].isEnabled())
589
                                continue;
590
                        if (flags[i].getCost() >= Double.MAX_VALUE)
591
                        {
592
                                lblCost.setText(PluginServices.getText(this, "no_se_puede_pasar_por_todas_las_paradas"));
593
                                return;
594
                        }
595
                        if (flags[i].getCost() < 0)
596
                        {
597
                                lblCost.setText(PluginServices.getText(this, "solucion_no_valida"));
598
                                return;
599
                        }
600
                                
601
                        cost += flags[i].getCost();
602
                }
603
                NumberFormat nf = NumberFormat.getInstance();
604
                nf.setMaximumFractionDigits(2);
605
                lblCost.setText(nf.format(cost) + getCostUnitName());
606
        }
607

    
608
        private String getCostUnitName() {
609
                if (colName[2].equals(PluginServices.getText(this, "cost")))
610
                        return "";
611
                return colName[2];
612
        }
613

    
614
        public void removeFlag(GvFlag flag) {
615
                removeFlag(_getFlags().indexOf(flag));
616
        }
617

    
618
        public void removeFlag(int index) {
619
                _getFlags().remove(index);
620
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
621
                getTblStages().repaint();
622
        }
623

    
624
        /**
625
         * This method initializes tblStages
626
         *
627
         * @return javax.swing.JTable
628
         */
629
        private JTable getTblStages() {
630
                if (tblStages == null) {
631
                        tblStages = new JTable();
632
                        tblStages
633
                                        .setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
634
                        tblStages.setModel(getTableModel());
635
                        TableColumnModel cm = tblStages.getColumnModel();
636

    
637
                        int tablePreferredWidth = (int) tblStages.getPreferredSize()
638
                                        .getWidth();
639
                        int colSize = tblStages.getFontMetrics(tblStages.getFont())
640
                                        .stringWidth(tblStages.getModel().getColumnName(0)) * 2;
641
                        cm.getColumn(0).setPreferredWidth((int) (colSize));
642
                        cm.getColumn(0).setMinWidth((int) (colSize));
643
                        cm.getColumn(0).setMaxWidth((int) (colSize));
644
                        tablePreferredWidth -= colSize;
645
                        cm.getColumn(1)
646
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.7));
647
                        cm.getColumn(2)
648
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.3));
649

    
650
                        // Ask to be notified of selection changes.
651
                        ListSelectionModel rowSM = tblStages.getSelectionModel();
652
                        rowSM.addListSelectionListener(new ListSelectionListener() {
653
                            public void valueChanged(ListSelectionEvent e) {
654
                                //Ignore extra messages.
655
                                if (e.getValueIsAdjusting())
656
                                        return;
657

    
658
                                ListSelectionModel lsm =
659
                                    (ListSelectionModel)e.getSource();
660
                                getBtnCenterOnFlag().setEnabled(!lsm.isSelectionEmpty());
661
                                        int[] selected = tblStages.getSelectedRows();
662
                                        if (selected.length == 0)
663
                                                return;
664
                                        GvFlag flag = (GvFlag) _getFlags().get(selected[0]);
665

    
666
                                Point2D p = flag.getOriginalPoint();
667
                                mapCtrl.repaint(); // borramos el de antes
668
                                NetworkUtils.flashPoint(mapCtrl, p.getX(), p.getY());
669
                            }
670
                        });
671
                        
672
                        tblStages.getModel().addTableModelListener(new TableModelListener() {
673

    
674
                                public void tableChanged(TableModelEvent e) {
675
                                        System.out.println("Table model changed");
676
//                                        getBtnCenterOnFlag().setEnabled(false);
677
                                }
678
                                
679
                        });
680

    
681
                        
682
                }
683
                return tblStages;
684
        }
685

    
686
        protected int getFlagCount() {
687
                return _getFlags().size();
688
        }
689

    
690
        private List _getFlags() {
691
//                if (routeFlags == null) {
692
//                        routeFlags = new ArrayList();
693
//                }
694
//                return routeFlags;
695

    
696
                return network.getOriginaFlags();
697
        }
698

    
699
        protected boolean isSelected(int row) {
700
                return ((GvFlag) _getFlags().get(row)).isEnabled();
701
        }
702

    
703
        /**
704
         * This method initializes eastPanel
705
         *
706
         * @return javax.swing.JPanel
707
         */
708
        private JPanel getEastPanel() {
709
                if (eastPanel == null) {
710
                        GridLayout layout = new GridLayout();
711
                        layout.setColumns(1);
712
                        layout.setVgap(5);
713
                        JPanel aux = new JPanel();
714
                        aux.add(getBtnLoadStage());
715
                        aux.add(getBtnSaveStage());
716
                        aux.add(getBtnSaveRoute());
717
                        aux.add(getBtnCenterOnFlag());
718
                        aux.add(getBtnSetVelocities());
719
                        aux.add(getChkTSP());
720
                        aux.add(getChkReturnToOrigin());
721
                        layout.setRows(aux.getComponentCount());
722
                        aux.setLayout(layout);
723
                        eastPanel = new GridBagLayoutPanel();
724
                        eastPanel.addComponent(aux);
725
                }
726
                return eastPanel;
727
        }
728

    
729
        private JCheckBox getChkTSP() {
730
                if (chkTSP == null) {
731
                        chkTSP = new JCheckBox();
732
                        chkTSP.setText(PluginServices.getText(this,
733
                                        "order_stops"));
734
                        chkTSP.setEnabled(false);
735
                        chkTSP.addActionListener(this);
736
                }
737
                return chkTSP;
738
        }
739

    
740
        private JCheckBox getChkReturnToOrigin() {
741
                if (chkReturnToOrigin == null) {
742
                        chkReturnToOrigin = new JCheckBox();
743
                        chkReturnToOrigin.setText(PluginServices.getText(this,
744
                                        "return_to_origin"));
745
                        chkReturnToOrigin.setEnabled(false);
746
                        chkReturnToOrigin.addActionListener(this);
747
                }
748
                return chkReturnToOrigin;
749
        }
750

    
751
        private JButton getBtnCenterOnFlag() {
752
                if (btnCenterOnFlag == null) {
753
                        btnCenterOnFlag = new JButton();
754
                        btnCenterOnFlag.setText(PluginServices.getText(this,
755
                                        "center_on_flag"));
756
                        btnCenterOnFlag.setEnabled(false);
757
                        btnCenterOnFlag.addActionListener(this);
758
                }
759
                return btnCenterOnFlag;
760
        }
761

    
762
        private JButton getBtnSetVelocities() {
763
                if (btnSetVelocities == null) {
764
                        btnSetVelocities = new JButton();
765
                        btnSetVelocities.setText(PluginServices.getText(this,
766
                                        "set_velocities"));
767
//                        btnSetVelocities.setEnabled(false);
768
                        
769
                        // TODO: PONERLO VISIBLE CUANDO SE CORRIJA LO DE ABRIR EL
770
                        // DIALOGO Y LEER LAS VELOCIDADES QUE HAB?A ANTES.
771
                        btnSetVelocities.setVisible(true);
772
                        btnSetVelocities.addActionListener(this);
773
                }
774
                return btnSetVelocities;
775
        }
776

    
777
        private JButton getBtnSaveRoute() {
778
                if (btnSaveRoute == null) {
779
                        btnSaveRoute = new JButton();
780
                        btnSaveRoute.setText(PluginServices.getText(this, "save_route"));
781
                        btnSaveRoute.addActionListener(this);
782
                }
783
                return btnSaveRoute;
784
        }
785

    
786
        /**
787
         * This method initializes defaultTableModel
788
         *
789
         * @return javax.swing.table.DefaultTableModel
790
         */
791
        private TableModel getTableModel() {
792
                return tableModel;
793
        }
794

    
795
        /**
796
         * This method initializes btnLoadStage
797
         *
798
         * @return javax.swing.JButton
799
         */
800
        private JButton getBtnLoadStage() {
801
                if (btnLoadStage == null) {
802
                        btnLoadStage = new JButton();
803
                        btnLoadStage.setText(PluginServices.getText(this, "load_stages"));
804
                        btnLoadStage.addActionListener(this);
805
                }
806
                return btnLoadStage;
807
        }
808

    
809
        /**
810
         * This method initializes btnSaveStages
811
         *
812
         * @return javax.swing.JButton
813
         */
814
        private JButton getBtnSaveStage() {
815
                if (btnSaveStage == null) {
816
                        btnSaveStage = new JButton();
817
                        btnSaveStage.setText(PluginServices.getText(this, "save_stages"));
818
                        btnSaveStage.addActionListener(this);
819
                }
820
                return btnSaveStage;
821
        }
822

    
823
        class FormatSelectionPanel extends JPanel implements IWindow {
824

    
825
                JComboBox formats;
826
                WindowInfo wi = null;
827

    
828
                public FormatSelectionPanel(String introductoryText) {
829
                        super(new BorderLayout());
830
                        String[] formatos = { "SHP", "DXF", "POSTGIS", "GML" };
831
                        formats = new JComboBox(formatos);
832
                        GridBagLayoutPanel contentPanel =
833
                                new GridBagLayoutPanel();
834
                        contentPanel.addComponent(new JLabel(introductoryText));
835
                        contentPanel.addComponent(formats);
836
                        JButton okButton = new JButton(PluginServices.getText(null,
837
                                        "Aceptar"));
838
                        okButton.addActionListener(new ActionListener() {
839
                                public void actionPerformed(ActionEvent arg0) {
840
                                        close();
841
                                }
842
                        });
843
                        contentPanel.addComponent(okButton);
844

    
845
                        add(contentPanel);
846
                }
847

    
848
                void close() {
849
                        PluginServices.getMDIManager().closeWindow(this);
850
                }
851

    
852
                public String getSelectedFormat() {
853
                        return (String) formats.getSelectedItem();
854
                }
855

    
856
                public WindowInfo getWindowInfo() {
857
                        if (wi == null) {
858
                                wi = new WindowInfo(WindowInfo.MODALDIALOG | WindowInfo.PALETTE);
859
                                wi.setTitle(PluginServices
860
                                                .getText(null, "Seleccion_de_formato"));// Internacionalizar
861
                                                                                                                                // esto
862
                                wi.setWidth(300);
863
                                wi.setHeight(55);
864
                        }
865
                        return wi;
866
                }
867

    
868
                @Override
869
                public Object getWindowProfile() {
870
                        return WindowInfo.DIALOG_PROFILE;
871
                }
872

    
873
        }
874

    
875
        public void actionPerformed(ActionEvent e) {
876
                Component c = (Component) e.getSource();
877
                if (c.equals(getBtnLoadStage())) {
878
                        loadStages();
879
                } else if (c.equals(getBtnSaveStage())) {
880
                        saveStage();
881
                } else if (c.equals(getBtnPushUpStage())) {
882
                        int[] selected = tblStages.getSelectedRows();
883
                        if (selected.length == 0 || selected[0] == 0)
884
                                return;
885
                        tblStages.clearSelection();
886
                        for (int i = 0; i < selected.length; i++) {
887
                                Object aux = _getFlags().get(selected[i] - 1);
888
                                _getFlags().set(selected[i] - 1, _getFlags().get(selected[i]));
889
                                _getFlags().set(selected[i], aux);
890
                                selected[i]--;
891
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
892
                        }
893
                        invalidateSolution();
894
                } else if (c.equals(getBtnPullDownStage())) {
895
                        // pull down
896
                        int[] selected = tblStages.getSelectedRows();
897
                        if (selected.length == 0
898
                                        || selected[selected.length - 1] >= _getFlags().size() - 1)
899
                                return;
900

    
901
                        // move rows
902
                        tblStages.clearSelection();
903
                        for (int i = selected.length - 1; i >= 0; i--) {
904
                                Object aux = _getFlags().get(selected[i] + 1);
905
                                _getFlags().set(selected[i] + 1, _getFlags().get(selected[i]));
906
                                _getFlags().set(selected[i], aux);
907
                                selected[i]++;
908
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
909
                        }
910
                        invalidateSolution();
911

    
912
                } else if (c.equals(getBtnRemoveStage())) {
913
                        removeStage();                        
914
                } else if (c.equals(getBtnSaveRoute())) {
915
                        saveRoute();
916
                } else if (c.equals(getBtnSetVelocities())) {
917
                        setVelocities();                        
918
                } else if (c.equals(getChkTSP())) {
919
                        bDoTSP = getChkTSP().isSelected();                        
920
                } else if (c.equals(getChkReturnToOrigin())) {
921
                        bReturnToOrigin = getChkReturnToOrigin().isSelected();                        
922
                } else if (c.equals(getBtnCenterOnFlag())) {
923
                        // Center on first selected flag.
924
                        int[] selected = tblStages.getSelectedRows();
925
                        if (selected.length == 0)
926
                                return;
927
                        GvFlag flag = (GvFlag) _getFlags().get(selected[0]);
928
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
929
                        if(! (window instanceof IView))
930
                                return;
931
                        IView view = (IView) window;
932
                        ViewPort vp = view.getMapControl().getViewPort();
933
                        Rectangle2D extent = vp.getAdjustedExtent();
934
                        double xNC = flag.getOriginalPoint().getX();
935
                        double yNC = flag.getOriginalPoint().getY();
936
                        double width = extent.getWidth();
937
                        double height = extent.getHeight();
938
                        
939
                        Rectangle2D.Double r = new Rectangle2D.Double();
940
                        
941
                        r.width = width;
942
                        r.height = height;
943
                        r.x = xNC - width/2;
944
                        r.y = yNC - height/2;
945

    
946
                        vp.setExtent(r);
947

    
948
                        
949
                                
950
                }
951
                repaint();
952
        }
953

    
954
        private void setVelocities() {
955
                if(network == null){
956
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
957
                        if(! (window instanceof IView))
958
                                return;
959
                        IView view = (View) window;
960
                        MapControl mapControl = view.getMapControl();
961
                        MapContext map = mapControl.getMapContext();
962
                        FLayers layers = map.getLayers();
963
                        SingleLayerIterator it = new SingleLayerIterator(layers);
964
                        while (it.hasNext() && network == null) {
965
                                FLayer aux = it.next();
966
                                if (!aux.isActive())
967
                                        continue;
968
                                network = (Network) aux.getProperty("network");
969
                        }
970
                }
971
                if (network == null)
972
                        return;
973
                
974
                ArrayList lstTipoTramo = network.getEdgeTypes();
975
                
976
                // I try to use a generic multiinputdialog. All this stuff can be extracted
977
                // from here and subclass MultiInputDlg
978
                Hashtable veloMeters  = network.getVelocities();        
979
                ArrayList veloKm = new ArrayList(lstTipoTramo.size());
980
                if (veloMeters != null)
981
                {                        
982
                        NumberFormat nf = NumberFormat.getInstance();
983
                        for (int i=0; i<lstTipoTramo.size(); i++)
984
                        {
985
                                Object key = lstTipoTramo.get(i);
986
                                Double velM = (Double) veloMeters.get(key);
987
                                System.out.println("Vel. Metros / seg = " + velM);
988
                                if (velM != null)                                        
989
                                        veloKm.add(i, nf.format(velM.doubleValue() * 3.6));
990
                                else
991
                                        veloKm.add(i, "0");
992
                        } // for
993
                }
994
                else
995
                {                        
996
                        for (int i=0; i<lstTipoTramo.size(); i++)
997
                        {
998
                                veloKm.add(i, "60");
999
                        } // for                        
1000
                }
1001
                try
1002
                {
1003
                        String msg = PluginServices.getText(this, "msg_set_velocities");
1004
                        MultiInputDlg dlg = new MultiInputDlg(msg, lstTipoTramo, veloKm);
1005
                        String col1 = PluginServices.getText(this, "col_arc_type");
1006
                        String col2 = PluginServices.getText(this, "col_km_per_hour");
1007
                        dlg.setColumnNames(col1, col2);
1008
                        dlg.setModal(true);
1009
                        dlg.setVisible(true);
1010
                        if (dlg.isCanceled())
1011
                                return;
1012
                        
1013
                        veloKm = dlg.getRightValues(); //{120, 110, 90, 80, 70, 60, 50, 40};
1014
                        veloMeters = new Hashtable(veloKm.size());
1015
                        for (int i=0; i<veloKm.size(); i++)
1016
                        {
1017
                                Object key = lstTipoTramo.get(i);
1018
                                veloMeters.put(key, new Double(Double.parseDouble((String) veloKm.get(i)) / 3.6));
1019
                        }
1020
                        
1021
                        network.setVelocities(veloMeters);
1022
                }
1023
                catch(Exception e)
1024
                {
1025
                        e.printStackTrace();
1026
                }
1027

    
1028
                
1029
        }
1030

    
1031
        private void invalidateSolution() {
1032
                for (int i=0; i < _getFlags().size(); i++)
1033
                {
1034
                        GvFlag flag = (GvFlag) _getFlags().get(i);
1035
                        flag.setCost(-1.0);
1036
                }
1037
                updateTotalCost();
1038
        }
1039

    
1040
        private void saveStage(){
1041
                if(network == null){
1042
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
1043
                        if(! (window instanceof IView))
1044
                                return;
1045
                        IView view = (View) window;
1046
                        MapControl mapControl = view.getMapControl();
1047
                        MapContext map = mapControl.getMapContext();
1048
                        FLayers layers = map.getLayers();
1049
                        SingleLayerIterator it = new SingleLayerIterator(layers);
1050
                        while (it.hasNext() && network == null) {
1051
                                FLayer aux = it.next();
1052
                                if (!aux.isActive())
1053
                                        continue;
1054
                                network = (Network) aux.getProperty("network");
1055
                        }
1056
                }
1057
                if (network == null)
1058
                        return;
1059

    
1060
                List features = new ArrayList();
1061
                GvFlag[] flags = network.getFlags();
1062
                for(int i = 0; i < flags.length; i++){
1063
                        GvFlag flag = flags[i];
1064
                        // Solo se guardan los flags habilitados
1065
                        if (!flag.isEnabled())
1066
                                continue;
1067
                        FPoint2D point = new FPoint2D(flag.getOriginalPoint());
1068
                        Value[] values = new Value[6];
1069
                        values[GvFlag.ID_FLAG_INDEX] = ValueFactory.createValue(flag.getIdFlag());
1070
                        values[GvFlag.ID_ARC_INDEX] = ValueFactory.createValue(flag.getIdArc());
1071
                        values[GvFlag.DESCRIPTION_INDEX] = ValueFactory.createValue(flag.getDescription());
1072
                        values[GvFlag.DIREC_INDEX] = ValueFactory.createValue(flag.getDirec());
1073
                        values[GvFlag.PCT_INDEX] = ValueFactory.createValue(flag.getPct());
1074
                        values[GvFlag.COST_INDEX] = ValueFactory.createValue(flag.getCost());
1075
                        IGeometry geo = ShapeFactory.createPoint2D(point);
1076
                        DefaultFeature feature = new DefaultFeature(geo, values, new Integer(flag.getIdFlag()).toString() );
1077
                        features.add(feature);
1078
                }
1079

    
1080
                FlagsMemoryDriver driver = new FlagsMemoryDriver(features);
1081
                IProjection projection = AddLayerDialog.getLastProjection();
1082
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Flags",
1083
                                driver, projection);
1084

    
1085
                FormatSelectionPanel selectionPanel =
1086
                        new FormatSelectionPanel(PluginServices.
1087
                                        getText(null,
1088
                                "Seleccione_un_formato_para_guardar_los_flags"));
1089
                PluginServices.getMDIManager().addWindow(selectionPanel);
1090

    
1091
                String format = selectionPanel.getSelectedFormat();
1092
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
1093
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1094
                if(! (window instanceof IView))
1095
                        return;
1096
                IView view = (View) window;
1097
                MapControl mapControl = view.getMapControl();
1098
                MapContext context = mapControl.getMapContext();
1099
//                try {
1100
                        if (format.equalsIgnoreCase("SHP")) {
1101
                                export.saveToShp(context, routeLayer);
1102
                        } else if (format.equalsIgnoreCase("DXF")) {
1103
                                export.saveToDxf(context, routeLayer);
1104
                        } else if (format.equalsIgnoreCase("GML")) {
1105
                                export.saveToGml(context, routeLayer);
1106
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
1107
                                export.saveToPostGIS(context, routeLayer);
1108
                        }
1109
//                } catch (BaseException e1) {
1110
//                        // TODO Auto-generated catch block
1111
//                        e1.printStackTrace();
1112
//                }
1113

    
1114
        }
1115
        private void saveRoute() {
1116
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1117
                if(! (window instanceof IView))
1118
                        return;
1119
                IView view = (View) window;
1120
                MapControl mapControl = view.getMapControl();
1121
                List routes = (List) GvSession.getInstance().get(mapControl, "Route");
1122
                if(routes == null || routes.size() == 0){
1123
                        JOptionPane.showMessageDialog(this, PluginServices.getText(this, "Ruta_borrada_o_inexistente"),
1124
                                        PluginServices.getText(this, "Ruta_no_encontrada"),
1125
                                        JOptionPane.ERROR_MESSAGE);
1126
                        return;
1127
                }        
1128
                Route lastRoute = (Route) routes.get(routes.size() - 1);
1129
                RouteMemoryDriver driver = new RouteMemoryDriver(lastRoute.getFeatureList());
1130
                IProjection projection = AddLayerDialog.getLastProjection();
1131
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Route",
1132
                                driver, projection);
1133

    
1134
                FormatSelectionPanel selectionPanel = new FormatSelectionPanel(PluginServices.getText(null,
1135
                "Seleccione_un_formato_para_guardar_la_ruta"));
1136
                PluginServices.getMDIManager().addWindow(selectionPanel);
1137

    
1138
                String format = selectionPanel.getSelectedFormat();
1139
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
1140
                MapContext context = mapControl.getMapContext();
1141
                        if (format.equalsIgnoreCase("SHP")) {
1142
                                export.saveToShp(context, routeLayer);
1143
                        } else if (format.equalsIgnoreCase("DXF")) {
1144
                                export.saveToDxf(context, routeLayer);
1145
                        } else if (format.equalsIgnoreCase("GML")) {
1146
                                export.saveToGml(context, routeLayer);
1147
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
1148
                                export.saveToPostGIS(context, routeLayer);
1149
                        }
1150
        }
1151

    
1152
        /**
1153
         * Converts a point layer loaded in the active view's toc in a collection of
1154
         * flags of the active network
1155
         *
1156
         */
1157
        private void loadStages() {
1158

    
1159
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1160
                if(! (window instanceof IView))
1161
                        return;
1162
                IView view = (IView) window;
1163
                MapControl mapControl = view.getMapControl();
1164
                MapContext map = mapControl.getMapContext();
1165
                FLayers layers = map.getLayers();
1166

    
1167
                String title = PluginServices.getText(this,
1168
                                "Seleccionar_capa_con_puntos_de_parada");
1169
                String introductoryText = PluginServices.getText(this,
1170
                                "Seleccione_una_capa_de_puntos_para_crear_paradas");
1171

    
1172
                LayerSelectionPanel selectionPanel = new LayerSelectionPanel(layers,
1173
                                title, introductoryText, FLyrVect.class, FShape.POINT);
1174
                selectionPanel.addGeometryTypeConstraint(FShape.MULTIPOINT);
1175
                PluginServices.getMDIManager().addWindow(selectionPanel);
1176

    
1177
                if (!selectionPanel.wasFinishPressed())
1178
                        return;
1179
                else {
1180
                        FLayer layer = selectionPanel.getLayer();
1181
                        if (layer == null)
1182
                                return;
1183
                        if (!(layer instanceof FLyrVect))
1184
                                return;
1185
                        FLyrVect vectLyr = (FLyrVect) layer;
1186

    
1187
                        try {
1188

    
1189
                                // TODO
1190
                                // Hay que refinar bastante, para que el usuario elija
1191
                                // con que red y con qu? capa lineal quiere trabajar
1192
                                // tal y como est?, si hubiese varias se trabajaria
1193
                                // con la primera que devuelva el iterador
1194

    
1195
                                Network net = null;
1196
                                SingleLayerIterator it = new SingleLayerIterator(layers);
1197
                                while (it.hasNext() && net == null) {
1198
                                        FLayer aux = it.next();
1199
                                        if (!aux.isActive())
1200
                                                continue;
1201
                                        net = (Network) aux.getProperty("network");
1202
                                }
1203
                                if (net == null)
1204
                                        return;
1205

    
1206
                                // Por si queremos a?adir paradas a otras ya existentes
1207
//                                _getFlags().clear();
1208
                                
1209
                                GvFlag flag;
1210
                                ReadableVectorial reader = vectLyr.getSource();
1211
                                SelectableDataSource recordset = vectLyr.getRecordset();
1212
                                int numShapes = reader.getShapeCount();
1213

    
1214
                                double realTol = mapCtrl.getViewPort()
1215
                                                .toMapDistance(FlagListener.pixelTolerance);
1216
                                reader.start();
1217
                                for (int i = 0; i < numShapes; i++) {
1218
                                        Geometry geo = reader.getShape(i).toJTSGeometry();
1219
                                        if (!((geo instanceof Point) || (geo instanceof MultiPoint)))
1220
                                                continue;
1221
                                        
1222
                                        
1223

    
1224
                                        Coordinate[] coords = geo.getCoordinates();
1225
                                        if (coords.length > 1) {
1226
                                                logger.warn("The record " + i + " has " + coords.length + " coordinates. Pay attention!!");
1227
                                        }
1228
                                        for (int j = 0; j < coords.length; j++) {
1229

    
1230
                                                try {
1231
                                                        flag = net.addFlag(coords[j].x, coords[j].y, realTol);
1232
                                                        if (flag == null)
1233
                                                        {
1234
                                                                // segundo intento:
1235
                                                                flag = net.addFlag(coords[j].x, coords[j].y, 4*realTol);
1236
                                                                if (flag == null)
1237
                                                                {                                                                
1238
                                                                        NullPointerException e = new NullPointerException("Punto " + i + " fuera de la red. Tolerancia=" + realTol);
1239
                                                                        NotificationManager.addError("No se puedo situar el registro " + i + 
1240
                                                                                        "Por favor, compruebe que est? encima de la red o aumente la tolerancia.", e);
1241
                                                                }
1242
                                                        }
1243
                                                        if (flag != null)
1244
                                                        {
1245
                                                        // TODO: Create use a IFlagListener to do this
1246
                                                        // inside flagsChanged. The best solution is
1247
                                                        // to put all the code in RouteControlPanel
1248
                                                                NetworkUtils.addGraphicFlag(mapControl, flag);
1249
                                                        }
1250
                                                } catch (GraphException e) {
1251
                                                        e.printStackTrace();
1252
                                                        NotificationManager.addError("No se puedo situar el registro " + i + 
1253
                                                                        "Por favor, compruebe que est? encima de la red.", e);
1254
                                                }
1255

    
1256
                                        } // for j
1257
                                } // for i
1258
                                reader.stop();
1259
                                mapControl.drawGraphics();
1260
                                PluginServices.getMainFrame().enableControls();
1261

    
1262
                        } catch (BaseException e1) {
1263
                                return;
1264
                        }
1265
                }
1266
        }
1267

    
1268
        /**
1269
         * Removes the selected flags in the component's table from: -the graphic
1270
         * layer of the active view -the active network -the own table
1271
         *
1272
         */
1273
        private void removeStage() {
1274
                int[] selected = tblStages.getSelectedRows();
1275

    
1276
                for (int i = selected.length - 1; i >= 0; i--) {
1277
                        try {
1278
                                // removeFlag(selected[i]);
1279
                                if (network != null) {
1280
                                        final GvFlag flag = (GvFlag) _getFlags().get(selected[i]);
1281
                                        NetworkUtils.clearFlagFromGraphics(mapCtrl, flag);
1282
                                        network.removeFlag(flag);
1283
                                        mapCtrl.repaint();
1284
                                }
1285
                        } catch (IndexOutOfBoundsException iobEx) {
1286
                        }
1287

    
1288
                }// for
1289
                tblStages.clearSelection();
1290
                invalidateSolution();
1291
                mapCtrl.drawMap(false);
1292
        }
1293

    
1294
        public GvFlag[] getFlags() {
1295
                return (GvFlag[]) _getFlags().toArray(new GvFlag[0]);
1296
        }
1297

    
1298
        public void flagsChanged(int reason) {
1299
                refresh();
1300
                mapCtrl.drawGraphics();
1301

    
1302
        }
1303

    
1304
        public boolean isTspSelected() {
1305
                return bDoTSP;
1306
        }
1307

    
1308
        public boolean isReturnToOriginSelected() {
1309
                return bReturnToOrigin;
1310
        }
1311
} // @jve:decl-index=0:visual-constraint="17,9"