Statistics
| Revision:

root / trunk / extensions / extGraph_predes / src / com / iver / cit / gvsig / graph / gui / RouteControlPanel.java @ 8647

History | View | Annotate | Download (29.2 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 8647 2006-11-09 12:51:12Z jaume $
45
 * $Log$
46
 * Revision 1.20  2006-11-09 12:51:12  jaume
47
 * *** empty log message ***
48
 *
49
 * Revision 1.19  2006/11/09 11:00:43  jaume
50
 * *** empty log message ***
51
 *
52
 * Revision 1.18  2006/11/09 10:59:53  jaume
53
 * *** empty log message ***
54
 *
55
 * Revision 1.17  2006/11/09 10:27:50  fjp
56
 * *** empty log message ***
57
 *
58
 * Revision 1.16  2006/11/09 10:24:11  fjp
59
 * *** empty log message ***
60
 *
61
 * Revision 1.15  2006/11/09 09:16:35  fjp
62
 * Ya va!!
63
 *
64
 * Revision 1.14  2006/11/08 20:14:52  azabala
65
 * *** empty log message ***
66
 *
67
 * Revision 1.13  2006/11/08 19:32:22  azabala
68
 * saveroute and saveflags modifications
69
 *
70
 * Revision 1.12  2006/11/08 18:16:28  fjp
71
 * *** empty log message ***
72
 *
73
 * Revision 1.11  2006/11/08 16:48:19  fjp
74
 * *** empty log message ***
75
 *
76
 * Revision 1.10  2006/11/08 16:00:39  fjp
77
 * Por terminar el enlace flags-cuadro de di?logo
78
 *
79
 * Revision 1.9  2006/11/08 13:18:46  fjp
80
 * Por terminar el enlace flags-cuadro de di?logo
81
 *
82
 * Revision 1.8  2006/11/07 19:49:38  azabala
83
 * *** empty log message ***
84
 *
85
 * Revision 1.7  2006/11/06 13:13:53  azabala
86
 * *** empty log message ***
87
 *
88
 * Revision 1.6  2006/11/06 10:29:32  jaume
89
 * *** empty log message ***
90
 *
91
 * Revision 1.5  2006/11/03 19:39:29  azabala
92
 * *** empty log message ***
93
 *
94
 * Revision 1.4  2006/10/27 18:26:22  azabala
95
 * added implementation of load stages method
96
 *
97
 * Revision 1.3  2006/10/27 12:41:09  jaume
98
 * GUI
99
 *
100
 * Revision 1.2  2006/10/26 16:31:21  jaume
101
 * GUI
102
 *
103
 * Revision 1.1  2006/10/25 10:50:41  jaume
104
 * movement of classes and gui stuff
105
 *
106
 * Revision 1.4  2006/10/24 08:04:41  jaume
107
 * *** empty log message ***
108
 *
109
 * Revision 1.3  2006/10/23 16:00:20  jaume
110
 * *** empty log message ***
111
 *
112
 * Revision 1.2  2006/10/23 08:05:39  jaume
113
 * GUI
114
 *
115
 * Revision 1.1  2006/10/20 12:02:50  jaume
116
 * GUI
117
 *
118
 *
119
 */
120
package com.iver.cit.gvsig.graph.gui;
121

    
122
import java.awt.BorderLayout;
123
import java.awt.Color;
124
import java.awt.Component;
125
import java.awt.Dimension;
126
import java.awt.FlowLayout;
127
import java.awt.Font;
128
import java.awt.GridLayout;
129
import java.awt.event.ActionEvent;
130
import java.awt.event.ActionListener;
131
import java.util.ArrayList;
132
import java.util.List;
133

    
134
import javax.swing.ImageIcon;
135
import javax.swing.JComboBox;
136
import javax.swing.JLabel;
137
import javax.swing.JPanel;
138
import javax.swing.JScrollPane;
139
import javax.swing.JTable;
140
import javax.swing.table.AbstractTableModel;
141
import javax.swing.table.TableColumnModel;
142
import javax.swing.table.TableModel;
143

    
144
import org.cresques.cts.IProjection;
145
import org.gvsig.gui.beans.swing.GridBagLayoutPanel;
146
import org.gvsig.gui.beans.swing.JBlank;
147
import org.gvsig.gui.beans.swing.JButton;
148

    
149
import com.hardcode.gdbms.engine.values.NumericValue;
150
import com.hardcode.gdbms.engine.values.StringValue;
151
import com.hardcode.gdbms.engine.values.Value;
152
import com.hardcode.gdbms.engine.values.ValueFactory;
153
import com.iver.andami.PluginServices;
154
import com.iver.andami.ui.mdiManager.IWindow;
155
import com.iver.andami.ui.mdiManager.SingletonWindow;
156
import com.iver.andami.ui.mdiManager.WindowInfo;
157
import com.iver.cit.gvsig.fmap.DriverException;
158
import com.iver.cit.gvsig.fmap.MapContext;
159
import com.iver.cit.gvsig.fmap.MapControl;
160
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
161
import com.iver.cit.gvsig.fmap.core.FPoint2D;
162
import com.iver.cit.gvsig.fmap.core.FShape;
163
import com.iver.cit.gvsig.fmap.core.IGeometry;
164
import com.iver.cit.gvsig.fmap.core.ShapeFactory;
165
import com.iver.cit.gvsig.fmap.core.v02.FConstant;
166
import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
167
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
168
import com.iver.cit.gvsig.fmap.edition.EditionException;
169
import com.iver.cit.gvsig.fmap.layers.FLayer;
170
import com.iver.cit.gvsig.fmap.layers.FLayers;
171
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
172
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
173
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
174
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
175
import com.iver.cit.gvsig.fmap.layers.LayerListenerAdapter;
176
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
177
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
178
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
179
import com.iver.cit.gvsig.fmap.rendering.FGraphic;
180
import com.iver.cit.gvsig.graph.NetworkUtils;
181
import com.iver.cit.gvsig.graph.core.GvFlag;
182
import com.iver.cit.gvsig.graph.core.IFlagListener;
183
import com.iver.cit.gvsig.graph.core.Network;
184
import com.iver.cit.gvsig.graph.solvers.FlagsMemoryDriver;
185
import com.iver.cit.gvsig.graph.solvers.Route;
186
import com.iver.cit.gvsig.graph.solvers.RouteMemoryDriver;
187
import com.iver.cit.gvsig.project.documents.gui.FOpenDialog;
188
import com.iver.cit.gvsig.project.documents.table.gui.Table.DataSourceDataModel;
189
import com.iver.cit.gvsig.project.documents.view.gui.IView;
190
import com.iver.cit.gvsig.project.documents.view.gui.View;
191
import com.iver.cit.gvsig.util.GvSession;
192
import com.vividsolutions.jts.geom.Coordinate;
193
import com.vividsolutions.jts.geom.Geometry;
194
import com.vividsolutions.jts.geom.MultiPoint;
195
import com.vividsolutions.jts.geom.Point;
196

    
197
public class RouteControlPanel extends JPanel implements SingletonWindow,
198
                ActionListener, IFlagListener {
199
        WindowInfo wi;
200

    
201
        private JPanel westPanel = null;
202

    
203
        private JScrollPane scrlStages = null;
204

    
205
        private JTable tblStages = null;
206

    
207
        private GridBagLayoutPanel eastPanel = null;
208

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

    
211
        private JButton btnLoadStage = null;
212

    
213
        private JButton btnSaveStage = null;
214

    
215
        private Network network;
216

    
217
        private ArrayList routeFlags;
218

    
219
        private JLabel lblCost;
220

    
221
        private JLabel lblFlagAmout;
222

    
223
        private JButton btnPullDownStage;
224

    
225
        private JButton btnPushUpStage;
226

    
227
        private JButton btnRemoveStage;
228

    
229
        private JPanel southPanel;
230

    
231
        private final String[] colName = new String[] {
232
                        PluginServices.getText(this, "enable"),
233
                        PluginServices.getText(this, "stage"),
234
                        PluginServices.getText(this, "cost"), };
235

    
236
        private JButton btnGenerateRoute;
237

    
238
        private JButton btnSaveRoute;
239

    
240
        private MapControl mapCtrl;
241

    
242
        private class MyTableModel extends AbstractTableModel {
243
                public int getColumnCount() {
244
                        return 3;
245
                }
246

    
247
                public int getRowCount() {
248
                        return _getFlags().size();
249
                }
250

    
251
                public Object getValueAt(int rowIndex, int columnIndex) {
252
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
253
                        switch (columnIndex) {
254
                        case 0:
255
                                return new Boolean(flag.isEnabled());
256
                        case 1:
257
                                return flag.getDescription();
258
                        case 2:
259
                                return new Double(flag.getCost());
260
                        }
261

    
262
                        return null;
263
                }
264

    
265
                public Class getColumnClass(int columnIndex) {
266
                        switch (columnIndex)
267
                        {
268
                        case 0:
269
                                return Boolean.class;
270
                        case 1:
271
                                return String.class;
272
                        case 2:
273
                                return Double.class;
274

    
275
                        }
276
                        return super.getColumnClass(columnIndex);
277
                }
278

    
279
                public String getColumnName(int column) {
280
                        return colName[column];
281
                }
282

    
283
                public boolean isCellEditable(int rowIndex, int columnIndex) {
284
                        if (columnIndex == 2)
285
                                return false;
286
                        return true;
287

    
288
                }
289

    
290
                public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
291
                        GvFlag flag = (GvFlag) _getFlags().get(rowIndex);
292
                        switch (columnIndex)
293
                        {
294
                        case 0:
295
                                Boolean bAux = (Boolean) aValue;
296
                                flag.setEnabled(bAux.booleanValue());
297
                                PluginServices.getMainFrame().enableControls();
298
                                return;
299
                        case 1:
300
                                String strAux = (String) aValue;
301
                                flag.setDescription(strAux);
302
                                return;
303

    
304
//                        case 2: // No es editable
305
//                                Double dblAux = (Double) aValue;
306
//                                flag.setCost(dblAux.doubleValue());
307
//                                return;
308

    
309
                        }
310

    
311
                }
312

    
313
        }
314

    
315
        /**
316
         * This method initializes
317
         *
318
         */
319
        public RouteControlPanel(Network network) {
320
                super();
321
                this.network = network;
322
//                GvFlag[] flags = network.getFlags();
323
//                List vflags = _getFlags();
324
//                for (int i = 0; i < flags.length; i++) {
325
//                        vflags.add(flags[i]);
326
//                }
327
                initialize();
328
        }
329

    
330
        /**
331
         * Method to remove all flags (use
332
         * */
333
        public void refresh(){
334
//                GvFlag[] flags = network.getFlags();
335
//                List vflags = _getFlags();
336
//                List tempFlags = Arrays.asList(flags);
337
//                vflags.addAll(tempFlags);
338
                lblFlagAmout.setText(String.valueOf(_getFlags()
339
                                .size()));
340
                updateTotalCost();
341
                getTblStages().revalidate();
342
                System.out.println("Actualizo tabla");
343

    
344
        }
345
        private void processLayer(FLayer layer) {
346
                if (layer.isActive()) {
347
                        if (layer instanceof FLyrVect) {
348
                                Network net = (Network) layer
349
                                                .getProperty("network");
350
                                if (net != null) {
351
                                        network = net;
352
                                        network.addFlagListener(this);
353
                                        refresh();
354
                                }// if
355
                        }// if
356
                }// if
357

    
358
        }
359

    
360
        public void setMapControl(MapControl mapCtrl, Network net) {
361
                if (mapCtrl != null) {
362
                        this.mapCtrl = mapCtrl;
363
                        LayerListenerAdapter listener = new LayerListenerAdapter() {
364
                                public void activationChanged(LayerEvent e) {
365
                                        processLayer(e.getSource());
366
                                }
367
                        };
368
                        mapCtrl.getMapContext().getLayers().addLayerListener(listener);
369
                        mapCtrl.getMapContext().getLayers().addLayerCollectionListener(
370
                                        listener);
371
                        if (net != null) {
372
                                network = net;
373
                                network.addFlagListener(this);
374
                        }
375
                }
376
        }
377

    
378
        public RouteControlPanel() {
379
                super();
380
                initialize();
381
        }
382

    
383
        public void setCostUnits(String unitsName) {
384
                colName[2] = unitsName;
385
                getTblStages().repaint();
386
        }
387

    
388
        /**
389
         * This method initializes this
390
         *
391
         */
392
        private void initialize() {
393
                BorderLayout borderLayout = new BorderLayout();
394
                borderLayout.setHgap(10);
395
                borderLayout.setVgap(10);
396
                JPanel cont = new JPanel(borderLayout);
397
//                cont.setPreferredSize(new Dimension(490, 320));
398
                this.setPreferredSize(new Dimension(460, 280));
399
                cont.add(getWestPanel(), BorderLayout.CENTER);
400
                cont.add(getEastPanel(), BorderLayout.EAST);
401
                cont.add(getSouthPanel(), BorderLayout.SOUTH);
402
                this.setLayout(new FlowLayout(FlowLayout.LEADING, 10, 10));
403
                this.add(cont);
404
                updateFlags();
405
        }
406

    
407
        private void updateFlags() {
408
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
409
                updateTotalCost();
410
                getTblStages().repaint();
411
        }
412

    
413
        private JPanel getSouthPanel() {
414
                if (southPanel == null) {
415
                        southPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
416
                        southPanel.add(getBtnRemoveStage());
417
                        southPanel.add(new JBlank(50, 20));
418
                        southPanel.add(getBtnPushUpStage());
419
                        southPanel.add(getBtnPullDownStage());
420
                        southPanel.add(new JLabel(PluginServices.getText(this,
421
                                        "flag_amount")));
422
                        lblFlagAmout = new JLabel();
423
                        lblFlagAmout.setFont(lblFlagAmout.getFont().deriveFont(Font.BOLD));
424
                        southPanel.add(lblFlagAmout);
425
                }
426
                return southPanel;
427
        }
428

    
429
        public Object getWindowModel() {
430
                return this.getClass();
431
        }
432

    
433
        public WindowInfo getWindowInfo() {
434
                if (wi == null) {
435
                        wi = new WindowInfo(WindowInfo.MODELESSDIALOG
436
                                    | WindowInfo.MAXIMIZABLE
437
                                        | WindowInfo.ICONIFIABLE | WindowInfo.PALETTE);
438
                        wi.setWidth((int) this.getPreferredSize().getWidth());
439
                        wi.setHeight((int) this.getPreferredSize().getHeight());
440
                        wi.setTitle(PluginServices.getText(this, "route_control_panel"));
441
                }
442
                return wi;
443
        }
444

    
445
        /**
446
         * This method initializes westPanel
447
         *
448
         * @return javax.swing.JPanel
449
         */
450
        private JPanel getWestPanel() {
451
                if (westPanel == null) {
452
                        westPanel = new JPanel(new BorderLayout(5, 5));
453
                        lblCost = new JLabel();
454
                        lblCost.setFont(lblCost.getFont().deriveFont(Font.BOLD));
455
                        GridBagLayoutPanel aux = new GridBagLayoutPanel();
456
                        aux.addComponent(PluginServices.getText(this, "total_route_cost")
457
                                        + ":", lblCost);
458
                        aux.addComponent(getScrlStages());
459

    
460
                        westPanel.add(aux);
461
                }
462
                return westPanel;
463
        }
464

    
465
        private JButton getBtnPullDownStage() {
466
                if (btnPullDownStage == null) {
467
                        btnPullDownStage = new JButton(new ImageIcon(this.getClass()
468
                                        .getClassLoader().getResource("images/down-arrow.png")));
469
                        // btnPullDownStage.setName("btnPullDownStage");
470
                        btnPullDownStage.addActionListener(this);
471
                }
472
                return btnPullDownStage;
473
        }
474

    
475
        private JButton getBtnPushUpStage() {
476
                if (btnPushUpStage == null) {
477
                        btnPushUpStage = new JButton(new ImageIcon(this.getClass()
478
                                        .getClassLoader().getResource("images/up-arrow.png")));
479
                        // btnPushUpStage.setName("btnPushUpStage");
480
                        btnPushUpStage.addActionListener(this);
481
                }
482
                return btnPushUpStage;
483
        }
484

    
485
        private JButton getBtnRemoveStage() {
486
                if (btnRemoveStage == null) {
487
                        btnRemoveStage = new JButton(new ImageIcon(this.getClass()
488
                                        .getClassLoader().getResource("images/delete.png")));
489
                        // btnRemoveStage.setName("btnRemoveStage");
490
                        btnRemoveStage.addActionListener(this);
491
                }
492
                return btnRemoveStage;
493
        }
494

    
495
        /**
496
         * This method initializes scrlStages
497
         *
498
         * @return javax.swing.JScrollPane
499
         */
500
        private JScrollPane getScrlStages() {
501
                if (scrlStages == null) {
502
                        scrlStages = new JScrollPane();
503
                        scrlStages.setViewportView(getTblStages());
504
                        scrlStages.setPreferredSize(new Dimension(270, 200));
505
                }
506
                return scrlStages;
507
        }
508

    
509
        /**
510
         * @deprecated
511
         * @param flag
512
         */
513
        public void addFlag(GvFlag flag) {
514
                _getFlags().add(flag);
515
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
516
                updateTotalCost();
517
                getTblStages().repaint();
518
        }
519

    
520
        private void updateTotalCost() {
521
                GvFlag[] flags = getFlags();
522
                double cost = 0;
523
                for (int i = 0; i < flags.length; i++) {
524
                        cost += flags[i].getCost();
525
                }
526
                lblCost.setText(cost + getCostUnitName());
527
        }
528

    
529
        private String getCostUnitName() {
530
                if (colName[2].equals(PluginServices.getText(this, "cost")))
531
                        return "";
532
                return colName[2];
533
        }
534

    
535
        public void removeFlag(GvFlag flag) {
536
                removeFlag(_getFlags().indexOf(flag));
537
        }
538

    
539
        public void removeFlag(int index) {
540
                _getFlags().remove(index);
541
                lblFlagAmout.setText(String.valueOf(_getFlags().size()));
542
                getTblStages().repaint();
543
        }
544

    
545
        /**
546
         * This method initializes tblStages
547
         *
548
         * @return javax.swing.JTable
549
         */
550
        private JTable getTblStages() {
551
                if (tblStages == null) {
552
                        tblStages = new JTable();
553
                        tblStages
554
                                        .setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
555
                        tblStages.setModel(getTableModel());
556
                        TableColumnModel cm = tblStages.getColumnModel();
557

    
558
                        int tablePreferredWidth = (int) tblStages.getPreferredSize()
559
                                        .getWidth();
560
                        int colSize = tblStages.getFontMetrics(tblStages.getFont())
561
                                        .stringWidth(tblStages.getModel().getColumnName(0)) * 2;
562
                        cm.getColumn(0).setPreferredWidth((int) (colSize));
563
                        cm.getColumn(0).setMinWidth((int) (colSize));
564
                        cm.getColumn(0).setMaxWidth((int) (colSize));
565
                        tablePreferredWidth -= colSize;
566
                        cm.getColumn(1)
567
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.7));
568
                        cm.getColumn(2)
569
                                        .setPreferredWidth((int) (tablePreferredWidth * 0.3));
570
                }
