Statistics
| Revision:

root / tags / PilotoRedes_Build_2 / extensions / extGraph_predes / src / com / iver / cit / gvsig / graph / gui / RouteControlPanel.java @ 11410

History | View | Annotate | Download (32.1 KB)

1 8326 jaume
/* 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 8573 azabala
 *
44
 * $Id$
45
 * $Log$
46 11296 caballero
 * Revision 1.25.2.1  2007-04-20 07:50:34  caballero
47
 * ManualDataSource por AutomaticDataSource
48
 *
49
 * Revision 1.25  2006/11/14 18:32:32  fjp
50 8751 fjp
 * *** empty log message ***
51
 *
52 8762 fjp
 * Revision 1.24  2006/11/14 16:12:01  fjp
53
 * *** empty log message ***
54
 *
55 8751 fjp
 * Revision 1.23  2006/11/14 09:23:30  fjp
56 8723 fjp
 * cargar paradas desde cualquier tema de puntos
57
 *
58
 * Revision 1.22  2006/11/10 13:57:04  fjp
59 8639 fjp
 * *** empty log message ***
60
 *
61 8673 fjp
 * Revision 1.21  2006/11/09 21:08:32  azabala
62
 * *** empty log message ***
63
 *
64 8659 azabala
 * Revision 1.20  2006/11/09 12:51:12  jaume
65
 * *** empty log message ***
66
 *
67 8647 jaume
 * Revision 1.19  2006/11/09 11:00:43  jaume
68
 * *** empty log message ***
69
 *
70 8642 jaume
 * Revision 1.18  2006/11/09 10:59:53  jaume
71
 * *** empty log message ***
72
 *
73 8641 jaume
 * Revision 1.17  2006/11/09 10:27:50  fjp
74
 * *** empty log message ***
75
 *
76 8640 fjp
 * Revision 1.16  2006/11/09 10:24:11  fjp
77
 * *** empty log message ***
78
 *
79 8639 fjp
 * Revision 1.15  2006/11/09 09:16:35  fjp
80 8636 fjp
 * Ya va!!
81
 *
82
 * Revision 1.14  2006/11/08 20:14:52  azabala
83 8626 azabala
 * *** empty log message ***
84
 *
85
 * Revision 1.13  2006/11/08 19:32:22  azabala
86 8623 azabala
 * saveroute and saveflags modifications
87
 *
88
 * Revision 1.12  2006/11/08 18:16:28  fjp
89 8616 fjp
 * *** empty log message ***
90
 *
91 8621 fjp
 * Revision 1.11  2006/11/08 16:48:19  fjp
92
 * *** empty log message ***
93
 *
94 8616 fjp
 * Revision 1.10  2006/11/08 16:00:39  fjp
95 8606 fjp
 * Por terminar el enlace flags-cuadro de di?logo
96
 *
97 8613 fjp
 * Revision 1.9  2006/11/08 13:18:46  fjp
98
 * Por terminar el enlace flags-cuadro de di?logo
99
 *
100 8606 fjp
 * Revision 1.8  2006/11/07 19:49:38  azabala
101 8573 azabala
 * *** empty log message ***
102
 *
103
 * Revision 1.7  2006/11/06 13:13:53  azabala
104
 * *** empty log message ***
105
 *
106
 * Revision 1.6  2006/11/06 10:29:32  jaume
107
 * *** empty log message ***
108
 *
109
 * Revision 1.5  2006/11/03 19:39:29  azabala
110
 * *** empty log message ***
111
 *
112
 * Revision 1.4  2006/10/27 18:26:22  azabala
113
 * added implementation of load stages method
114
 *
115
 * Revision 1.3  2006/10/27 12:41:09  jaume
116
 * GUI
117
 *
118
 * Revision 1.2  2006/10/26 16:31:21  jaume
119
 * GUI
120
 *
121
 * Revision 1.1  2006/10/25 10:50:41  jaume
122
 * movement of classes and gui stuff
123
 *
124
 * Revision 1.4  2006/10/24 08:04:41  jaume
125
 * *** empty log message ***
126
 *
127
 * Revision 1.3  2006/10/23 16:00:20  jaume
128
 * *** empty log message ***
129
 *
130
 * Revision 1.2  2006/10/23 08:05:39  jaume
131
 * GUI
132
 *
133
 * Revision 1.1  2006/10/20 12:02:50  jaume
134
 * GUI
135
 *
136
 *
137
 */
