Statistics
| Revision:

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

History | View | Annotate | Download (37 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 39203 2012-11-08 12:02:06Z 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.JLabel;
170
import javax.swing.JOptionPane;
171
import javax.swing.JPanel;
172
import javax.swing.JScrollPane;
173
import javax.swing.JTable;
174
import javax.swing.JTextField;
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.ICoordTrans;
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.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.drivers.DriverAttributes;
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
                        // Parece un fallo de java!! ?? Tengo que controlar que rowIndex no sea mayor que getRowCount()!!
306
                        if (rowIndex >= getRowCount())
307
                                return null;
308
                        
309
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
310
                        switch (columnIndex) {
311
                        case 0:
312
                                return new Boolean(flag.isEnabled());
313
                        case 1:
314
                                return flag.getDescription();
315
                        case 2:
316
                                return new Double(flag.getCost());
317
                        }
318

    
319
                        return null;
320
                }
321

    
322
                public Class getColumnClass(int columnIndex) {
323
                        switch (columnIndex)
324
                        {
325
                        case 0:
326
                                return Boolean.class;
327
                        case 1:
328
                                return String.class;
329
                        case 2:
330
                                return Double.class;
331

    
332
                        }
333
                        return super.getColumnClass(columnIndex);
334
                }
335

    
336
                public String getColumnName(int column) {
337
                        return colName[column];
338
                }
339

    
340
                public boolean isCellEditable(int rowIndex, int columnIndex) {
341
                        if (columnIndex == 2)
342
                                return false;
343
                        return true;
344

    
345
                }
346

    
347
                public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
348
                        if (rowIndex >= getRowCount())
349
                                return;
350
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
351
                        switch (columnIndex)
352
                        {
353
                        case 0:
354
                                Boolean bAux = (Boolean) aValue;
355
                                flag.setEnabled(bAux.booleanValue());
356
                                PluginServices.getMainFrame().enableControls();
357
                                return;
358
                        case 1:
359
                                String strAux = (String) aValue;
360
                                flag.setDescription(strAux);
361
                                return;
362

    
363
//                        case 2: // No es editable
364
//                                Double dblAux = (Double) aValue;
365
//                                flag.setCost(dblAux.doubleValue());
366
//                                return;
367

    
368
                        }
369

    
370
                }
371

    
372
        }
373

    
374
        /**
375
         * This method initializes
376
         *
377
         */
378
        public RouteControlPanel(Network network) {
379
                super();
380
                this.network = network;
381
//                GvFlag[] flags = network.getFlags();
382
//                List vflags = _getFlags();
383
//                for (int i = 0; i < flags.length; i++) {
384
//                        vflags.add(flags[i]);
385
//                }
386
                initialize();
387
        }
388

    
389
        public void refresh(){
390
//                GvFlag[] flags = network.getFlags();
391
//                List vflags = _getFlags();
392
//                List tempFlags = Arrays.asList(flags);
393
//                vflags.addAll(tempFlags);
394
                lblFlagAmout.setText(String.valueOf(_getFlags()
395
                                .size()));
396
                updateTotalCost();
397
                ListSelectionModel rowSM = tblStages.getSelectionModel();
398
                getChkTSP().setEnabled((_getFlags().size() > 2));
399
                getChkReturnToOrigin().setEnabled((_getFlags().size() > 1));
400
                if (_getFlags().size() == 0)
401
                {
402
                        getBtnCenterOnFlag().setEnabled(false);
403
                        getBtnSaveStage().setEnabled(false);
404
                }
405
                else
406
                {
407
                        getBtnCenterOnFlag().setEnabled(!rowSM.isSelectionEmpty());
408
                        getBtnSaveStage().setEnabled(true);
409
                }
410
                getTblStages().revalidate();
411
                System.out.println("Actualizo tabla");
412

    
413
        }
414
        private void processLayer(FLayer layer) {
415
                if (layer.isActive()) {
416
                        if (layer instanceof FLyrVect) {
417
                                Network net = (Network) layer
418
                                                .getProperty("network");
419
                                if (net != null) {
420
                                        network = net;
421
                                        network.addFlagListener(this);
422
                                        refresh();
423
                                }// if
424
                        }// if
425
                }// if
426

    
427
        }