571
                return tblStages;
572
        }
573

    
574
        protected int getFlagCount() {
575
                return _getFlags().size();
576
        }
577

    
578
        private List _getFlags() {
579
//                if (routeFlags == null) {
580
//                        routeFlags = new ArrayList();
581
//                }
582
//                return routeFlags;
583

    
584
                return network.getOriginaFlags();
585
        }
586

    
587
        protected boolean isSelected(int row) {
588
                return ((GvFlag) _getFlags().get(row)).isEnabled();
589
        }
590

    
591
        /**
592
         * This method initializes eastPanel
593
         *
594
         * @return javax.swing.JPanel
595
         */
596
        private JPanel getEastPanel() {
597
                if (eastPanel == null) {
598
                        GridLayout layout = new GridLayout();
599
                        layout.setColumns(1);
600
                        layout.setVgap(5);
601
                        JPanel aux = new JPanel();
602
                        aux.add(getBtnLoadStage());
603
                        aux.add(getBtnSaveStage());
604
                        aux.add(getBtnSaveRoute());
605
                        aux.add(getBtnGenerateReport());
606
                        layout.setRows(aux.getComponentCount());
607
                        aux.setLayout(layout);
608
                        eastPanel = new GridBagLayoutPanel();
609
                        eastPanel.addComponent(aux);
610
                }
611
                return eastPanel;
612
        }
