Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extGraph / src / org / gvsig / graph / gui / RouteControlPanel.java @ 30840

History | View | Annotate | Download (37.3 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 30840 2009-09-18 16:06:37Z fpenarrubia $
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.JTextField;
176
import javax.swing.ListSelectionModel;
177
import javax.swing.event.ListSelectionEvent;
178
import javax.swing.event.ListSelectionListener;
179
import javax.swing.event.TableModelEvent;
180
import javax.swing.event.TableModelListener;
181
import javax.swing.table.AbstractTableModel;
182
import javax.swing.table.TableColumnModel;
183
import javax.swing.table.TableModel;
184

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

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

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

    
238
        WindowInfo wi;
239

    
240
        protected JPanel westPanel = null;
241

    
242
        protected JScrollPane scrlStages = null;
243

    
244
        protected JTable tblStages = null;
245

    
246
        protected GridBagLayoutPanel eastPanel = null;
247

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

    
250
        private JButton btnLoadStage = null;
251

    
252
        private JButton btnSaveStage = null;
253

    
254
        private JButton btnSetVelocities = null;
255

    
256
        Network network;
257

    
258
        private ArrayList routeFlags;
259

    
260
        JLabel lblCost;
261

    
262
        private JLabel lblFlagAmout;
263

    
264
        private JButton btnPullDownStage;
265

    
266
        private JButton btnPushUpStage;
267

    
268
        private JButton btnRemoveStage;
269

    
270
        private JPanel southPanel;
271

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

    
277
        private JButton btnCenterOnFlag;
278

    
279
        private JButton btnSaveRoute;
280

    
281
        MapControl mapCtrl;
282

    
283
        private JCheckBox chkTSP;
284

    
285
        private JCheckBox chkReturnToOrigin;
286

    
287
        private boolean bDoTSP = false;
288

    
289
        private boolean bReturnToOrigin = false;
290

    
291
        protected JPanel panelButtonsEast = new JPanel();
292

    
293
        private JTextField txtTolerance;
294

    
295
        private class MyTableModel extends AbstractTableModel {
296
                public int getColumnCount() {
297
                        return 3;
298
                }
299

    
300
                public int getRowCount() {
301
                        return _getFlags().size();
302
                }
303

    
304
                public Object getValueAt(int rowIndex, int columnIndex) {
305
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
306
                        switch (columnIndex) {
307
                        case 0:
308
                                return new Boolean(flag.isEnabled());
309
                        case 1:
310
                                return flag.getDescription();
311
                        case 2:
312
                                return new Double(flag.getCost());
313
                        }
314

    
315
                        return null;
316
                }
317

    
318
                public Class getColumnClass(int columnIndex) {
319
                        switch (columnIndex)
320
                        {
321
                        case 0:
322
                                return Boolean.class;
323
                        case 1:
324
                                return String.class;
325
                        case 2:
326
                                return Double.class;
327

    
328
                        }
329
                        return super.getColumnClass(columnIndex);
330
                }
331

    
332
                public String getColumnName(int column) {
333
                        return colName[column];
334
                }
335

    
336
                public boolean isCellEditable(int rowIndex, int columnIndex) {
337
                        if (columnIndex == 2)
338
                                return false;
339
                        return true;
340

    
341
                }
342

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

    
357
//                        case 2: // No es editable
358
//                                Double dblAux = (Double) aValue;
359
//                                flag.setCost(dblAux.doubleValue());
360
//                                return;
361

    
362
                        }
363

    
364
                }
365

    
366
        }
367

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

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

    
408
        }
409
        private void processLayer(FLayer layer) {
410
                if (layer.isActive()) {
411
                        if (layer instanceof FLyrVect) {
412
                                Network net = (Network) layer
413
                                                .getProperty("network");
414
                                if (net != null) {
415
                                        network = net;
416
                                        network.addFlagListener(this);
417
                                        refresh();
418
                                }// if
419
                        }// if
420
                }// if
421

    
422
        }
423

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

    
442
        public RouteControlPanel() {
443
                super();
444
                initialize();
445
        }
446

    
447
        public void setCostUnits(String unitsName) {
448
                colName[2] = unitsName;
449
                getTblStages().repaint();
450
        }
451

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

    
471
        protected void updateFlags() {
472
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
473
                updateTotalCost();
474
                getTblStages().repaint();
475
        }