428

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

    
447
        public RouteControlPanel() {
448
                super();
449
                initialize();
450
        }
451

    
452
        public void setCostUnits(String unitsName) {
453
                colName[2] = unitsName;
454
                getTblStages().repaint();
455
        }
456

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

    
476
        protected void updateFlags() {
477
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
478
                updateTotalCost();
479
                getTblStages().repaint();
480
        }
481

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

    
498
        public Object getWindowModel() {
499
                return this.getClass();
500
        }
501

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

    
514
        public Object getWindowProfile(){
515
                return WindowInfo.TOOL_PROFILE;
516
        }
517

    
518

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

    
534
                        westPanel.add(aux);
535
                }
536
                return westPanel;
537
        }
538

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

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

    
559
        private JButton getBtnRemoveStage() {
560
                if (btnRemoveStage == null) {
561
                        btnRemoveStage = new JButton(new ImageIcon(this.getClass()
562
                                        .getClassLoader().getResource("images/delete.png")));
563
                        // btnRemoveStage.setName("btnRemoveStage");
564
                        btnRemoveStage.addActionListener(this);
565
                }
566
                return btnRemoveStage;
567
        }
568

    
569
        /**
570
         * This method initializes scrlStages
571
         *
572
         * @return javax.swing.JScrollPane
573
         */
574
        protected JScrollPane getScrlStages() {
575
                if (scrlStages == null) {
576
                        scrlStages = new JScrollPane();
577
                        scrlStages.setViewportView(getTblStages());
578
                        scrlStages.setPreferredSize(new Dimension(270, 200));
579
                }
580
                return scrlStages;
581
        }
582

    
583
        /**
584
         * @deprecated
585
         * @param flag
586
         */
587
        public void addFlag(GvFlag flag) {
588
                _getFlags().add(flag);
589
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
590
                updateTotalCost();
591
                getTblStages().repaint();
592
        }
593

    
594
        private void updateTotalCost() {
595
                GvFlag[] flags = getFlags();
596
                double cost = 0;
597
                for (int i = 0; i < flags.length; i++) {
598
                        if (!flags[i].isEnabled())
599
                                continue;
600
                        getBtnSaveStage().setEnabled(true);
601
                        if (flags[i].getCost() >= Double.MAX_VALUE)
602
                        {
603
                                lblCost.setText(PluginServices.getText(this, "no_se_puede_pasar_por_todas_las_paradas"));
604
                                return;
605
                        }
606
                        if (flags[i].getCost() < 0)
607
                        {
608
                                lblCost.setText(PluginServices.getText(this, "solucion_no_valida"));
609
                                return;
610
                        }
611

    
612
                        cost = flags[i].getCost(); // The last flag shows total cost
613
                }
614
                NumberFormat nf = NumberFormat.getInstance();
615
                nf.setMaximumFractionDigits(2);
616
                lblCost.setText(nf.format(cost) + getCostUnitName());
617
        }
618

    
619
        private String getCostUnitName() {
620
                if (colName[2].equals(PluginServices.getText(this, "cost")))
621
                        return "";
622
                return colName[2];
623
        }
624

    
625
        public void removeFlag(GvFlag flag) {
626
                removeFlag(_getFlags().indexOf(flag));
627
        }
628

    
629
        public void removeFlag(int index) {
630
                _getFlags().remove(index);
631
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
632
                getTblStages().repaint();
633
        }
634

    
635
        /**
636
         * This method initializes tblStages
637
         *
638
         * @return javax.swing.JTable
639
         */
640
        protected JTable getTblStages() {
641
                if (tblStages == null) {
642
                        tblStages = new JTable();
643
                        tblStages
644
                                        .setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
645
                        tblStages.setModel(getTableModel());
646
                        TableColumnModel cm = tblStages.getColumnModel();
647

    
648
                        int tablePreferredWidth = (int) tblStages.getPreferredSize()
649
                                        .getWidth();
650
                        int colSize = tblStages.getFontMetrics(tblStages.getFont())
651
                                        .stringWidth(tblStages.getModel().getColumnName(0)) * 2;
652
                        cm.getColumn(0).setPreferredWidth((int) (colSize));
653
                        cm.getColumn(0).setMinWidth((int) (colSize));
654
                        cm.getColumn(0).setMaxWidth((int) (colSize));
655
                        tablePreferredWidth -= colSize;
656
                        cm.getColumn(1)
657
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.7));
658
                        cm.getColumn(2)