613

    
614
        private JButton getBtnGenerateReport() {
615
                if (btnGenerateRoute == null) {
616
                        btnGenerateRoute = new JButton();
617
                        btnGenerateRoute.setText(PluginServices.getText(this,
618
                                        "generate_report"));
619
                        btnGenerateRoute.addActionListener(this);
620
                }
621
                return btnGenerateRoute;
622
        }
623

    
624
        private JButton getBtnSaveRoute() {
625
                if (btnSaveRoute == null) {
626
                        btnSaveRoute = new JButton();
627
                        btnSaveRoute.setText(PluginServices.getText(this, "save_route"));
628
                        btnSaveRoute.addActionListener(this);
629
                }
630
                return btnSaveRoute;
631
        }
632

    
633
        /**
634
         * This method initializes defaultTableModel
635
         *
636
         * @return javax.swing.table.DefaultTableModel
637
         */
638
        private TableModel getTableModel() {
639
                return tableModel;
640
        }
641

    
642
        /**
643
         * This method initializes btnLoadStage
644
         *
645
         * @return javax.swing.JButton
646
         */
647
        private JButton getBtnLoadStage() {
648
                if (btnLoadStage == null) {
649
                        btnLoadStage = new JButton();
650
                        btnLoadStage.setText(PluginServices.getText(this, "load_stages"));
651
                        btnLoadStage.addActionListener(this);
652
                }
653
                return btnLoadStage;
654
        }