476

    
477
        protected JPanel getSouthPanel() {
478
                if (southPanel == null) {
479
                        southPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
480
                        southPanel.add(getBtnRemoveStage());
481
                        southPanel.add(new JBlank(50, 20));
482
                        southPanel.add(getBtnPushUpStage());
483
                        southPanel.add(getBtnPullDownStage());
484
                        southPanel.add(new JLabel(PluginServices.getText(this,
485
                                        "flag_amount")));
486
                        lblFlagAmout = new JLabel();
487
                        lblFlagAmout.setFont(lblFlagAmout.getFont().deriveFont(Font.BOLD));
488
                        southPanel.add(lblFlagAmout);
489
                }
490
                return southPanel;
491
        }
492

    
493
        public Object getWindowModel() {
494
                return this.getClass();
495
        }
496

    
497
        public WindowInfo getWindowInfo() {
498
                if (wi == null) {
499
                        wi = new WindowInfo(WindowInfo.MODELESSDIALOG
500
                                    | WindowInfo.MAXIMIZABLE
501
                                        | WindowInfo.ICONIFIABLE | WindowInfo.PALETTE);
502
                        wi.setWidth((int) this.getPreferredSize().getWidth() + 10);
503
                        wi.setHeight(300);
504
                        wi.setTitle(PluginServices.getText(this, "route_control_panel"));
505
                }
506
                return wi;
507
        }
508

    
509
        public Object getWindowProfile(){
510
                return WindowInfo.TOOL_PROFILE;
511
        }
512

    
513

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

    
529
                        westPanel.add(aux);
530
                }
531
                return westPanel;
532
        }
533

    
534
        private JButton getBtnPullDownStage() {
535
                if (btnPullDownStage == null) {
536
                        btnPullDownStage = new JButton(new ImageIcon(this.getClass()
537
                                        .getClassLoader().getResource("images/down-arrow.png")));
538
                        // btnPullDownStage.setName("btnPullDownStage");
539
                        btnPullDownStage.addActionListener(this);
540
                }
541
                return btnPullDownStage;
542
        }
543

    
544
        private JButton getBtnPushUpStage() {
545
                if (btnPushUpStage == null) {
546
                        btnPushUpStage = new JButton(new ImageIcon(this.getClass()
547
                                        .getClassLoader().getResource("images/up-arrow.png")));
548
                        // btnPushUpStage.setName("btnPushUpStage");
549
                        btnPushUpStage.addActionListener(this);
550
                }
551
                return btnPushUpStage;
552
        }
553

    
554
        private JButton getBtnRemoveStage() {
555
                if (btnRemoveStage == null) {
556
                        btnRemoveStage = new JButton(new ImageIcon(this.getClass()
557
                                        .getClassLoader().getResource("images/delete.png")));
558
                        // btnRemoveStage.setName("btnRemoveStage");
559
                        btnRemoveStage.addActionListener(this);
560
                }
561
                return btnRemoveStage;
562
        }
563

    
564
        /**
565
         * This method initializes scrlStages
566
         *
567
         * @return javax.swing.JScrollPane
568
         */
569
        protected JScrollPane getScrlStages() {
570
                if (scrlStages == null) {
571
                        scrlStages = new JScrollPane();
572
                        scrlStages.setViewportView(getTblStages());
573
                        scrlStages.setPreferredSize(new Dimension(270, 200));
574
                }
575
                return scrlStages;
576
        }
577

    
578
        /**
579
         * @deprecated
580
         * @param flag
581
         */
582
        public void addFlag(GvFlag flag) {
583
                _getFlags().add(flag);
584
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
585
                updateTotalCost();
586
                getTblStages().repaint();
587
        }
588

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

    
606
                        cost = flags[i].getCost(); // The last flag shows total cost
607
                }
608
                NumberFormat nf = NumberFormat.getInstance();
609
                nf.setMaximumFractionDigits(2);
610
                lblCost.setText(nf.format(cost) + getCostUnitName());
611
        }
612

    
613
        private String getCostUnitName() {
614
                if (colName[2].equals(PluginServices.getText(this, "cost")))
615
                        return "";
616
                return colName[2];
617
        }
618

    
619
        public void removeFlag(GvFlag flag) {
620
                removeFlag(_getFlags().indexOf(flag));
621
        }
622

    
623
        public void removeFlag(int index) {
624
                _getFlags().remove(index);
625
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
626
                getTblStages().repaint();
627
        }
628

    
629
        /**
630
         * This method initializes tblStages
631
         *
632
         * @return javax.swing.JTable
633
         */