138 8326 jaume
package com.iver.cit.gvsig.graph.gui;
139
140
import java.awt.BorderLayout;
141
import java.awt.Component;
142
import java.awt.Dimension;
143
import java.awt.FlowLayout;
144
import java.awt.Font;
145 8401 jaume
import java.awt.GridLayout;
146 8326 jaume
import java.awt.event.ActionEvent;
147
import java.awt.event.ActionListener;
148 8751 fjp
import java.awt.geom.Rectangle2D;
149 8762 fjp
import java.text.NumberFormat;
150 8573 azabala
import java.util.ArrayList;
151
import java.util.List;
152 8326 jaume
153
import javax.swing.ImageIcon;
154 8573 azabala
import javax.swing.JComboBox;
155 8326 jaume
import javax.swing.JLabel;
156 8659 azabala
import javax.swing.JOptionPane;
157 8326 jaume
import javax.swing.JPanel;
158
import javax.swing.JScrollPane;
159
import javax.swing.JTable;
160 8762 fjp
import javax.swing.ListSelectionModel;
161
import javax.swing.event.ListSelectionEvent;
162
import javax.swing.event.ListSelectionListener;
163
import javax.swing.event.TableModelEvent;
164
import javax.swing.event.TableModelListener;
165 8636 fjp
import javax.swing.table.AbstractTableModel;
166 8326 jaume
import javax.swing.table.TableColumnModel;
167
import javax.swing.table.TableModel;
168
169 8573 azabala
import org.cresques.cts.IProjection;
170 8326 jaume
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
171
import org.gvsig.gui.beans.swing.JBlank;
172
import org.gvsig.gui.beans.swing.JButton;
173
174 8573 azabala
import com.hardcode.gdbms.engine.values.Value;
175
import com.hardcode.gdbms.engine.values.ValueFactory;
176 8326 jaume
import com.iver.andami.PluginServices;
177 8723 fjp
import com.iver.andami.messages.NotificationManager;
178 8326 jaume
import com.iver.andami.ui.mdiManager.IWindow;
179 8636 fjp
import com.iver.andami.ui.mdiManager.SingletonWindow;
180 8326 jaume
import com.iver.andami.ui.mdiManager.WindowInfo;
181 8411 azabala
import com.iver.cit.gvsig.fmap.DriverException;
182
import com.iver.cit.gvsig.fmap.MapContext;
183
import com.iver.cit.gvsig.fmap.MapControl;
184 8751 fjp
import com.iver.cit.gvsig.fmap.ViewPort;
185 8573 azabala
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
186
import com.iver.cit.gvsig.fmap.core.FPoint2D;
187 8411 azabala
import com.iver.cit.gvsig.fmap.core.FShape;
188
import com.iver.cit.gvsig.fmap.core.IGeometry;
189
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
190
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
191 8573 azabala
import com.iver.cit.gvsig.fmap.edition.EditionException;
192 8411 azabala
import com.iver.cit.gvsig.fmap.layers.FLayer;
193
import com.iver.cit.gvsig.fmap.layers.FLayers;
194
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
195 8573 azabala
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
196
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
197
import com.iver.cit.gvsig.fmap.layers.LayerListenerAdapter;
198 8411 azabala
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
199 8626 azabala
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
200 8411 azabala
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
201 8723 fjp
import com.iver.cit.gvsig.graph.GraphException;
202 8616 fjp
import com.iver.cit.gvsig.graph.NetworkUtils;
203 8326 jaume
import com.iver.cit.gvsig.graph.core.GvFlag;
204 8606 fjp
import com.iver.cit.gvsig.graph.core.IFlagListener;
205 8411 azabala
import com.iver.cit.gvsig.graph.core.Network;
206 8573 azabala
import com.iver.cit.gvsig.graph.solvers.FlagsMemoryDriver;
207
import com.iver.cit.gvsig.graph.solvers.Route;
208
import com.iver.cit.gvsig.graph.solvers.RouteMemoryDriver;
209 8723 fjp
import com.iver.cit.gvsig.graph.tools.FlagListener;
210 8573 azabala
import com.iver.cit.gvsig.project.documents.gui.FOpenDialog;
211 8411 azabala
import com.iver.cit.gvsig.project.documents.view.gui.IView;
212
import com.iver.cit.gvsig.project.documents.view.gui.View;
213 8573 azabala
import com.iver.cit.gvsig.util.GvSession;
214 8411 azabala
import com.vividsolutions.jts.geom.Coordinate;
215
import com.vividsolutions.jts.geom.Geometry;
216
import com.vividsolutions.jts.geom.MultiPoint;
217
import com.vividsolutions.jts.geom.Point;
218 8326 jaume
219 8642 jaume
public class RouteControlPanel extends JPanel implements SingletonWindow,
220 8606 fjp
                ActionListener, IFlagListener {
221 8573 azabala
        WindowInfo wi;
222 8326 jaume
223 8573 azabala
        private JPanel westPanel = null;
224 8521 jaume
225 8573 azabala
        private JScrollPane scrlStages = null;
226
227
        private JTable tblStages = null;
228
229
        private GridBagLayoutPanel eastPanel = null;
230
231 8636 fjp
        private MyTableModel tableModel = new MyTableModel(); // @jve:decl-index=0:visual-constraint=""
232 8573 azabala
233
        private JButton btnLoadStage = null;
234
235
        private JButton btnSaveStage = null;
236 8641 jaume
237 8573 azabala
        private Network network;
238
239
        private ArrayList routeFlags;
240
241
        private JLabel lblCost;
242
243 8326 jaume
        private JLabel lblFlagAmout;
244 8573 azabala
245 8326 jaume
        private JButton btnPullDownStage;
246 8573 azabala
247 8326 jaume
        private JButton btnPushUpStage;
248 8573 azabala
249 8326 jaume
        private JButton btnRemoveStage;
250 8573 azabala
251 8326 jaume
        private JPanel southPanel;
252 8573 azabala
253 8326 jaume
        private final String[] colName = new String[] {
254 8573 azabala
                        PluginServices.getText(this, "enable"),
255
                        PluginServices.getText(this, "stage"),
256
                        PluginServices.getText(this, "cost"), };
257
258 8751 fjp
        private JButton btnCenterOnFlag;
259 8573 azabala
260 8401 jaume
        private JButton btnSaveRoute;
261 8411 azabala
262 8573 azabala
        private MapControl mapCtrl;
263 8641 jaume
264 8636 fjp
        private class MyTableModel extends AbstractTableModel {
265
                public int getColumnCount() {
266
                        return 3;
267
                }
268 8521 jaume
269 8636 fjp
                public int getRowCount() {
270
                        return _getFlags().size();
271
                }
272
273
                public Object getValueAt(int rowIndex, int columnIndex) {
274
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
275
                        switch (columnIndex) {
276
                        case 0:
277
                                return new Boolean(flag.isEnabled());
278
                        case 1:
279
                                return flag.getDescription();
280
                        case 2:
281
                                return new Double(flag.getCost());
282
                        }
283
284
                        return null;
285
                }
286
287
                public Class getColumnClass(int columnIndex) {
288
                        switch (columnIndex)
289
                        {
290
                        case 0:
291
                                return Boolean.class;
292
                        case 1:
293
                                return String.class;
294
                        case 2:
295
                                return Double.class;
296 8641 jaume
297 8636 fjp
                        }
298
                        return super.getColumnClass(columnIndex);
299
                }
300
301
                public String getColumnName(int column) {
302
                        return colName[column];
303
                }
304
305
                public boolean isCellEditable(int rowIndex, int columnIndex) {
306
                        if (columnIndex == 2)
307
                                return false;
308
                        return true;
309
310
                }
311
312
                public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
313
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
314
                        switch (columnIndex)
315
                        {
316
                        case 0:
317
                                Boolean bAux = (Boolean) aValue;
318
                                flag.setEnabled(bAux.booleanValue());
319 8640 fjp
                                PluginServices.getMainFrame().enableControls();
320 8636 fjp
                                return;
321
                        case 1:
322
                                String strAux = (String) aValue;
323
                                flag.setDescription(strAux);
324
                                return;
325 8641 jaume
326 8636 fjp
//                        case 2: // No es editable
327
//                                Double dblAux = (Double) aValue;
328
//                                flag.setCost(dblAux.doubleValue());
329
//                                return;
330 8641 jaume
331 8636 fjp
                        }
332
333
                }
334 8641 jaume
335 8636 fjp
        }