655

    
656
        /**
657
         * This method initializes btnSaveStages
658
         *
659
         * @return javax.swing.JButton
660
         */
661
        private JButton getBtnSaveStage() {
662
                if (btnSaveStage == null) {
663
                        btnSaveStage = new JButton();
664
                        btnSaveStage.setText(PluginServices.getText(this, "save_stages"));
665
                        btnSaveStage.addActionListener(this);
666
                }
667
                return btnSaveStage;
668
        }
669

    
670
        class FormatSelectionPanel extends JPanel implements IWindow {
671

    
672
                JComboBox formats;
673
                WindowInfo wi = null;
674

    
675
                public FormatSelectionPanel(String introductoryText) {
676
                        super(new BorderLayout());
677
                        String[] formatos = { "SHP", "DXF", "POSTGIS", "GML" };
678
                        formats = new JComboBox(formatos);
679
                        GridBagLayoutPanel contentPanel =
680
                                new GridBagLayoutPanel();
681
                        contentPanel.addComponent(new JLabel(introductoryText));
682
                        contentPanel.addComponent(formats);
683
                        JButton okButton = new JButton(PluginServices.getText(null,
684
                                        "Aceptar"));
685
                        okButton.addActionListener(new ActionListener() {
686
                                public void actionPerformed(ActionEvent arg0) {
687
                                        close();
688
                                }
689
                        });
690
                        contentPanel.addComponent(okButton);
691

    
692
                        add(contentPanel);
693
                }
694

    
695
                void close() {
696
                        PluginServices.getMDIManager().closeWindow(this);
697
                }
698

    
699
                public String getSelectedFormat() {
700
                        return (String) formats.getSelectedItem();
701
                }
702

    
703
                public WindowInfo getWindowInfo() {
704
                        if (wi == null) {
705
                                wi = new WindowInfo(WindowInfo.MODALDIALOG | WindowInfo.PALETTE);
706
                                wi.setTitle(PluginServices
707
                                                .getText(null, "Seleccion_de_formato"));// Internacionalizar
708
                                                                                                                                // esto
709
                                wi.setWidth(300);
710
                                wi.setHeight(55);
711
                        }
712
                        return wi;
713
                }
714

    
715
        }