634
        protected JTable getTblStages() {
635
                if (tblStages == null) {
636
                        tblStages = new JTable();
637
                        tblStages
638
                                        .setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
639
                        tblStages.setModel(getTableModel());
640
                        TableColumnModel cm = tblStages.getColumnModel();
641

    
642
                        int tablePreferredWidth = (int) tblStages.getPreferredSize()
643
                                        .getWidth();
644
                        int colSize = tblStages.getFontMetrics(tblStages.getFont())
645
                                        .stringWidth(tblStages.getModel().getColumnName(0)) * 2;
646
                        cm.getColumn(0).setPreferredWidth((int) (colSize));
647
                        cm.getColumn(0).setMinWidth((int) (colSize));
648
                        cm.getColumn(0).setMaxWidth((int) (colSize));
649
                        tablePreferredWidth -= colSize;
650
                        cm.getColumn(1)
651
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.7));
652
                        cm.getColumn(2)
653
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.3));
654

    
655
                        // Ask to be notified of selection changes.
656
                        ListSelectionModel rowSM = tblStages.getSelectionModel();
657
                        rowSM.addListSelectionListener(new ListSelectionListener() {
658
                            public void valueChanged(ListSelectionEvent e) {
659
                                //Ignore extra messages.
660
                                if (e.getValueIsAdjusting())
661
                                        return;
662

    
663
                                ListSelectionModel lsm =
664
                                    (ListSelectionModel)e.getSource();
665
                                getBtnCenterOnFlag().setEnabled(!lsm.isSelectionEmpty());
666
                                        int[] selected = tblStages.getSelectedRows();
667
                                        if (selected.length == 0)
668
                                                return;
669
                                        GvFlag flag = (GvFlag) _getFlags().get(selected[0]);
670

    
671
                                Point2D p = flag.getOriginalPoint();
672
                                mapCtrl.repaint(); // borramos el de antes
673
                                NetworkUtils.flashPoint(mapCtrl, p.getX(), p.getY());
674
                            }
675
                        });
676

    
677
                        tblStages.getModel().addTableModelListener(new TableModelListener() {
678

    
679
                                public void tableChanged(TableModelEvent e) {
680
                                        System.out.println("Table model changed");
681
//                                        getBtnCenterOnFlag().setEnabled(false);
682
                                }
683

    
684
                        });
685

    
686

    
687
                }
688
                return tblStages;
689
        }
690

    
691
        protected int getFlagCount() {
692
                return _getFlags().size();
693
        }
694

    
695
        List _getFlags() {
696
//                if (routeFlags == null) {
697
//                        routeFlags = new ArrayList();
698
//                }
699
//                return routeFlags;
700

    
701
                return network.getOriginaFlags();
702
        }
703

    
704
        protected boolean isSelected(int row) {
705
                return ((GvFlag) _getFlags().get(row)).isEnabled();
706
        }
707

    
708
        /**
709
         * This method initializes eastPanel
710
         *
711
         * @return javax.swing.JPanel
712
         */
713
        protected JPanel getEastPanel() {
714
                if (eastPanel == null) {
715
                        GridLayout layout = new GridLayout();
716
                        layout.setColumns(1);
717
                        layout.setVgap(5);
718
                        
719
                        panelButtonsEast.add(getBtnLoadStage());
720
                        panelButtonsEast.add(getBtnSaveStage());
721
                        panelButtonsEast.add(getBtnSaveRoute());
722
                        panelButtonsEast.add(getBtnCenterOnFlag());
723
                        panelButtonsEast.add(getBtnSetVelocities());
724
                        
725
                        panelButtonsEast.add(new JLabel(PluginServices.getText(this, "tolerance") + ":"));
726
                        panelButtonsEast.add(getTxtTolerance());
727
                        panelButtonsEast.add(getChkTSP());
728
                        panelButtonsEast.add(getChkReturnToOrigin());
729
                        layout.setRows(panelButtonsEast.getComponentCount());
730
                        panelButtonsEast.setLayout(layout);
731
                        eastPanel = new GridBagLayoutPanel();
732
                        eastPanel.addComponent(panelButtonsEast);
733
                }
734
                return eastPanel;
735
        }
736

    
737
        public JTextField getTxtTolerance() {
738
                if (txtTolerance == null) {
739
                        txtTolerance = new JTextField();
740
                        txtTolerance.setToolTipText(PluginServices.getText(this, "map_units"));
741
                        txtTolerance.setText(PluginServices.getText(this,
742
                                        "10"));
743
                }
744
                return txtTolerance;
745
        }
746

    
747
        protected JCheckBox getChkTSP() {
748
                if (chkTSP == null) {
749
                        chkTSP = new JCheckBox();
750
                        chkTSP.setText(PluginServices.getText(this,
751
                                        "order_stops"));
752
//                        chkTSP.setEnabled(false);
753
                        chkTSP.addActionListener(this);
754
                }
755
                return chkTSP;
756
        }