659
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.3));
660

    
661
                        // Ask to be notified of selection changes.
662
                        ListSelectionModel rowSM = tblStages.getSelectionModel();
663
                        rowSM.addListSelectionListener(new ListSelectionListener() {
664
                            public void valueChanged(ListSelectionEvent e) {
665
                                //Ignore extra messages.
666
                                if (e.getValueIsAdjusting())
667
                                        return;
668

    
669
                                ListSelectionModel lsm =
670
                                    (ListSelectionModel)e.getSource();
671
                                getBtnCenterOnFlag().setEnabled(!lsm.isSelectionEmpty());
672
                                        int[] selected = tblStages.getSelectedRows();
673
                                        if (selected.length == 0)
674
                                                return;
675
                                        GvFlag flag = (GvFlag) _getFlags().get(selected[0]);
676
                                        Point2D p = flag.getOriginalPoint();
677
                                mapCtrl.repaint(); // borramos el de antes
678
                                NetworkUtils.flashPoint(mapCtrl, p.getX(), p.getY());
679
                            }
680
                        });
681

    
682
                        tblStages.getModel().addTableModelListener(new TableModelListener() {
683

    
684
                                public void tableChanged(TableModelEvent e) {
685
                                        System.out.println("Table model changed");
686
//                                        getBtnCenterOnFlag().setEnabled(false);
687
                                }
688

    
689
                        });
690

    
691

    
692
                }
693
                return tblStages;
694
        }
695

    
696
        protected int getFlagCount() {
697
                return _getFlags().size();
698
        }
699

    
700
        List _getFlags() {
701
//                if (routeFlags == null) {
702
//                        routeFlags = new ArrayList();
703
//                }
704
//                return routeFlags;
705

    
706
                return network.getOriginaFlags();
707
        }
708

    
709
        protected boolean isSelected(int row) {
710
                return ((GvFlag) _getFlags().get(row)).isEnabled();
711
        }
712

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

    
742
        public JTextField getTxtTolerance() {
743
                if (txtTolerance == null) {
744
                        txtTolerance = new JTextField();
745
                        txtTolerance.setToolTipText(PluginServices.getText(this, "map_units"));
746
                        txtTolerance.setText(PluginServices.getText(this,
747
                                        "10"));
748
                }
749
                return txtTolerance;
750
        }
751

    
752
        protected JCheckBox getChkTSP() {
753
                if (chkTSP == null) {
754
                        chkTSP = new JCheckBox();
755
                        chkTSP.setText(PluginServices.getText(this,
756
                                        "order_stops"));
757
//                        chkTSP.setEnabled(false);
758
                        chkTSP.addActionListener(this);
759
                }
760
                return chkTSP;
761
        }
762

    
763
        protected JCheckBox getChkReturnToOrigin() {
764
                if (chkReturnToOrigin == null) {
765
                        chkReturnToOrigin = new JCheckBox();
766
                        chkReturnToOrigin.setText(PluginServices.getText(this,
767
                                        "return_to_origin"));
768
//                        chkReturnToOrigin.setEnabled(false);
769
                        chkReturnToOrigin.addActionListener(this);
770
                }
771
                return chkReturnToOrigin;
772
        }
773

    
774
        JButton getBtnCenterOnFlag() {
775
                if (btnCenterOnFlag == null) {
776
                        btnCenterOnFlag = new JButton();
777
                        btnCenterOnFlag.setText(PluginServices.getText(this,
778
                                        "center_on_flag"));
779
                        btnCenterOnFlag.setEnabled(false);
780
                        btnCenterOnFlag.addActionListener(this);
781
                }
782
                return btnCenterOnFlag;
783
        }