336
337 8573 azabala
        /**
338
         * This method initializes
339 8641 jaume
         *
340 8573 azabala
         */
341
        public RouteControlPanel(Network network) {
342
                super();
343
                this.network = network;
344 8613 fjp
//                GvFlag[] flags = network.getFlags();
345
//                List vflags = _getFlags();
346
//                for (int i = 0; i < flags.length; i++) {
347
//                        vflags.add(flags[i]);
348
//                }
349 8573 azabala
                initialize();
350
        }
351 8641 jaume
352 8573 azabala
        /**
353
         * Method to remove all flags (use
354
         * */
355
        public void refresh(){
356 8613 fjp
//                GvFlag[] flags = network.getFlags();
357
//                List vflags = _getFlags();
358
//                List tempFlags = Arrays.asList(flags);
359
//                vflags.addAll(tempFlags);
360 8573 azabala
                lblFlagAmout.setText(String.valueOf(_getFlags()
361
                                .size()));
362
                updateTotalCost();
363 8636 fjp
                getTblStages().revalidate();
364
                System.out.println("Actualizo tabla");
365 8641 jaume
366 8573 azabala
        }
367 8606 fjp
        private void processLayer(FLayer layer) {
368
                if (layer.isActive()) {
369
                        if (layer instanceof FLyrVect) {
370
                                Network net = (Network) layer
371
                                                .getProperty("network");
372
                                if (net != null) {
373
                                        network = net;
374
                                        network.addFlagListener(this);
375
                                        refresh();
376
                                }// if
377
                        }// if
378
                }// if
379
380
        }
381 8641 jaume
382 8636 fjp
        public void setMapControl(MapControl mapCtrl, Network net) {
383 8573 azabala
                if (mapCtrl != null) {
384
                        this.mapCtrl = mapCtrl;
385
                        LayerListenerAdapter listener = new LayerListenerAdapter() {
386
                                public void activationChanged(LayerEvent e) {
387
                                        processLayer(e.getSource());
388
                                }
389
                        };
390
                        mapCtrl.getMapContext().getLayers().addLayerListener(listener);
391
                        mapCtrl.getMapContext().getLayers().addLayerCollectionListener(
392
                                        listener);
393 8636 fjp
                        if (net != null) {
394
                                network = net;
395
                                network.addFlagListener(this);
396 8641 jaume
                        }
397 8573 azabala
                }
398
        }
399 8326 jaume
400 8573 azabala
        public RouteControlPanel() {
401
                super();
402
                initialize();
403
        }
404 8326 jaume
405 8573 azabala
        public void setCostUnits(String unitsName) {
406
                colName[2] = unitsName;
407
                getTblStages().repaint();
408
        }
409 8521 jaume
410 8573 azabala
        /**
411
         * This method initializes this
412 8641 jaume
         *
413 8573 azabala
         */
414
        private void initialize() {
415
                BorderLayout borderLayout = new BorderLayout();
416
                borderLayout.setHgap(10);
417
                borderLayout.setVgap(10);
418
                JPanel cont = new JPanel(borderLayout);
419 8641 jaume
//                cont.setPreferredSize(new Dimension(490, 320));
420 8647 jaume
                this.setPreferredSize(new Dimension(460, 280));
421 8641 jaume
                cont.add(getWestPanel(), BorderLayout.CENTER);
422
                cont.add(getEastPanel(), BorderLayout.EAST);
423 8573 azabala
                cont.add(getSouthPanel(), BorderLayout.SOUTH);
424 8641 jaume
                this.setLayout(new FlowLayout(FlowLayout.LEADING, 10, 10));
425 8573 azabala
                this.add(cont);
426
                updateFlags();
427
        }
428 8326 jaume
429 8573 azabala
        private void updateFlags() {
430
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
431
                updateTotalCost();
432
                getTblStages().repaint();
433
        }
434 8326 jaume
435 8573 azabala
        private JPanel getSouthPanel() {
436
                if (southPanel == null) {
437
                        southPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
438
                        southPanel.add(getBtnRemoveStage());
439
                        southPanel.add(new JBlank(50, 20));
440
                        southPanel.add(getBtnPushUpStage());
441
                        southPanel.add(getBtnPullDownStage());
442
                        southPanel.add(new JLabel(PluginServices.getText(this,
443
                                        "flag_amount")));
444
                        lblFlagAmout = new JLabel();
445
                        lblFlagAmout.setFont(lblFlagAmout.getFont().deriveFont(Font.BOLD));
446
                        southPanel.add(lblFlagAmout);
447
                }
448
                return southPanel;
449
        }
450
451 8326 jaume
        public Object getWindowModel() {
452 8573 azabala
                return this.getClass();
453
        }
454 8326 jaume
455 8573 azabala
        public WindowInfo getWindowInfo() {
456
                if (wi == null) {
457
                        wi = new WindowInfo(WindowInfo.MODELESSDIALOG
458 8647 jaume
                                    | WindowInfo.MAXIMIZABLE
459 8573 azabala
                                        | WindowInfo.ICONIFIABLE | WindowInfo.PALETTE);
460 8647 jaume
                        wi.setWidth((int) this.getPreferredSize().getWidth());
461
                        wi.setHeight((int) this.getPreferredSize().getHeight());
462 8639 fjp
                        wi.setTitle(PluginServices.getText(this, "route_control_panel"));
463 8573 azabala
                }
464
                return wi;
465
        }