757

    
758
        protected JCheckBox getChkReturnToOrigin() {
759
                if (chkReturnToOrigin == null) {
760
                        chkReturnToOrigin = new JCheckBox();
761
                        chkReturnToOrigin.setText(PluginServices.getText(this,
762
                                        "return_to_origin"));
763
//                        chkReturnToOrigin.setEnabled(false);
764
                        chkReturnToOrigin.addActionListener(this);
765
                }
766
                return chkReturnToOrigin;
767
        }
768

    
769
        JButton getBtnCenterOnFlag() {
770
                if (btnCenterOnFlag == null) {
771
                        btnCenterOnFlag = new JButton();
772
                        btnCenterOnFlag.setText(PluginServices.getText(this,
773
                                        "center_on_flag"));
774
                        btnCenterOnFlag.setEnabled(false);
775
                        btnCenterOnFlag.addActionListener(this);
776
                }
777
                return btnCenterOnFlag;
778
        }
779

    
780
        private JButton getBtnSetVelocities() {
781
                if (btnSetVelocities == null) {
782
                        btnSetVelocities = new JButton();
783
                        btnSetVelocities.setText(PluginServices.getText(this,
784
                                        "set_velocities"));
785
//                        btnSetVelocities.setEnabled(false);
786

    
787
                        // TODO: PONERLO VISIBLE CUANDO SE CORRIJA LO DE ABRIR EL
788
                        // DIALOGO Y LEER LAS VELOCIDADES QUE HAB?A ANTES.
789
                        btnSetVelocities.setVisible(true);
790
                        btnSetVelocities.addActionListener(this);
791
                }
792
                return btnSetVelocities;
793
        }
794

    
795
        private JButton getBtnSaveRoute() {
796
                if (btnSaveRoute == null) {
797
                        btnSaveRoute = new JButton();
798
                        btnSaveRoute.setText(PluginServices.getText(this, "save_route"));
799
                        btnSaveRoute.addActionListener(this);
800
                }
801
                return btnSaveRoute;
802
        }
803

    
804
        /**
805
         * This method initializes defaultTableModel
806
         *
807
         * @return javax.swing.table.DefaultTableModel
808
         */
809
        protected TableModel getTableModel() {
810
                return tableModel;
811
        }
812

    
813
        /**
814
         * This method initializes btnLoadStage
815
         *
816
         * @return javax.swing.JButton
817
         */
818
        protected JButton getBtnLoadStage() {
819
                if (btnLoadStage == null) {
820
                        btnLoadStage = new JButton();
821
                        btnLoadStage.setText(PluginServices.getText(this, "load_stages"));
822
                        btnLoadStage.addActionListener(this);
823
                }
824
                return btnLoadStage;
825
        }
826

    
827
        /**
828
         * This method initializes btnSaveStages
829
         *
830
         * @return javax.swing.JButton
831
         */
832
        protected JButton getBtnSaveStage() {
833
                if (btnSaveStage == null) {
834
                        btnSaveStage = new JButton();
835
                        btnSaveStage.setText(PluginServices.getText(this, "save_stages"));
836
                        btnSaveStage.addActionListener(this);
837
                }
838
                return btnSaveStage;
839
        }
840

    
841
        class FormatSelectionPanel extends JPanel implements IWindow {
842

    
843
                JComboBox formats;
844
                WindowInfo wi = null;
845

    
846
                public FormatSelectionPanel(String introductoryText) {
847
                        super(new BorderLayout());
848
                        String[] formatos = { "SHP", "DXF", "POSTGIS" }; //, "GML" };
849
                        formats = new JComboBox(formatos);
850
                        GridBagLayoutPanel contentPanel =
851
                                new GridBagLayoutPanel();
852
                        contentPanel.addComponent(new JLabel(introductoryText));
853
                        contentPanel.addComponent(formats);
854
                        JButton okButton = new JButton(PluginServices.getText(null,
855
                                        "Aceptar"));
856
                        okButton.addActionListener(new ActionListener() {
857
                                public void actionPerformed(ActionEvent arg0) {
858
                                        close();
859
                                }
860
                        });
861
                        contentPanel.addComponent(okButton);
862

    
863
                        add(contentPanel);
864
                }
865

    
866
                void close() {
867
                        PluginServices.getMDIManager().closeWindow(this);
868
                }
869

    
870
                public String getSelectedFormat() {
871
                        return (String) formats.getSelectedItem();
872
                }
873

    
874
                public WindowInfo getWindowInfo() {
875
                        if (wi == null) {
876
                                wi = new WindowInfo(WindowInfo.MODALDIALOG | WindowInfo.PALETTE);
877
                                wi.setTitle(PluginServices
878
                                                .getText(null, "Seleccion_de_formato"));// Internacionalizar
879
                                                                                                                                // esto
880
                                wi.setWidth(300);
881
                                wi.setHeight(55);
882
                        }
883
                        return wi;
884
                }
885

    
886
                public Object getWindowProfile() {
887
                        return WindowInfo.DIALOG_PROFILE;
888
                }
889

    
890
        }