784

    
785
        private JButton getBtnSetVelocities() {
786
                if (btnSetVelocities == null) {
787
                        btnSetVelocities = new JButton();
788
                        btnSetVelocities.setText(PluginServices.getText(this,
789
                                        "set_velocities"));
790
//                        btnSetVelocities.setEnabled(false);
791

    
792
                        // TODO: PONERLO VISIBLE CUANDO SE CORRIJA LO DE ABRIR EL
793
                        // DIALOGO Y LEER LAS VELOCIDADES QUE HAB?A ANTES.
794
                        btnSetVelocities.setVisible(true);
795
                        btnSetVelocities.addActionListener(this);
796
                }
797
                return btnSetVelocities;
798
        }
799

    
800
        private JButton getBtnSaveRoute() {
801
                if (btnSaveRoute == null) {
802
                        btnSaveRoute = new JButton();
803
                        btnSaveRoute.setText(PluginServices.getText(this, "save_route"));
804
                        btnSaveRoute.addActionListener(this);
805
                }
806
                return btnSaveRoute;
807
        }
808

    
809
        /**
810
         * This method initializes defaultTableModel
811
         *
812
         * @return javax.swing.table.DefaultTableModel
813
         */
814
        protected TableModel getTableModel() {
815
                return tableModel;
816
        }
817

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

    
832
        /**
833
         * This method initializes btnSaveStages
834
         *
835
         * @return javax.swing.JButton
836
         */
837
        protected JButton getBtnSaveStage() {
838
                if (btnSaveStage == null) {
839
                        btnSaveStage = new JButton();
840
                        btnSaveStage.setText(PluginServices.getText(this, "save_stages"));
841
                        btnSaveStage.setEnabled(false);
842
                        btnSaveStage.addActionListener(this);
843
                }
844
                return btnSaveStage;
845
        }
846

    
847
        public void actionPerformed(ActionEvent e) {
848
                Component c = (Component) e.getSource();
849
                if (c.equals(getBtnLoadStage())) {
850
                        loadStages();
851
                } else if (c.equals(getBtnSaveStage())) {
852
                        saveStage();
853
                } else if (c.equals(getBtnPushUpStage())) {
854
                        int[] selected = tblStages.getSelectedRows();
855
                        if (selected.length == 0 || selected[0] == 0)
856
                                return;
857
                        tblStages.clearSelection();
858
                        for (int i = 0; i < selected.length; i++) {
859
                                Object aux = _getFlags().get(selected[i] - 1);
860
                                _getFlags().set(selected[i] - 1, _getFlags().get(selected[i]));
861
                                _getFlags().set(selected[i], aux);
862
                                selected[i]--;
863
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
864
                        }
865
                        invalidateSolution();
866
                } else if (c.equals(getBtnPullDownStage())) {
867
                        // pull down
868
                        int[] selected = tblStages.getSelectedRows();
869
                        if (selected.length == 0
870
                                        || selected[selected.length - 1] >= _getFlags().size() - 1)
871
                                return;
872

    
873
                        // move rows
874
                        tblStages.clearSelection();
875
                        for (int i = selected.length - 1; i >= 0; i--) {
876
                                Object aux = _getFlags().get(selected[i] + 1);
877
                                _getFlags().set(selected[i] + 1, _getFlags().get(selected[i]));
878
                                _getFlags().set(selected[i], aux);
879
                                selected[i]++;
880
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
881
                        }
882
                        invalidateSolution();
883

    
884
                } else if (c.equals(getBtnRemoveStage())) {
885
                        removeStage();
886
                } else if (c.equals(getBtnSaveRoute())) {
887
                        saveRoute();
888
                } else if (c.equals(getBtnSetVelocities())) {
889
                        setVelocities();
890
                } else if (c.equals(getChkTSP())) {
891
                        bDoTSP = getChkTSP().isSelected();
892
                } else if (c.equals(getChkReturnToOrigin())) {
893
                        bReturnToOrigin = getChkReturnToOrigin().isSelected();
894
                } else if (c.equals(getBtnCenterOnFlag())) {
895
                        // Center on first selected flag.
896
                        int[] selected = tblStages.getSelectedRows();
897
                        if (selected.length == 0)
898
                                return;
899
                        GvFlag flag = (GvFlag) _getFlags().get(selected[0]);
900
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
901
                        if(! (window instanceof IView))
902
                                return;
903
                        IView view = (IView) window;
904
                        ViewPort vp = view.getMapControl().getViewPort();
905
                        Rectangle2D extent = vp.getAdjustedExtent();
906
                        double xNC = flag.getOriginalPoint().getX();
907
                        double yNC = flag.getOriginalPoint().getY();
908
                        double width = extent.getWidth();
909
                        double height = extent.getHeight();
910

    
911
                        Rectangle2D.Double r = new Rectangle2D.Double();
912

    
913
                        r.width = width;
914
                        r.height = height;
915
                        r.x = xNC - width/2;
916
                        r.y = yNC - height/2;
917

    
918
                        vp.setExtent(r);
919

    
920

    
921

    
922
                }
923
                repaint();
924
        }