466 8326 jaume
467 8573 azabala
        /**
468
         * This method initializes westPanel
469 8641 jaume
         *
470 8573 azabala
         * @return javax.swing.JPanel
471
         */
472
        private JPanel getWestPanel() {
473
                if (westPanel == null) {
474
                        westPanel = new JPanel(new BorderLayout(5, 5));
475
                        lblCost = new JLabel();
476
                        lblCost.setFont(lblCost.getFont().deriveFont(Font.BOLD));
477
                        GridBagLayoutPanel aux = new GridBagLayoutPanel();
478
                        aux.addComponent(PluginServices.getText(this, "total_route_cost")
479
                                        + ":", lblCost);
480
                        aux.addComponent(getScrlStages());
481 8326 jaume
482 8573 azabala
                        westPanel.add(aux);
483
                }
484
                return westPanel;
485
        }
486 8326 jaume
487 8573 azabala
        private JButton getBtnPullDownStage() {
488 8326 jaume
                if (btnPullDownStage == null) {
489 8573 azabala
                        btnPullDownStage = new JButton(new ImageIcon(this.getClass()
490
                                        .getClassLoader().getResource("images/down-arrow.png")));
491
                        // btnPullDownStage.setName("btnPullDownStage");
492 8326 jaume
                        btnPullDownStage.addActionListener(this);
493
                }
494
                return btnPullDownStage;
495
        }
496
497
        private JButton getBtnPushUpStage() {
498
                if (btnPushUpStage == null) {
499 8573 azabala
                        btnPushUpStage = new JButton(new ImageIcon(this.getClass()
500
                                        .getClassLoader().getResource("images/up-arrow.png")));
501
                        // btnPushUpStage.setName("btnPushUpStage");
502 8326 jaume
                        btnPushUpStage.addActionListener(this);
503
                }
504
                return btnPushUpStage;
505
        }
506
507
        private JButton getBtnRemoveStage() {
508
                if (btnRemoveStage == null) {
509 8573 azabala
                        btnRemoveStage = new JButton(new ImageIcon(this.getClass()
510
                                        .getClassLoader().getResource("images/delete.png")));
511
                        // btnRemoveStage.setName("btnRemoveStage");
512 8326 jaume
                        btnRemoveStage.addActionListener(this);
513
                }
514
                return btnRemoveStage;
515
        }
516
517
        /**
518 8573 azabala
         * This method initializes scrlStages
519 8641 jaume
         *
520 8573 azabala
         * @return javax.swing.JScrollPane
521
         */
522
        private JScrollPane getScrlStages() {
523
                if (scrlStages == null) {
524
                        scrlStages = new JScrollPane();
525
                        scrlStages.setViewportView(getTblStages());
526
                        scrlStages.setPreferredSize(new Dimension(270, 200));
527
                }
528
                return scrlStages;
529
        }
530 8326 jaume
531 8606 fjp
        /**
532
         * @deprecated
533
         * @param flag
534
         */
535 8573 azabala
        public void addFlag(GvFlag flag) {
536
                _getFlags().add(flag);
537
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
538
                updateTotalCost();
539
                getTblStages().repaint();
540
        }
541 8326 jaume
542 8573 azabala
        private void updateTotalCost() {
543
                GvFlag[] flags = getFlags();
544
                double cost = 0;
545
                for (int i = 0; i < flags.length; i++) {
546 8762 fjp
                        if (!flags[i].isEnabled())
547
                                continue;
548
                        if (flags[i].getCost() >= Double.MAX_VALUE)
549
                        {
550
                                lblCost.setText(PluginServices.getText(this, "no_se_puede_pasar_por_todas_las_paradas"));
551
                                return;
552
                        }
553
                        if (flags[i].getCost() < 0)
554
                        {
555
                                lblCost.setText(PluginServices.getText(this, "solucion_no_valida"));
556
                                return;
557
                        }
558 11296 caballero
559 8365 jaume
                        cost += flags[i].getCost();
560
                }
561 8762 fjp
                NumberFormat nf = NumberFormat.getInstance();
562
                nf.setMaximumFractionDigits(2);
563
                lblCost.setText(nf.format(cost) + getCostUnitName());
564 8365 jaume
        }
565
566
        private String getCostUnitName() {
567
                if (colName[2].equals(PluginServices.getText(this, "cost")))
568
                        return "";
569
                return colName[2];
570
        }
571
572
        public void removeFlag(GvFlag flag) {
573 8573 azabala
                removeFlag(_getFlags().indexOf(flag));
574
        }
575 8326 jaume
576 8573 azabala
        public void removeFlag(int index) {
577
                _getFlags().remove(index);
578
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
579
                getTblStages().repaint();
580
        }
581 8326 jaume
582 8573 azabala
        /**
583
         * This method initializes tblStages
584 8641 jaume
         *
585 8573 azabala
         * @return javax.swing.JTable
586
         */
587
        private JTable getTblStages() {
588
                if (tblStages == null) {
589
                        tblStages = new JTable();
590
                        tblStages
591
                                        .setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
592
                        tblStages.setModel(getTableModel());
593
                        TableColumnModel cm = tblStages.getColumnModel();
594 8326 jaume
595 8573 azabala
                        int tablePreferredWidth = (int) tblStages.getPreferredSize()
596
                                        .getWidth();
597
                        int colSize = tblStages.getFontMetrics(tblStages.getFont())
598
                                        .stringWidth(tblStages.getModel().getColumnName(0)) * 2;
599
                        cm.getColumn(0).setPreferredWidth((int) (colSize));
600
                        cm.getColumn(0).setMinWidth((int) (colSize));
601
                        cm.getColumn(0).setMaxWidth((int) (colSize));
602
                        tablePreferredWidth -= colSize;
603
                        cm.getColumn(1)
604
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.7));
605
                        cm.getColumn(2)
606
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.3));
607 8762 fjp
608
                        // Ask to be notified of selection changes.