716

    
717
        public void actionPerformed(ActionEvent e) {
718
                Component c = (Component) e.getSource();
719
                if (c.equals(getBtnLoadStage())) {
720
                        loadStages();
721
                } else if (c.equals(getBtnSaveStage())) {
722
                        saveStage();
723
                } else if (c.equals(getBtnPushUpStage())) {
724
                        int[] selected = tblStages.getSelectedRows();
725
                        if (selected.length == 0 || selected[0] == 0)
726
                                return;
727
                        tblStages.clearSelection();
728
                        for (int i = 0; i < selected.length; i++) {
729
                                Object aux = _getFlags().get(selected[i] - 1);
730
                                _getFlags().set(selected[i] - 1, _getFlags().get(selected[i]));
731
                                _getFlags().set(selected[i], aux);
732
                                selected[i]--;
733
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
734
                        }
735
                } else if (c.equals(getBtnPullDownStage())) {
736
                        // pull down
737
                        int[] selected = tblStages.getSelectedRows();
738
                        if (selected.length == 0
739
                                        || selected[selected.length - 1] >= _getFlags().size() - 1)
740
                                return;
741

    
742
                        // move rows
743
                        tblStages.clearSelection();
744
                        for (int i = selected.length - 1; i >= 0; i--) {
745
                                Object aux = _getFlags().get(selected[i] + 1);
746
                                _getFlags().set(selected[i] + 1, _getFlags().get(selected[i]));
747
                                _getFlags().set(selected[i], aux);
748
                                selected[i]++;
749
                                tblStages.addRowSelectionInterval(selected[i], selected[i]);
750
                        }
751

    
752
                } else if (c.equals(getBtnRemoveStage())) {
753
                        removeStage();
754
                } else if (c.equals(getBtnSaveRoute())) {
755
                        saveRoute();
756
                } else if (c.equals(getBtnGenerateReport())) {
757

    
758
                }
759
                repaint();
760
        }