925

    
926
        private void setVelocities() {
927
                if(network == null){
928
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
929
                        if(! (window instanceof IView))
930
                                return;
931
                        IView view = (View) window;
932
                        MapControl mapControl = view.getMapControl();
933
                        MapContext map = mapControl.getMapContext();
934
                        FLayers layers = map.getLayers();
935
                        SingleLayerIterator it = new SingleLayerIterator(layers);
936
                        while (it.hasNext() && network == null) {
937
                                FLayer aux = it.next();
938
                                if (!aux.isActive())
939
                                        continue;
940
                                network = (Network) aux.getProperty("network");
941
                        }
942
                }
943
                if (network == null)
944
                        return;
945

    
946
                ArrayList lstTipoTramo = network.getEdgeTypes();
947

    
948
                // I try to use a generic multiinputdialog. All this stuff can be extracted
949
                // from here and subclass MultiInputDlg
950
                Hashtable veloMeters  = network.getVelocities();
951
                ArrayList veloKm = new ArrayList(lstTipoTramo.size());
952
                if (veloMeters != null)
953
                {
954
                        NumberFormat nf = NumberFormat.getInstance();
955
                        for (int i=0; i<lstTipoTramo.size(); i++)
956
                        {
957
                                Object key = lstTipoTramo.get(i);
958
                                Double velM = (Double) veloMeters.get(key);
959
                                System.out.println("Vel. Metros / seg = " + velM);
960
                                if (velM != null)
961
                                        veloKm.add(i, nf.format(velM.doubleValue() * 3.6));
962
                                else
963
                                        veloKm.add(i, "0");
964
                        } // for
965
                }
966
                else
967
                {
968
                        for (int i=0; i<lstTipoTramo.size(); i++)
969
                        {
970
                                veloKm.add(i, "60");
971
                        } // for
972
                }
973
                try
974
                {
975
                        String msg = PluginServices.getText(this, "msg_set_velocities");
976
                        MultiInputDlg dlg = new MultiInputDlg(msg, lstTipoTramo, veloKm);
977
                        dlg.setResizable(true);
978
                        String col1 = PluginServices.getText(this, "col_arc_type");
979
                        String col2 = PluginServices.getText(this, "col_km_per_hour");
980
                        dlg.setColumnNames(col1, col2);
981
                        dlg.setModal(true);
982
                        dlg.setVisible(true);
983
                        if (dlg.isCanceled())
984
                                return;
985

    
986
                        veloKm = dlg.getRightValues(); //{120, 110, 90, 80, 70, 60, 50, 40};
987
                        veloMeters = new Hashtable(veloKm.size());
988
                        for (int i=0; i<veloKm.size(); i++)
989
                        {
990
                                Object key = lstTipoTramo.get(i);
991
                                veloMeters.put(key, new Double(Double.parseDouble((String) veloKm.get(i)) / 3.6));
992
                        }
993

    
994
                        network.setVelocities(veloMeters);
995
                }
996
                catch(Exception e)
997
                {
998
                        e.printStackTrace();
999
                }
1000

    
1001

    
1002
        }