609
                        ListSelectionModel rowSM = tblStages.getSelectionModel();
610
                        rowSM.addListSelectionListener(new ListSelectionListener() {
611
                            public void valueChanged(ListSelectionEvent e) {
612
                                //Ignore extra messages.
613
                                if (e.getValueIsAdjusting()) return;
614
615
                                ListSelectionModel lsm =
616
                                    (ListSelectionModel)e.getSource();
617
                                getBtnCenterOnFlag().setEnabled(!lsm.isSelectionEmpty());
618
                            }
619
                        });
620 11296 caballero
621 8762 fjp
                        tblStages.getModel().addTableModelListener(new TableModelListener() {
622
623
                                public void tableChanged(TableModelEvent e) {
624
                                        System.out.println("Table model changed");
625 11296 caballero
626 8762 fjp
                                }
627 11296 caballero
628 8762 fjp
                        });
629
630 11296 caballero
631 8573 azabala
                }
632
                return tblStages;
633
        }
634 8326 jaume
635 8573 azabala
        protected int getFlagCount() {
636
                return _getFlags().size();
637
        }
638 8326 jaume
639 8573 azabala
        private List _getFlags() {
640 8606 fjp
//                if (routeFlags == null) {
641
//                        routeFlags = new ArrayList();
642
//                }
643
//                return routeFlags;
644 8641 jaume
645 8606 fjp
                return network.getOriginaFlags();
646 8573 azabala
        }
647 8326 jaume
648 8573 azabala
        protected boolean isSelected(int row) {
649
                return ((GvFlag) _getFlags().get(row)).isEnabled();
650
        }
651 8326 jaume
652 8573 azabala
        /**
653
         * This method initializes eastPanel
654 8641 jaume
         *
655 8573 azabala
         * @return javax.swing.JPanel
656
         */
657
        private JPanel getEastPanel() {
658
                if (eastPanel == null) {
659
                        GridLayout layout = new GridLayout();
660
                        layout.setColumns(1);
661
                        layout.setVgap(5);
662
                        JPanel aux = new JPanel();
663
                        aux.add(getBtnLoadStage());
664
                        aux.add(getBtnSaveStage());
665
                        aux.add(getBtnSaveRoute());
666 8751 fjp
                        aux.add(getBtnCenterOnFlag());
667 8573 azabala
                        layout.setRows(aux.getComponentCount());
668
                        aux.setLayout(layout);
669
                        eastPanel = new GridBagLayoutPanel();
670
                        eastPanel.addComponent(aux);
671
                }
672
                return eastPanel;
673 8401 jaume
        }
674
675 8751 fjp
        private JButton getBtnCenterOnFlag() {
676
                if (btnCenterOnFlag == null) {
677
                        btnCenterOnFlag = new JButton();
678
                        btnCenterOnFlag.setText(PluginServices.getText(this,
679
                                        "center_on_flag"));
680 8762 fjp
                        btnCenterOnFlag.setEnabled(false);
681 8751 fjp
                        btnCenterOnFlag.addActionListener(this);
682
                }
683
                return btnCenterOnFlag;
684
        }
685 8573 azabala
686 8401 jaume
        private JButton getBtnSaveRoute() {
687 8573 azabala
                if (btnSaveRoute == null) {
688
                        btnSaveRoute = new JButton();
689
                        btnSaveRoute.setText(PluginServices.getText(this, "save_route"));
690
                        btnSaveRoute.addActionListener(this);
691
                }
692
                return btnSaveRoute;
693
        }
694 8401 jaume
695
        /**
696 8573 azabala
         * This method initializes defaultTableModel
697 8641 jaume
         *
698 8573 azabala
         * @return javax.swing.table.DefaultTableModel
699
         */
700
        private TableModel getTableModel() {
701
                return tableModel;
702
        }
703 8521 jaume
704 8573 azabala
        /**
705
         * This method initializes btnLoadStage
706 8641 jaume
         *
707 8573 azabala
         * @return javax.swing.JButton
708
         */
709
        private JButton getBtnLoadStage() {
710
                if (btnLoadStage == null) {
711
                        btnLoadStage = new JButton();
712
                        btnLoadStage.setText(PluginServices.getText(this, "load_stages"));
713
                        btnLoadStage.addActionListener(this);
714
                }
715
                return btnLoadStage;
716
        }
717 8521 jaume
718 8573 azabala
        /**
719
         * This method initializes btnSaveStages
720 8641 jaume
         *
721 8573 azabala
         * @return javax.swing.JButton
722
         */
723
        private JButton getBtnSaveStage() {
724
                if (btnSaveStage == null) {
725
                        btnSaveStage = new JButton();
726
                        btnSaveStage.setText(PluginServices.getText(this, "save_stages"));
727
                        btnSaveStage.addActionListener(this);
728
                }
729
                return btnSaveStage;
730
        }
731 8521 jaume
732 8573 azabala
        class FormatSelectionPanel extends JPanel implements IWindow {
733 8521 jaume
734 8573 azabala
                JComboBox formats;
735
                WindowInfo wi = null;
736 8521 jaume
737 8623 azabala
                public FormatSelectionPanel(String introductoryText) {
738 8573 azabala
                        super(new BorderLayout());
739
                        String[] formatos = { "SHP", "DXF", "POSTGIS", "GML" };
740
                        formats = new JComboBox(formatos);
741 8641 jaume
                        GridBagLayoutPanel contentPanel =
742 8573 azabala
                                new GridBagLayoutPanel();
743 8623 azabala
                        contentPanel.addComponent(new JLabel(introductoryText));
744 8573 azabala
                        contentPanel.addComponent(formats);
745
                        JButton okButton = new JButton(PluginServices.getText(null,
746
                                        "Aceptar"));
747
                        okButton.addActionListener(new ActionListener() {
748
                                public void actionPerformed(ActionEvent arg0) {
749
                                        close();
750 8521 jaume
                                }
751 8573 azabala
                        });
752
                        contentPanel.addComponent(okButton);
753 8641 jaume
754 8573 azabala
                        add(contentPanel);
755
                }
756 8521 jaume
757 8573 azabala
                void close() {
758
                        PluginServices.getMDIManager().closeWindow(this);
759
                }
760 8521 jaume
761 8573 azabala
                public String getSelectedFormat() {
762
                        return (String) formats.getSelectedItem();
763
                }
764 8521 jaume
765 8573 azabala
                public WindowInfo getWindowInfo() {
766
                        if (wi == null) {
767
                                wi = new WindowInfo(WindowInfo.MODALDIALOG | WindowInfo.PALETTE);
768
                                wi.setTitle(PluginServices
769
                                                .getText(null, "Seleccion_de_formato"));// Internacionalizar
770
                                                                                                                                // esto
771
                                wi.setWidth(300);
772 8623 azabala
                                wi.setHeight(55);
773 8573 azabala
                        }
774
                        return wi;
775
                }
776 8521 jaume
777 8573 azabala
        }