761

    
762
        private void saveStage(){
763
                if(network == null){
764
                        IWindow window = PluginServices.getMDIManager().getActiveWindow();
765
                        if(! (window instanceof IView))
766
                                return;
767
                        IView view = (View) window;
768
                        MapControl mapControl = view.getMapControl();
769
                        MapContext map = mapControl.getMapContext();
770
                        FLayers layers = map.getLayers();
771
                        SingleLayerIterator it = new SingleLayerIterator(layers);
772
                        while (it.hasNext() && network == null) {
773
                                FLayer aux = it.next();
774
                                if (!aux.isActive())
775
                                        continue;
776
                                network = (Network) aux.getProperty("network");
777
                        }
778
                }
779
                if (network == null)
780
                        return;
781

    
782
                List features = new ArrayList();
783
                GvFlag[] flags = network.getFlags();
784
                for(int i = 0; i < flags.length; i++){
785
                        GvFlag flag = flags[i];
786
                        FPoint2D point = new FPoint2D(flag.getOriginalPoint());
787
                        Value[] values = new Value[6];
788
                        values[GvFlag.ID_FLAG_INDEX] = ValueFactory.createValue(flag.getIdFlag());
789
                        values[GvFlag.ID_ARC_INDEX] = ValueFactory.createValue(flag.getIdArc());
790
                        values[GvFlag.DESCRIPTION_INDEX] = ValueFactory.createValue(flag.getDescription());
791
                        values[GvFlag.DIREC_INDEX] = ValueFactory.createValue(flag.getDirec());
792
                        values[GvFlag.PCT_INDEX] = ValueFactory.createValue(flag.getPct());
793
                        values[GvFlag.COST_INDEX] = ValueFactory.createValue(flag.getCost());
794
                        IGeometry geo = ShapeFactory.createPoint2D(point);
795
                        DefaultFeature feature = new DefaultFeature(geo, values, new Integer(flag.getIdFlag()).toString() );
796
                        features.add(feature);
797
                }
798

    
799
                FlagsMemoryDriver driver = new FlagsMemoryDriver(features);
800
                IProjection projection = FOpenDialog.getLastProjection();
801
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Flags",
802
                                driver, projection);
803

    
804
                FormatSelectionPanel selectionPanel =
805
                        new FormatSelectionPanel(PluginServices.
806
                                        getText(null,
807
                                "Seleccione_un_formato_para_guardar_los_flags"));
808
                PluginServices.getMDIManager().addWindow(selectionPanel);
809

    
810
                String format = selectionPanel.getSelectedFormat();
811
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
812
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
813
                if(! (window instanceof IView))