1003

    
1004
        private void invalidateSolution() {
1005
                for (int i=0; i < _getFlags().size(); i++)
1006
                {
1007
                        GvFlag flag = (GvFlag) _getFlags().get(i);
1008
                        flag.setCost(-1.0);
1009
                }
1010
                updateTotalCost();
1011
        }
1012

    
1013
        private void saveStage(){
1014
                if(network == null){
1015
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
1016
                        if(! (window instanceof IView))
1017
                                return;
1018
                        IView view = (View) window;
1019
                        MapControl mapControl = view.getMapControl();
1020
                        MapContext map = mapControl.getMapContext();
1021
                        FLayers layers = map.getLayers();
1022
                        SingleLayerIterator it = new SingleLayerIterator(layers);
1023
                        while (it.hasNext() && network == null) {
1024
                                FLayer aux = it.next();
1025
                                if (!aux.isActive())
1026
                                        continue;
1027
                                network = (Network) aux.getProperty("network");
1028
                        }
1029
                }
1030
                if (network == null)
1031
                        return;
1032

    
1033
                List features = new ArrayList();
1034
                GvFlag[] flags = network.getFlags();
1035
                for(int i = 0; i < flags.length; i++){
1036
                        GvFlag flag = flags[i];
1037
                        // Solo se guardan los flags habilitados
1038
                        if (!flag.isEnabled())
1039
                                continue;
1040
                        FPoint2D point = new FPoint2D(flag.getOriginalPoint());
1041
                        Value[] values = new Value[6];
1042
                        values[GvFlag.ID_FLAG_INDEX] = ValueFactory.createValue(flag.getIdFlag());
1043
                        values[GvFlag.ID_ARC_INDEX] = ValueFactory.createValue(flag.getIdArc());
1044
                        values[GvFlag.DESCRIPTION_INDEX] = ValueFactory.createValue(flag.getDescription());
1045
                        values[GvFlag.DIREC_INDEX] = ValueFactory.createValue(flag.getDirec());
1046
                        values[GvFlag.PCT_INDEX] = ValueFactory.createValue(flag.getPct());
1047
                        values[GvFlag.COST_INDEX] = ValueFactory.createValue(flag.getCost());
1048
                        IGeometry geo = ShapeFactory.createPoint2D(point);
1049
                        DefaultFeature feature = new DefaultFeature(geo, values, new Integer(flag.getIdFlag()).toString() );
1050
                        features.add(feature);
1051
                }
1052

    
1053
                FlagsMemoryDriver driver = new FlagsMemoryDriver(features);
1054
                IProjection projection = AddLayerDialog.getLastProjection();
1055
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Flags",
1056
                                driver, projection);
1057

    
1058
                FormatSelectionPanel selectionPanel =
1059
                        new FormatSelectionPanel(PluginServices.
1060
                                        getText(null,
1061
                                "Seleccione_un_formato_para_guardar_los_flags"));
1062
                PluginServices.getMDIManager().addWindow(selectionPanel);
1063
                if (selectionPanel.isOkButtonPressed() == false)
1064
                        return;
1065
                
1066
                String format = selectionPanel.getSelectedFormat();
1067
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
1068
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1069
                if(! (window instanceof IView))
1070
                        return;
1071
                IView view = (View) window;
1072
                MapControl mapControl = view.getMapControl();
1073
                MapContext context = mapControl.getMapContext();
1074
//                try {
1075
                        if (format.equalsIgnoreCase("SHP")) {
1076
                                export.saveToShp(context, routeLayer);
1077
                        } else if (format.equalsIgnoreCase("DXF")) {
1078
                                export.saveToDxf(context, routeLayer);
1079
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
1080
                                export.saveToPostGIS(context, routeLayer);
1081
                        }
1082
//                } catch (BaseException e1) {
1083
//                        // TODO Auto-generated catch block
1084
//                        e1.printStackTrace();
1085
//                }
1086

    
1087
        }