778 8521 jaume
779 8573 azabala
        public void actionPerformed(ActionEvent e) {
780
                Component c = (Component) e.getSource();
781
                if (c.equals(getBtnLoadStage())) {
782
                        loadStages();
783
                } else if (c.equals(getBtnSaveStage())) {
784
                        saveStage();
785 8401 jaume
                } else if (c.equals(getBtnPushUpStage())) {
786 8326 jaume
                        int[] selected = tblStages.getSelectedRows();
787
                        if (selected.length == 0 || selected[0] == 0)
788
                                return;
789
                        tblStages.clearSelection();
790
                        for (int i = 0; i < selected.length; i++) {
791 8573 azabala
                                Object aux = _getFlags().get(selected[i] - 1);
792
                                _getFlags().set(selected[i] - 1, _getFlags().get(selected[i]));
793 8326 jaume
                                _getFlags().set(selected[i], aux);
794
                                selected[i]--;
795
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
796
                        }
797 8762 fjp
                        invalidateSolution();
798 8401 jaume
                } else if (c.equals(getBtnPullDownStage())) {
799 8326 jaume
                        // pull down
800
                        int[] selected = tblStages.getSelectedRows();
801 8573 azabala
                        if (selected.length == 0
802
                                        || selected[selected.length - 1] >= _getFlags().size() - 1)
803 8326 jaume
                                return;
804
805
                        // move rows
806
                        tblStages.clearSelection();
807 8573 azabala
                        for (int i = selected.length - 1; i >= 0; i--) {
808
                                Object aux = _getFlags().get(selected[i] + 1);
809
                                _getFlags().set(selected[i] + 1, _getFlags().get(selected[i]));
810 8326 jaume
                                _getFlags().set(selected[i], aux);
811
                                selected[i]++;
812
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
813
                        }
814 8762 fjp
                        invalidateSolution();
815 8326 jaume
816 8401 jaume
                } else if (c.equals(getBtnRemoveStage())) {
817 11296 caballero
                        removeStage();
818 8573 azabala
                } else if (c.equals(getBtnSaveRoute())) {
819
                        saveRoute();
820 8751 fjp
                } else if (c.equals(getBtnCenterOnFlag())) {
821
                        // Center on first selected flag.
822
                        int[] selected = tblStages.getSelectedRows();
823
                        if (selected.length == 0)
824
                                return;
825
                        GvFlag flag = (GvFlag) _getFlags().get(selected[0]);
826
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
827
                        if(! (window instanceof IView))
828
                                return;
829
                        IView view = (IView) window;
830
                        ViewPort vp = view.getMapControl().getViewPort();
831
                        Rectangle2D extent = vp.getAdjustedExtent();
832
                        double xNC = flag.getOriginalPoint().getX();
833
                        double yNC = flag.getOriginalPoint().getY();
834 8762 fjp
                        double width = extent.getWidth();
835
                        double height = extent.getHeight();
836 11296 caballero
837 8751 fjp
                        Rectangle2D.Double r = new Rectangle2D.Double();
838 11296 caballero
839 8762 fjp
                        r.width = width;
840
                        r.height = height;
841
                        r.x = xNC - width/2;
842
                        r.y = yNC - height/2;
843 8751 fjp
844
                        vp.setExtent(r);
845
846 11296 caballero
847
848 8751 fjp
                }
849 8573 azabala
                repaint();
850
        }
851
852 8762 fjp
        private void invalidateSolution() {
853
                for (int i=0; i < _getFlags().size(); i++)
854
                {
855
                        GvFlag flag = (GvFlag) _getFlags().get(i);
856
                        flag.setCost(-1.0);
857
                }
858
                updateTotalCost();
859
        }
860
861 8573 azabala
        private void saveStage(){
862 8623 azabala
                if(network == null){
863
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
864
                        if(! (window instanceof IView))
865
                                return;
866
                        IView view = (View) window;
867
                        MapControl mapControl = view.getMapControl();
868
                        MapContext map = mapControl.getMapContext();
869
                        FLayers layers = map.getLayers();
870
                        SingleLayerIterator it = new SingleLayerIterator(layers);
871
                        while (it.hasNext() && network == null) {
872
                                FLayer aux = it.next();
873
                                if (!aux.isActive())
874
                                        continue;
875
                                network = (Network) aux.getProperty("network");
876
                        }
877
                }
878
                if (network == null)
879 8573 azabala
                        return;
880 8641 jaume
881 8573 azabala
                List features = new ArrayList();
882 8623 azabala
                GvFlag[] flags = network.getFlags();
883 8573 azabala
                for(int i = 0; i < flags.length; i++){
884
                        GvFlag flag = flags[i];
885 8751 fjp
                        // Solo se guardan los flags habilitados
886
                        if (!flag.isEnabled())
887
                                continue;
888 8573 azabala
                        FPoint2D point = new FPoint2D(flag.getOriginalPoint());
889
                        Value[] values = new Value[6];
890
                        values[GvFlag.ID_FLAG_INDEX] = ValueFactory.createValue(flag.getIdFlag());
891
                        values[GvFlag.ID_ARC_INDEX] = ValueFactory.createValue(flag.getIdArc());
892
                        values[GvFlag.DESCRIPTION_INDEX] = ValueFactory.createValue(flag.getDescription());
893
                        values[GvFlag.DIREC_INDEX] = ValueFactory.createValue(flag.getDirec());
894
                        values[GvFlag.PCT_INDEX] = ValueFactory.createValue(flag.getPct());
895
                        values[GvFlag.COST_INDEX] = ValueFactory.createValue(flag.getCost());
896
                        IGeometry geo = ShapeFactory.createPoint2D(point);
897
                        DefaultFeature feature = new DefaultFeature(geo, values, new Integer(flag.getIdFlag()).toString() );
898
                        features.add(feature);
899
                }
900 8641 jaume
901 8573 azabala
                FlagsMemoryDriver driver = new FlagsMemoryDriver(features);
902
                IProjection projection = FOpenDialog.getLastProjection();
903 8623 azabala
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Flags",
904 8573 azabala
                                driver, projection);