891

    
892
        public void actionPerformed(ActionEvent e) {
893
                Component c = (Component) e.getSource();
894
                if (c.equals(getBtnLoadStage())) {
895
                        loadStages();
896
                } else if (c.equals(getBtnSaveStage())) {
897
                        saveStage();
898
                } else if (c.equals(getBtnPushUpStage())) {
899
                        int[] selected = tblStages.getSelectedRows();
900
                        if (selected.length == 0 || selected[0] == 0)
901
                                return;
902
                        tblStages.clearSelection();
903
                        for (int i = 0; i < selected.length; 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
                } else if (c.equals(getBtnPullDownStage())) {
912
                        // pull down
913
                        int[] selected = tblStages.getSelectedRows();
914
                        if (selected.length == 0
915
                                        || selected[selected.length - 1] >= _getFlags().size() - 1)
916
                                return;
917

    
918
                        // move rows
919
                        tblStages.clearSelection();
920
                        for (int i = selected.length - 1; i >= 0; i--) {
921
                                Object aux = _getFlags().get(selected[i] + 1);
922
                                _getFlags().set(selected[i] + 1, _getFlags().get(selected[i]));
923
                                _getFlags().set(selected[i], aux);
924
                                selected[i]++;
925
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
926
                        }
927
                        invalidateSolution();
928

    
929
                } else if (c.equals(getBtnRemoveStage())) {
930
                        removeStage();
931
                } else if (c.equals(getBtnSaveRoute())) {
932
                        saveRoute();
933
                } else if (c.equals(getBtnSetVelocities())) {
934
                        setVelocities();
935
                } else if (c.equals(getChkTSP())) {
936
                        bDoTSP = getChkTSP().isSelected();
937
                } else if (c.equals(getChkReturnToOrigin())) {
938
                        bReturnToOrigin = getChkReturnToOrigin().isSelected();
939
                } else if (c.equals(getBtnCenterOnFlag())) {
940
                        // Center on first selected flag.
941
                        int[] selected = tblStages.getSelectedRows();
942
                        if (selected.length == 0)
943
                                return;
944
                        GvFlag flag = (GvFlag) _getFlags().get(selected[0]);
945
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
946
                        if(! (window instanceof IView))
947
                                return;
948
                        IView view = (IView) window;
949
                        ViewPort vp = view.getMapControl().getViewPort();
950
                        Rectangle2D extent = vp.getAdjustedExtent();
951
                        double xNC = flag.getOriginalPoint().getX();
952
                        double yNC = flag.getOriginalPoint().getY();
953
                        double width = extent.getWidth();
954
                        double height = extent.getHeight();
955

    
956
                        Rectangle2D.Double r = new Rectangle2D.Double();
957

    
958
                        r.width = width;
959
                        r.height = height;
960
                        r.x = xNC - width/2;
961
                        r.y = yNC - height/2;
962

    
963
                        vp.setExtent(r);
964

    
965

    
966

    
967
                }
968
                repaint();
969
        }
970

    
971
        private void setVelocities() {
972
                if(network == null){
973
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
974
                        if(! (window instanceof IView))
975
                                return;
976
                        IView view = (View) window;
977
                        MapControl mapControl = view.getMapControl();
978
                        MapContext map = mapControl.getMapContext();
979
                        FLayers layers = map.getLayers();
980
                        SingleLayerIterator it = new SingleLayerIterator(layers);
981
                        while (it.hasNext() && network == null) {
982
                                FLayer aux = it.next();
983
                                if (!aux.isActive())
984
                                        continue;
985
                                network = (Network) aux.getProperty("network");
986
                        }
987
                }
988
                if (network == null)
989
                        return;
990

    
991
                ArrayList lstTipoTramo = network.getEdgeTypes();
992

    
993
                // I try to use a generic multiinputdialog. All this stuff can be extracted
994
                // from here and subclass MultiInputDlg
995
                Hashtable veloMeters  = network.getVelocities();
996
                ArrayList veloKm = new ArrayList(lstTipoTramo.size());
997
                if (veloMeters != null)
998
                {
999
                        NumberFormat nf = NumberFormat.getInstance();
1000
                        for (int i=0; i<lstTipoTramo.size(); i++)
1001
                        {
1002
                                Object key = lstTipoTramo.get(i);
1003
                                Double velM = (Double) veloMeters.get(key);
1004
                                System.out.println("Vel. Metros / seg = " + velM);
1005
                                if (velM != null)
1006
                                        veloKm.add(i, nf.format(velM.doubleValue() * 3.6));
1007
                                else
1008
                                        veloKm.add(i, "0");
1009
                        } // for
1010
                }
1011
                else
1012
                {
1013
                        for (int i=0; i<lstTipoTramo.size(); i++)
1014
                        {
1015
                                veloKm.add(i, "60");
1016
                        } // for
1017
                }
1018
                try
1019
                {
1020
                        String msg = PluginServices.getText(this, "msg_set_velocities");
1021
                        MultiInputDlg dlg = new MultiInputDlg(msg, lstTipoTramo, veloKm);
1022
                        String col1 = PluginServices.getText(this, "col_arc_type");
1023
                        String col2 = PluginServices.getText(this, "col_km_per_hour");
1024
                        dlg.setColumnNames(col1, col2);
1025
                        dlg.setModal(true);
1026
                        dlg.setVisible(true);
1027
                        if (dlg.isCanceled())
1028
                                return;
1029

    
1030
                        veloKm = dlg.getRightValues(); //{120, 110, 90, 80, 70, 60, 50, 40};
1031
                        veloMeters = new Hashtable(veloKm.size());
1032
                        for (int i=0; i<veloKm.size(); i++)
1033
                        {
1034
                                Object key = lstTipoTramo.get(i);
1035
                                veloMeters.put(key, new Double(Double.parseDouble((String) veloKm.get(i)) / 3.6));
1036
                        }
1037

    
1038
                        network.setVelocities(veloMeters);
1039
                }
1040
                catch(Exception e)
1041
                {
1042
                        e.printStackTrace();
1043
                }
1044

    
1045

    
1046
        }
1047

    
1048
        private void invalidateSolution() {
1049
                for (int i=0; i < _getFlags().size(); i++)
1050
                {
1051
                        GvFlag flag = (GvFlag) _getFlags().get(i);
1052
                        flag.setCost(-1.0);
1053
                }
1054
                updateTotalCost();
1055
        }
1056

    
1057
        private void saveStage(){
1058
                if(network == null){
1059
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
1060
                        if(! (window instanceof IView))
1061
                                return;
1062
                        IView view = (View) window;
1063
                        MapControl mapControl = view.getMapControl();
1064
                        MapContext map = mapControl.getMapContext();
1065
                        FLayers layers = map.getLayers();
1066
                        SingleLayerIterator it = new SingleLayerIterator(layers);
1067
                        while (it.hasNext() && network == null) {
1068
                                FLayer aux = it.next();
1069
                                if (!aux.isActive())
1070
                                        continue;
1071
                                network = (Network) aux.getProperty("network");
1072
                        }
1073
                }
1074
                if (network == null)
1075
                        return;
1076

    
1077
                List features = new ArrayList();
1078
                GvFlag[] flags = network.getFlags();
1079
                for(int i = 0; i < flags.length; i++){
1080
                        GvFlag flag = flags[i];
1081
                        // Solo se guardan los flags habilitados
1082
                        if (!flag.isEnabled())
1083
                                continue;
1084
                        FPoint2D point = new FPoint2D(flag.getOriginalPoint());
1085
                        Value[] values = new Value[6];
1086
                        values[GvFlag.ID_FLAG_INDEX] = ValueFactory.createValue(flag.getIdFlag());
1087
                        values[GvFlag.ID_ARC_INDEX] = ValueFactory.createValue(flag.getIdArc());
1088
                        values[GvFlag.DESCRIPTION_INDEX] = ValueFactory.createValue(flag.getDescription());
1089
                        values[GvFlag.DIREC_INDEX] = ValueFactory.createValue(flag.getDirec());
1090
                        values[GvFlag.PCT_INDEX] = ValueFactory.createValue(flag.getPct());
1091
                        values[GvFlag.COST_INDEX] = ValueFactory.createValue(flag.getCost());
1092
                        IGeometry geo = ShapeFactory.createPoint2D(point);
1093
                        DefaultFeature feature = new DefaultFeature(geo, values, new Integer(flag.getIdFlag()).toString() );
1094
                        features.add(feature);
1095
                }
1096

    
1097
                FlagsMemoryDriver driver = new FlagsMemoryDriver(features);
1098
                IProjection projection = AddLayerDialog.getLastProjection();
1099
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Flags",
1100
                                driver, projection);
1101

    
1102
                FormatSelectionPanel selectionPanel =
1103
                        new FormatSelectionPanel(PluginServices.
1104
                                        getText(null,
1105
                                "Seleccione_un_formato_para_guardar_los_flags"));
1106
                PluginServices.getMDIManager().addWindow(selectionPanel);
1107

    
1108
                String format = selectionPanel.getSelectedFormat();
1109
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
1110
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1111
                if(! (window instanceof IView))
1112
                        return;
1113
                IView view = (View) window;
1114
                MapControl mapControl = view.getMapControl();
1115
                MapContext context = mapControl.getMapContext();
1116
//                try {
1117
                        if (format.equalsIgnoreCase("SHP")) {
1118
                                export.saveToShp(context, routeLayer);
1119
                        } else if (format.equalsIgnoreCase("DXF")) {
1120
                                export.saveToDxf(context, routeLayer);
1121
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
1122
                                export.saveToPostGIS(context, routeLayer);
1123
                        }
1124
//                } catch (BaseException e1) {
1125
//                        // TODO Auto-generated catch block
1126
//                        e1.printStackTrace();
1127
//                }
1128

    
1129
        }