1088
        private void saveRoute() {
1089
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1090
                if(! (window instanceof IView))
1091
                        return;
1092
                IView view = (View) window;
1093
                MapControl mapControl = view.getMapControl();
1094
                List routes = (List) GvSession.getInstance().get(mapControl, "Route");
1095
                if(routes == null || routes.size() == 0){
1096
                        JOptionPane.showMessageDialog(this, PluginServices.getText(this, "Ruta_borrada_o_inexistente"),
1097
                                        PluginServices.getText(this, "Ruta_no_encontrada"),
1098
                                        JOptionPane.ERROR_MESSAGE);
1099
                        return;
1100
                }
1101
                Route lastRoute = (Route) routes.get(routes.size() - 1);
1102
                RouteMemoryDriver driver = new RouteMemoryDriver(lastRoute.getFeatureList());
1103
                IProjection projection = AddLayerDialog.getLastProjection();
1104
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Route",
1105
                                driver, projection);
1106

    
1107
                FormatSelectionPanel selectionPanel = new FormatSelectionPanel(PluginServices.getText(null,
1108
                "Seleccione_un_formato_para_guardar_la_ruta"));
1109
                PluginServices.getMDIManager().addWindow(selectionPanel);
1110

    
1111
                String format = selectionPanel.getSelectedFormat();
1112
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
1113
                MapContext context = mapControl.getMapContext();
1114
                        if (format.equalsIgnoreCase("SHP")) {
1115
                                export.saveToShp(context, routeLayer);
1116
                        } else if (format.equalsIgnoreCase("DXF")) {
1117
                                export.saveToDxf(context, routeLayer);
1118
//                        } else if (format.equalsIgnoreCase("GML")) {
1119
//                                export.saveToGml(context, routeLayer);
1120
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
1121
                                export.saveToPostGIS(context, routeLayer);
1122
                        }
1123
        }
1124

    
1125
        /**
1126
         * Converts a point layer loaded in the active view's toc in a collection of
1127
         * flags of the active network
1128
         *
1129
         */