905
906 8641 jaume
                FormatSelectionPanel selectionPanel =
907 8623 azabala
                        new FormatSelectionPanel(PluginServices.
908
                                        getText(null,
909
                                "Seleccione_un_formato_para_guardar_los_flags"));
910 8573 azabala
                PluginServices.getMDIManager().addWindow(selectionPanel);
911
912
                String format = selectionPanel.getSelectedFormat();
913
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
914 8623 azabala
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
915
                if(! (window instanceof IView))
916
                        return;
917
                IView view = (View) window;
918
                MapControl mapControl = view.getMapControl();
919 8573 azabala
                MapContext context = mapControl.getMapContext();
920
                try {
921
                        if (format.equalsIgnoreCase("SHP")) {
922
                                export.saveToShp(context, routeLayer);
923
                        } else if (format.equalsIgnoreCase("DXF")) {
924
                                export.saveToDxf(context, routeLayer);
925
                        } else if (format.equalsIgnoreCase("GML")) {
926
                                export.saveToGml(context, routeLayer);
927
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
928
                                export.saveToPostGIS(context, routeLayer);
929 8513 azabala
                        }
930 8573 azabala
                } catch (EditionException e1) {
931
                        // TODO Auto-generated catch block
932
                        e1.printStackTrace();
933
                } catch (DriverIOException e1) {
934
                        // TODO Auto-generated catch block
935
                        e1.printStackTrace();
936
                }
937 8521 jaume
938 8573 azabala
        }
939
        private void saveRoute() {
940
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
941
                if(! (window instanceof IView))
942
                        return;
943
                IView view = (View) window;
944
                MapControl mapControl = view.getMapControl();
945 8659 azabala
                List routes = (List) GvSession.getInstance().get(mapControl, "Route");
946
                if(routes == null || routes.size() == 0){
947
                        JOptionPane.showMessageDialog(this, PluginServices.getText(this, "Ruta_borrada_o_inexistente"),
948
                                        PluginServices.getText(this, "Ruta_no_encontrada"),
949
                                        JOptionPane.ERROR_MESSAGE);
950 8623 azabala
                        return;
951 11296 caballero
                }
952 8659 azabala
                Route lastRoute = (Route) routes.get(routes.size() - 1);
953
                RouteMemoryDriver driver = new RouteMemoryDriver(lastRoute.getFeatureList());
954 8573 azabala
                IProjection projection = FOpenDialog.getLastProjection();
955
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Route",
956
                                driver, projection);
957 8521 jaume
958 8623 azabala
                FormatSelectionPanel selectionPanel = new FormatSelectionPanel(PluginServices.getText(null,
959
                "Seleccione_un_formato_para_guardar_la_ruta"));
960 8573 azabala
                PluginServices.getMDIManager().addWindow(selectionPanel);
961 8521 jaume
962 8573 azabala
                String format = selectionPanel.getSelectedFormat();
963
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
964
                MapContext context = mapControl.getMapContext();
965
                try {
966
                        if (format.equalsIgnoreCase("SHP")) {
967
                                export.saveToShp(context, routeLayer);
968
                        } else if (format.equalsIgnoreCase("DXF")) {
969
                                export.saveToDxf(context, routeLayer);
970
                        } else if (format.equalsIgnoreCase("GML")) {
971
                                export.saveToGml(context, routeLayer);
972
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
973
                                export.saveToPostGIS(context, routeLayer);
974
                        }
975
                } catch (EditionException e1) {
976
                        // TODO Auto-generated catch block
977
                        e1.printStackTrace();
978
                } catch (DriverIOException e1) {
979
                        // TODO Auto-generated catch block
980
                        e1.printStackTrace();
981
                }
982
        }
983 8521 jaume
984 8573 azabala
        /**
985
         * Converts a point layer loaded in the active view's toc in a collection of
986
         * flags of the active network
987 8641 jaume
         *
988 8573 azabala
         */