1130
        private void saveRoute() {
1131
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1132
                if(! (window instanceof IView))
1133
                        return;
1134
                IView view = (View) window;
1135
                MapControl mapControl = view.getMapControl();
1136
                List routes = (List) GvSession.getInstance().get(mapControl, "Route");
1137
                if(routes == null || routes.size() == 0){
1138
                        JOptionPane.showMessageDialog(this, PluginServices.getText(this, "Ruta_borrada_o_inexistente"),
1139
                                        PluginServices.getText(this, "Ruta_no_encontrada"),
1140
                                        JOptionPane.ERROR_MESSAGE);
1141
                        return;
1142
                }
1143
                Route lastRoute = (Route) routes.get(routes.size() - 1);
1144
                RouteMemoryDriver driver = new RouteMemoryDriver(lastRoute.getFeatureList());
1145
                IProjection projection = AddLayerDialog.getLastProjection();
1146
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Route",
1147
                                driver, projection);
1148

    
1149
                FormatSelectionPanel selectionPanel = new FormatSelectionPanel(PluginServices.getText(null,
1150
                "Seleccione_un_formato_para_guardar_la_ruta"));
1151
                PluginServices.getMDIManager().addWindow(selectionPanel);
1152

    
1153
                String format = selectionPanel.getSelectedFormat();