814
                        return;
815
                IView view = (View) window;
816
                MapControl mapControl = view.getMapControl();
817
                MapContext context = mapControl.getMapContext();
818
                try {
819
                        if (format.equalsIgnoreCase("SHP")) {
820
                                export.saveToShp(context, routeLayer);
821
                        } else if (format.equalsIgnoreCase("DXF")) {
822
                                export.saveToDxf(context, routeLayer);
823
                        } else if (format.equalsIgnoreCase("GML")) {
824
                                export.saveToGml(context, routeLayer);
825
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
826
                                export.saveToPostGIS(context, routeLayer);
827
                        }
828
                } catch (EditionException e1) {
829
                        // TODO Auto-generated catch block
830
                        e1.printStackTrace();
831
                } catch (DriverIOException e1) {
832
                        // TODO Auto-generated catch block
833
                        e1.printStackTrace();
834
                }
835

    
836
        }
837
        private void saveRoute() {
838
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
839
                if(! (window instanceof IView))
840
                        return;
841
                IView view = (View) window;
842
                MapControl mapControl = view.getMapControl();
843
                Route route = (Route) GvSession.getInstance().get(mapControl, "Route");
844
                if(route == null)
845
                        return;
846
                RouteMemoryDriver driver = new RouteMemoryDriver(route.getFeatureList());
847
                IProjection projection = FOpenDialog.getLastProjection();
848
                FLyrVect routeLayer = (FLyrVect) LayerFactory.createLayer("Route",
849
                                driver, projection);
850

    
851
                FormatSelectionPanel selectionPanel = new FormatSelectionPanel(PluginServices.getText(null,
852
                "Seleccione_un_formato_para_guardar_la_ruta"));
853
                PluginServices.getMDIManager().addWindow(selectionPanel);
854

    
855
                String format = selectionPanel.getSelectedFormat();
856
                com.iver.cit.gvsig.ExportTo export = new com.iver.cit.gvsig.ExportTo();
857
                MapContext context = mapControl.getMapContext();
858
                try {
859
                        if (format.equalsIgnoreCase("SHP")) {
860
                                export.saveToShp(context, routeLayer);
861
                        } else if (format.equalsIgnoreCase("DXF")) {
862
                                export.saveToDxf(context, routeLayer);
863
                        } else if (format.equalsIgnoreCase("GML")) {
864
                                export.saveToGml(context, routeLayer);
865
                        } else if (format.equalsIgnoreCase("POSTGIS")) {
866
                                export.saveToPostGIS(context, routeLayer);
867
                        }
868
                } catch (EditionException e1) {
869
                        // TODO Auto-generated catch block
870
                        e1.printStackTrace();
871
                } catch (DriverIOException e1) {
872
                        // TODO Auto-generated catch block
873
                        e1.printStackTrace();
874
                }
875
        }
876

    
877
        /**
878
         * Converts a point layer loaded in the active view's toc in a collection of
879
         * flags of the active network
880
         *
881
         */