989
        private void loadStages() {
990
991
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
992
                if(! (window instanceof IView))
993
                        return;
994
                IView view = (IView) window;
995
                MapControl mapControl = view.getMapControl();
996
                MapContext map = mapControl.getMapContext();
997
                FLayers layers = map.getLayers();
998
999
                String title = PluginServices.getText(this,
1000
                                "Seleccionar_capa_con_puntos_de_parada");
1001
                String introductoryText = PluginServices.getText(this,
1002
                                "Seleccione_una_capa_de_puntos_para_crear_paradas");
1003
1004
                LayerSelectionPanel selectionPanel = new LayerSelectionPanel(layers,
1005
                                title, introductoryText, FLyrVect.class, FShape.POINT);
1006
                PluginServices.getMDIManager().addWindow(selectionPanel);
1007
1008
                if (!selectionPanel.wasFinishPressed())
1009
                        return;
1010
                else {
1011
                        FLayer layer = selectionPanel.getLayer();
1012
                        if (layer == null)
1013
                                return;
1014
                        if (!(layer instanceof FLyrVect))
1015
                                return;
1016
                        FLyrVect vectLyr = (FLyrVect) layer;
1017
1018
                        try {
1019
                                if (vectLyr.getShapeType() != FShape.POINT)
1020
                                        return;
1021
1022
                                // TODO
1023 8723 fjp
                                // Hay que refinar bastante, para que el usuario elija
1024 8573 azabala
                                // con que red y con qu? capa lineal quiere trabajar
1025
                                // tal y como est?, si hubiese varias se trabajaria
1026
                                // con la primera que devuelva el iterador
1027
1028
                                Network net = null;
1029
                                SingleLayerIterator it = new SingleLayerIterator(layers);
1030
                                while (it.hasNext() && net == null) {
1031
                                        FLayer aux = it.next();
1032
                                        if (!aux.isActive())
1033
                                                continue;
1034
                                        net = (Network) aux.getProperty("network");
1035
                                }
1036
                                if (net == null)
1037
                                        return;
1038
1039 8673 fjp
                                // Por si queremos a?adir paradas a otras ya existentes
1040
//                                _getFlags().clear();
1041 11296 caballero
1042 8573 azabala
                                GvFlag flag;
1043
                                ReadableVectorial reader = vectLyr.getSource();
1044 8626 azabala
                                SelectableDataSource recordset = vectLyr.getRecordset();
1045 8573 azabala
                                int numShapes = reader.getShapeCount();
1046
1047 8723 fjp
                                double realTol = mapCtrl.getViewPort()
1048
                                                .toMapDistance(FlagListener.pixelTolerance);
1049 11296 caballero
                                reader.start();
1050 8573 azabala
                                for (int i = 0; i < numShapes; i++) {
1051
                                        Geometry geo = reader.getShape(i).toJTSGeometry();
1052
                                        if (!((geo instanceof Point) || (geo instanceof MultiPoint)))
1053
                                                continue;
1054
1055 11296 caballero
1056
1057 8573 azabala
                                        Coordinate[] coords = geo.getCoordinates();
1058
                                        for (int j = 0; j < coords.length; j++) {
1059 8723 fjp
//                                                flag = new GvFlag(coords[j].x, coords[j].y);
1060 8641 jaume
1061 8723 fjp
//                                                NumericValue idflag = (NumericValue) recordset.getFieldValue(i, GvFlag.ID_FLAG_INDEX);
1062
//                                                flag.setIdFlag(idflag.intValue());
1063
//                                                NumericValue idarc = (NumericValue) recordset.getFieldValue(i, GvFlag.ID_ARC_INDEX);
1064
//                                                flag.setIdArc(idarc.intValue());
1065
//                                                NumericValue pct = (NumericValue) recordset.getFieldValue(i, GvFlag.PCT_INDEX);
1066
//                                                flag.setPct(pct.doubleValue());
1067
//                                                NumericValue cost = (NumericValue) recordset.getFieldValue(i, GvFlag.COST_INDEX);
1068
//                                                flag.setCost(cost.doubleValue());
1069
//                                                NumericValue direc = (NumericValue) recordset.getFieldValue(i, GvFlag.DIREC_INDEX);
1070
//                                                flag.setDirec(direc.intValue());
1071
//                                                StringValue desc = (StringValue) recordset.getFieldValue(i, GvFlag.DESCRIPTION_INDEX);
1072
//                                                flag.setDescription(desc.toString());
1073 8641 jaume
1074 8723 fjp
                                                try {
1075
                                                        flag = net.addFlag(coords[j].x, coords[j].y, realTol);
1076
1077 8673 fjp
                                                // TODO: Create use a IFlagListener to do this
1078
                                                // inside flagsChanged. The best solution is
1079
                                                // to put all the code in RouteControlPanel
1080 8723 fjp
                                                        NetworkUtils.addGraphicFlag(mapControl, flag);
1081
                                                } catch (GraphException e) {
1082
                                                        e.printStackTrace();
1083 11296 caballero
                                                        NotificationManager.addError("No se puedo situar el registro " + i +
1084 8723 fjp
                                                                        "Por favor, compruebe que est? encima de la red.", e);
1085
                                                }
1086 8573 azabala
1087 8521 jaume
                                        }
1088 8573 azabala
                                        mapControl.drawGraphics();
1089
                                        PluginServices.getMainFrame().enableControls();
1090
                                }
1091 11296 caballero
                                reader.stop();
1092 8326 jaume
1093 8573 azabala
                        } catch (DriverException e1) {
1094
                                return;
1095
                        } catch (DriverIOException e2) {
1096
                                return;
1097
                        }
1098
                }
1099
        }
1100 8326 jaume
1101 8573 azabala
        /**
1102
         * Removes the selected flags in the component's table from: -the graphic
1103
         * layer of the active view -the active network -the own table
1104 8641 jaume
         *
1105 8573 azabala
         */
1106
        private void removeStage() {
1107
                int[] selected = tblStages.getSelectedRows();
1108
1109
                for (int i = selected.length - 1; i >= 0; i--) {
1110
                        try {
1111 8616 fjp
                                // removeFlag(selected[i]);
1112
                                if (network != null) {
1113 8573 azabala
                                        final GvFlag flag = (GvFlag) _getFlags().get(selected[i]);
1114 8616 fjp
                                        NetworkUtils.clearFlagFromGraphics(mapCtrl, flag);
1115
                                        network.removeFlag(flag);
1116
                                        mapCtrl.repaint();
1117 8573 azabala
                                }
1118
                        } catch (IndexOutOfBoundsException iobEx) {
1119
                        }
1120
1121
                }// for
1122
                tblStages.clearSelection();
1123 8762 fjp
                invalidateSolution();
1124 8616 fjp
                mapCtrl.drawMap(false);
1125 8326 jaume
        }
1126
1127
        public GvFlag[] getFlags() {
1128
                return (GvFlag[]) _getFlags().toArray(new GvFlag[0]);
1129
        }
1130 8606 fjp
1131
        public void flagsChanged(int reason) {
1132
                refresh();
1133 8616 fjp
                mapCtrl.drawGraphics();
1134 8641 jaume
1135 8606 fjp
        }
1136 8573 azabala
} // @jve:decl-index=0:visual-constraint="17,9"