1130
        protected void loadStages() {
1131

    
1132
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
1133
                if(! (window instanceof IView))
1134
                        return;
1135
                IView view = (IView) window;
1136
                MapControl mapControl = view.getMapControl();
1137
                MapContext map = mapControl.getMapContext();
1138
                FLayers layers = map.getLayers();
1139

    
1140
                String title = PluginServices.getText(this,
1141
                                "Seleccionar_capa_con_puntos_de_parada");
1142
                String introductoryText = PluginServices.getText(this,
1143
                                "Seleccione_una_capa_de_puntos_para_crear_paradas");
1144

    
1145
                LayerSelectionPanel selectionPanel = new LayerSelectionPanel(layers,
1146
                                title, introductoryText, FLyrVect.class, FShape.POINT);
1147
                selectionPanel.addGeometryTypeConstraint(FShape.MULTIPOINT);
1148
                PluginServices.getMDIManager().addWindow(selectionPanel);
1149

    
1150
                if (!selectionPanel.wasFinishPressed())
1151
                        return;
1152
                else {
1153
                        FLayer layer = selectionPanel.getLayer();
1154
                        if (layer == null)
1155
                                return;
1156
                        if (!(layer instanceof FLyrVect))
1157
                                return;
1158
                        FLyrVect vectLyr = (FLyrVect) layer;
1159

    
1160
                        try {
1161

    
1162
                                // TODO
1163
                                // Hay que refinar bastante, para que el usuario elija
1164
                                // con que red y con qu? capa lineal quiere trabajar
1165
                                // tal y como est?, si hubiese varias se trabajaria
1166
                                // con la primera que devuelva el iterador
1167

    
1168
                                Network net = null;
1169
                                SingleLayerIterator it = new SingleLayerIterator(layers);
1170
                                while (it.hasNext() && net == null) {
1171
                                        FLayer aux = it.next();
1172
                                        if (!aux.isActive())
1173
                                                continue;
1174
                                        net = (Network) aux.getProperty("network");
1175
                                }
1176
                                if (net == null)
1177
                                        return;
1178

    
1179
                                // Por si queremos a?adir paradas a otras ya existentes
1180
//                                _getFlags().clear();
1181

    
1182
                                GvFlag flag;
1183
                                ReadableVectorial reader = vectLyr.getSource();
1184
                                SelectableDataSource recordset = vectLyr.getRecordset();
1185
                                int numShapes = reader.getShapeCount();
1186

    
1187
                                double realTol = Double.parseDouble(getTxtTolerance().getText());
1188
//                                                .toMapDistance(FlagListener.pixelTolerance);
1189
                                reader.start();
1190
                                ICoordTrans ct = vectLyr.getCoordTrans();
1191
                                DriverAttributes attr = reader.getDriverAttributes();
1192
                                boolean bMustClone = false;
1193
                                if (attr != null) {
1194
                                        if (attr.isLoadedInMemory()) {
1195
                                                bMustClone = attr.isLoadedInMemory();
1196
                                        }
1197
                                }
1198
                                
1199
                                ArrayList errors = new ArrayList();
1200
                                for (int i = 0; i < numShapes; i++) {
1201
                                        IGeometry geom = reader.getShape(i);
1202
                                        if (ct != null) {
1203
                                                if (bMustClone)
1204
                                                        geom = geom.cloneGeometry();
1205
                                                geom.reProject(ct);
1206
                                        }
1207
                                        
1208
                                        Geometry geo = geom.toJTSGeometry();
1209
                                        if (!((geo instanceof Point) || (geo instanceof MultiPoint)))
1210
                                                continue;
1211

    
1212

    
1213

    
1214
                                        Coordinate[] coords = geo.getCoordinates();
1215
                                        if (coords.length > 1) {
1216
                                                logger.warn("The record " + i + " has " + coords.length + " coordinates. Pay attention!!");
1217
                                        }
1218
                                        for (int j = 0; j < coords.length; j++) {
1219

    
1220
                                                try {
1221
                                                        flag = net.addFlag(coords[j].x, coords[j].y, realTol);
1222
                                                        if (flag == null)
1223
                                                        {
1224
                                                                // segundo intento:
1225
                                                                flag = net.addFlag(coords[j].x, coords[j].y, 4*realTol);
1226
                                                                if (flag == null)
1227
                                                                {
1228
                                                                        errors.add(new Integer(i));
1229
                                                                }
1230
                                                        }
1231
                                                        if (flag != null)
1232
                                                        {
1233
                                                        // TODO: Create use a IFlagListener to do this
1234
                                                        // inside flagsChanged. The best solution is
1235
                                                        // to put all the code in RouteControlPanel
1236
                                                                NetworkUtils.addGraphicFlag(mapControl, flag);
1237
                                                        }
1238
                                                } catch (GraphException e) {
1239
                                                        e.printStackTrace();
1240
                                                        NotificationManager.addError("No se puedo situar el registro " + i +
1241
                                                                        "Por favor, compruebe que est? encima de la red.", e);
1242
                                                }
1243

    
1244
                                        } // for j
1245
                                } // for i
1246
                                reader.stop();
1247
                                mapControl.drawGraphics();
1248
                                if (errors.size() > 0) {
1249
                                        String msg = PluginServices.getText(null, "these_records_are_out_from_network") + "\n";
1250
                                        for (int i =0; i < errors.size(); i++) {
1251
                                                msg = msg + i + " ";
1252
                                        }
1253
                                        msg = msg + "\n" + PluginServices.getText(null, "please_check_them_or_increase_tolerance");
1254
                                        JOptionPane.showMessageDialog((Component) PluginServices.getMDIManager().getActiveWindow(), msg);
1255
                                }
1256
                                
1257
                                PluginServices.getMainFrame().enableControls();
1258

    
1259
                        } catch (BaseException e1) {
1260
                                return;
1261
                        }
1262
                }
1263
        }
1264

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

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

    
1285
                }// for
1286
                tblStages.clearSelection();
1287
                invalidateSolution();
1288
                mapCtrl.drawMap(false);
1289
        }
1290

    
1291
        public GvFlag[] getFlags() {
1292
                return (GvFlag[]) _getFlags().toArray(new GvFlag[0]);
1293
        }
1294

    
1295
        public void flagsChanged(int reason) {
1296
                refresh();
1297
                mapCtrl.drawGraphics();
1298

    
1299
        }
1300

    
1301
        public boolean isTspSelected() {
1302
                return bDoTSP;
1303
        }
1304

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