882
        private void loadStages() {
883

    
884
                IWindow window = PluginServices.getMDIManager().getActiveWindow();
885
                if(! (window instanceof IView))
886
                        return;
887
                IView view = (IView) window;
888
                MapControl mapControl = view.getMapControl();
889
                MapContext map = mapControl.getMapContext();
890
                FLayers layers = map.getLayers();
891

    
892
                String title = PluginServices.getText(this,
893
                                "Seleccionar_capa_con_puntos_de_parada");
894
                String introductoryText = PluginServices.getText(this,
895
                                "Seleccione_una_capa_de_puntos_para_crear_paradas");
896

    
897
                LayerSelectionPanel selectionPanel = new LayerSelectionPanel(layers,
898
                                title, introductoryText, FLyrVect.class, FShape.POINT);
899
                PluginServices.getMDIManager().addWindow(selectionPanel);
900

    
901
                if (!selectionPanel.wasFinishPressed())
902
                        return;
903
                else {
904
                        FLayer layer = selectionPanel.getLayer();
905
                        if (layer == null)
906
                                return;
907
                        if (!(layer instanceof FLyrVect))
908
                                return;
909
                        FLyrVect vectLyr = (FLyrVect) layer;
910

    
911
                        try {
912
                                if (vectLyr.getShapeType() != FShape.POINT)
913
                                        return;
914

    
915
                                // TODO
916
                                // Hay que refinar bastante, para que el usuario eliga
917
                                // con que red y con qu? capa lineal quiere trabajar
918
                                // tal y como est?, si hubiese varias se trabajaria
919
                                // con la primera que devuelva el iterador
920

    
921
                                Network net = null;
922
                                SingleLayerIterator it = new SingleLayerIterator(layers);
923
                                while (it.hasNext() && net == null) {
924
                                        FLayer aux = it.next();
925
                                        if (!aux.isActive())
926
                                                continue;
927
                                        net = (Network) aux.getProperty("network");
928
                                }
929
                                if (net == null)
930
                                        return;
931

    
932
                                _getFlags().clear();
933
                                GvFlag flag;
934
                                ReadableVectorial reader = vectLyr.getSource();
935
                                SelectableDataSource recordset = vectLyr.getRecordset();
936
                                int numShapes = reader.getShapeCount();
937

    
938
                                GraphicLayer graphicLayer = map.getGraphicsLayer();
939
                                FSymbol simFlag = new FSymbol(FShape.POINT, Color.BLUE);
940
                                simFlag.setSize(24);
941
                                simFlag.setStyle(FConstant.SYMBOL_STYLE_MARKER_IMAGEN);
942
                                ImageIcon icon = new ImageIcon(this.getClass().getClassLoader()
943
                                                .getResource("images/pushpin.png"));
944
                                simFlag.setIcon(icon.getImage());
945
                                int idSymbolFlag = graphicLayer.addSymbol(simFlag);
946

    
947
                                for (int i = 0; i < numShapes; i++) {
948
                                        Geometry geo = reader.getShape(i).toJTSGeometry();
949
                                        if (!((geo instanceof Point) || (geo instanceof MultiPoint)))
950
                                                continue;
951

    
952
                                        /*
953
                                         * TODO Aqui deberiamos comprobar si el registro tiene
954
                                         * alguno de los campos de un Flag. A saber: ->cost
955
                                         * ->description
956
                                         */
957
                                        Coordinate[] coords = geo.getCoordinates();
958
                                        for (int j = 0; j < coords.length; j++) {
959
                                                flag = new GvFlag(coords[j].x, coords[j].y);
960

    
961
                                                NumericValue idflag = (NumericValue) recordset.getFieldValue(i, GvFlag.ID_FLAG_INDEX);
962
                                                flag.setIdFlag(idflag.intValue());
963
                                                NumericValue idarc = (NumericValue) recordset.getFieldValue(i, GvFlag.ID_ARC_INDEX);
964
                                                flag.setIdArc(idarc.intValue());
965
                                                NumericValue pct = (NumericValue) recordset.getFieldValue(i, GvFlag.PCT_INDEX);
966
                                                flag.setPct(pct.doubleValue());
967
                                                NumericValue cost = (NumericValue) recordset.getFieldValue(i, GvFlag.COST_INDEX);
968
                                                flag.setCost(cost.doubleValue());
969
                                                NumericValue direc = (NumericValue) recordset.getFieldValue(i, GvFlag.DIREC_INDEX);
970
                                                flag.setDirec(direc.intValue());
971
                                                StringValue desc = (StringValue) recordset.getFieldValue(i, GvFlag.DESCRIPTION_INDEX);
972
                                                flag.setDescription(desc.toString());
973

    
974
                                                net.addFlag(flag);
975
                                                IGeometry gAux = ShapeFactory.createPoint2D(
976
                                                                coords[j].x, coords[j].y);
977
                                                FGraphic graphic = new FGraphic(gAux, idSymbolFlag);
978
                                                graphicLayer.addGraphic(graphic);
979

    
980
                                        }
981
                                        mapControl.drawGraphics();
982
                                        PluginServices.getMainFrame().enableControls();
983
                                }
984

    
985
                        } catch (DriverException e1) {
986
                                return;
987
                        } catch (DriverIOException e2) {
988
                                return;
989
                        } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
990
                                // TODO Auto-generated catch block
991
                                e.printStackTrace();
992
                        }
993
                }
994
        }
995

    
996
        /**
997
         * Removes the selected flags in the component's table from: -the graphic
998
         * layer of the active view -the active network -the own table
999
         *
1000
         */
1001
        private void removeStage() {
1002
                int[] selected = tblStages.getSelectedRows();
1003

    
1004
                for (int i = selected.length - 1; i >= 0; i--) {
1005
                        try {
1006
                                // removeFlag(selected[i]);
1007
                                if (network != null) {
1008
                                        final GvFlag flag = (GvFlag) _getFlags().get(selected[i]);
1009
                                        NetworkUtils.clearFlagFromGraphics(mapCtrl, flag);
1010
                                        network.removeFlag(flag);
1011
                                        mapCtrl.repaint();
1012
                                }
1013
                        } catch (IndexOutOfBoundsException iobEx) {
1014
                        }
1015

    
1016
                }// for
1017
                tblStages.clearSelection();
1018
                mapCtrl.drawMap(false);
1019
        }
1020

    
1021
        public GvFlag[] getFlags() {
1022
                return (GvFlag[]) _getFlags().toArray(new GvFlag[0]);
1023
        }
1024

    
1025
        public void flagsChanged(int reason) {
1026
                refresh();
1027
                mapCtrl.drawGraphics();
1028

    
1029
        }
1030
} // @jve:decl-index=0:visual-constraint="17,9"