1154
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
1155
                MapContext context = mapControl.getMapContext();
1156
                        if (format.equalsIgnoreCase("SHP")) {
1157
                                export.saveToShp(context, routeLayer);
1158
                        } else if (format.equalsIgnoreCase("DXF")) {
1159
                                export.saveToDxf(context, routeLayer);
1160
//                        } else if (format.equalsIgnoreCase("GML")) {
1161
//                                export.saveToGml(context, routeLayer);
1162
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
1163
                                export.saveToPostGIS(context, routeLayer);
1164
                        }
1165
        }
1166

    
1167
        /**
1168
         * Converts a point layer loaded in the active view's toc in a collection of
1169
         * flags of the active network
1170
         *
1171
         */
1172
        protected void loadStages() {
1173

    
1174
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1175
                if(! (window instanceof IView))
1176
                        return;
1177
                IView view = (IView) window;
1178
                MapControl mapControl = view.getMapControl();
1179
                MapContext map = mapControl.getMapContext();
1180
                FLayers layers = map.getLayers();
1181

    
1182
                String title = PluginServices.getText(this,
1183
                                "Seleccionar_capa_con_puntos_de_parada");
1184
                String introductoryText = PluginServices.getText(this,
1185
                                "Seleccione_una_capa_de_puntos_para_crear_paradas");
1186

    
1187
                LayerSelectionPanel selectionPanel = new LayerSelectionPanel(layers,
1188
                                title, introductoryText, FLyrVect.class, FShape.POINT);
1189
                selectionPanel.addGeometryTypeConstraint(FShape.MULTIPOINT);
1190
                PluginServices.getMDIManager().addWindow(selectionPanel);
1191

    
1192
                if (!selectionPanel.wasFinishPressed())
1193
                        return;
1194
                else {
1195
                        FLayer layer = selectionPanel.getLayer();
1196
                        if (layer == null)
1197
                                return;
1198
                        if (!(layer instanceof FLyrVect))
1199
                                return;
1200
                        FLyrVect vectLyr = (FLyrVect) layer;
1201

    
1202
                        try {
1203

    
1204
                                // TODO
1205
                                // Hay que refinar bastante, para que el usuario elija
1206
                                // con que red y con qu? capa lineal quiere trabajar
1207
                                // tal y como est?, si hubiese varias se trabajaria
1208
                                // con la primera que devuelva el iterador
1209

    
1210
                                Network net = null;
1211
                                SingleLayerIterator it = new SingleLayerIterator(layers);
1212
                                while (it.hasNext() && net == null) {
1213
                                        FLayer aux = it.next();
1214
                                        if (!aux.isActive())
1215
                                                continue;
1216
                                        net = (Network) aux.getProperty("network");
1217
                                }
1218
                                if (net == null)
1219
                                        return;
1220

    
1221
                                // Por si queremos a?adir paradas a otras ya existentes
1222
//                                _getFlags().clear();
1223

    
1224
                                GvFlag flag;
1225
                                ReadableVectorial reader = vectLyr.getSource();
1226
                                SelectableDataSource recordset = vectLyr.getRecordset();
1227
                                int numShapes = reader.getShapeCount();
1228

    
1229
                                double realTol = Double.parseDouble(getTxtTolerance().getText());
1230
//                                                .toMapDistance(FlagListener.pixelTolerance);
1231
                                reader.start();
1232
                                for (int i = 0; i < numShapes; i++) {
1233
                                        Geometry geo = reader.getShape(i).toJTSGeometry();
1234
                                        if (!((geo instanceof Point) || (geo instanceof MultiPoint)))
1235
                                                continue;
1236

    
1237

    
1238

    
1239
                                        Coordinate[] coords = geo.getCoordinates();
1240
                                        if (coords.length > 1) {
1241
                                                logger.warn("The record " + i + " has " + coords.length + " coordinates. Pay attention!!");
1242
                                        }
1243
                                        for (int j = 0; j < coords.length; j++) {
1244

    
1245
                                                try {
1246
                                                        flag = net.addFlag(coords[j].x, coords[j].y, realTol);
1247
                                                        if (flag == null)
1248
                                                        {
1249
                                                                // segundo intento:
1250
                                                                flag = net.addFlag(coords[j].x, coords[j].y, 4*realTol);
1251
                                                                if (flag == null)
1252
                                                                {
1253
                                                                        NullPointerException e = new NullPointerException("Punto " + i + " fuera de la red. Tolerancia=" + realTol);
1254
                                                                        NotificationManager.addError("No se puedo situar el registro " + i +
1255
                                                                                        "Por favor, compruebe que est? encima de la red o aumente la tolerancia.", e);
1256
                                                                }
1257
                                                        }
1258
                                                        if (flag != null)
1259
                                                        {
1260
                                                        // TODO: Create use a IFlagListener to do this
1261
                                                        // inside flagsChanged. The best solution is
1262
                                                        // to put all the code in RouteControlPanel
1263
                                                                NetworkUtils.addGraphicFlag(mapControl, flag);
1264
                                                        }
1265
                                                } catch (GraphException e) {
1266
                                                        e.printStackTrace();
1267
                                                        NotificationManager.addError("No se puedo situar el registro " + i +
1268
                                                                        "Por favor, compruebe que est? encima de la red.", e);
1269
                                                }
1270

    
1271
                                        } // for j
1272
                                } // for i
1273
                                reader.stop();
1274
                                mapControl.drawGraphics();
1275
                                PluginServices.getMainFrame().enableControls();
1276

    
1277
                        } catch (BaseException e1) {
1278
                                return;
1279
                        }
1280
                }
1281
        }
1282

    
1283
        /**
1284
         * Removes the selected flags in the component's table from: -the graphic
1285
         * layer of the active view -the active network -the own table
1286
         *
1287
         */
1288
        private void removeStage() {
1289
                int[] selected = tblStages.getSelectedRows();
1290

    
1291
                for (int i = selected.length - 1; i >= 0; i--) {
1292
                        try {
1293
                                // removeFlag(selected[i]);
1294
                                if (network != null) {
1295
                                        final GvFlag flag = (GvFlag) _getFlags().get(selected[i]);
1296
                                        NetworkUtils.clearFlagFromGraphics(mapCtrl, flag);
1297
                                        network.removeFlag(flag);
1298
                                        mapCtrl.repaint();
1299
                                }
1300
                        } catch (IndexOutOfBoundsException iobEx) {
1301
                        }
1302

    
1303
                }// for
1304
                tblStages.clearSelection();
1305
                invalidateSolution();
1306
                mapCtrl.drawMap(false);
1307
        }
1308

    
1309
        public GvFlag[] getFlags() {
1310
                return (GvFlag[]) _getFlags().toArray(new GvFlag[0]);
1311
        }
1312

    
1313
        public void flagsChanged(int reason) {
1314
                refresh();
1315
                mapCtrl.drawGraphics();
1316

    
1317
        }
1318

    
1319
        public boolean isTspSelected() {
1320
                return bDoTSP;
1321
        }
1322

    
1323
        public boolean isReturnToOriginSelected() {
1324
                return bReturnToOrigin;
1325
        }
1326
} // @jve:decl-index=0:visual-constraint="17,9"