Statistics
| Revision:

svn-gvsig-desktop / trunk / applications / appgvSIG / src / com / iver / cit / gvsig / gui / FLegendManagerWindow.java @ 403

History | View | Annotate | Download (18.5 KB)

1
/*
2
 * Created on 24-jun-2003
3
 *
4
 * Copyright (c) 2003
5
 * Francisco Jos? Pe?arrubia Mart?nez
6
 * IVER Tecnolog?as de la Informaci?n S.A.
7
 * Salamanca 50
8
 * 46005 Valencia (        SPAIN )
9
 * +34 963163400
10
 * mailto:fran@iver.es
11
 * http://www.iver.es
12
 */
13
package com.iver.cit.gvsig.gui;
14

    
15
import java.awt.BorderLayout;
16
import java.awt.event.ActionEvent;
17
import java.awt.event.ActionListener;
18
import java.io.File;
19
import java.util.ArrayList;
20

    
21
import javax.swing.JButton;
22
import javax.swing.JDialog;
23
import javax.swing.JPanel;
24
import javax.swing.JTabbedPane;
25
import javax.xml.transform.TransformerFactory;
26
import javax.xml.transform.sax.SAXTransformerFactory;
27
import javax.xml.transform.sax.TransformerHandler;
28
import javax.xml.transform.stream.StreamResult;
29

    
30
import org.xml.sax.SAXNotSupportedException;
31
import org.xml.sax.XMLReader;
32
import org.xml.sax.helpers.XMLReaderFactory;
33

    
34
import com.iver.cit.gvsig.fmap.NewMapControl;
35
import com.iver.cit.gvsig.fmap.core.FLabel;
36
import com.iver.cit.gvsig.fmap.core.v02.FConstant;
37
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
38
import com.iver.cit.gvsig.fmap.layers.FRecordset;
39
import com.iver.cit.gvsig.gui.Panels.FPanelLegendBreaks;
40
import com.iver.cit.gvsig.gui.Panels.FPanelLegendDefault;
41
import com.iver.cit.gvsig.gui.Panels.FPanelLegendLabels;
42
import com.iver.cit.gvsig.gui.Panels.FPanelLegendValues;
43
import com.iver.cit.gvsig.project.RendererReader;
44
import com.iver.cit.gvsig.project.XMLEntityXMLHandler;
45
import com.iver.mdiApp.App;
46
import com.iver.mdiApp.Utilities;
47
import com.iver.mdiApp.plugins.files.FileExtension;
48
import com.iver.mdiApp.plugins.files.SelectedFile;
49
import com.iver.mdiApp.ui.MDIApplicationContext;
50
import com.iver.mdiApp.ui.MDIManager.View;
51
import com.iver.mdiApp.ui.MDIManager.ViewInfo;
52

    
53

    
54
/**
55
 * DOCUMENT ME!
56
 *
57
 * @author Administrador To change the template for this generated type comment
58
 *         go to Window>Preferences>Java>Code Generation>Code and Comments
59
 */
60
public final class FLegendManagerWindow extends JPanel implements View, FileExtension {
61
        private NewMapControl m_MapControl;
62
        private FLyrVect m_Lyr;
63
    private TOC m_Toc;
64
    private FRenderer m_Renderer; // Le asignaremos la leyenda del primer tema activo.
65
    private JTabbedPane organizador = new JTabbedPane();
66
    private FPanelLegendDefault m_defaultLegendPanel;
67
    private FPanelLegendValues m_valuesLegendPanel;
68
    private FPanelLegendBreaks m_breaksLegendPanel;
69
    private FPanelLegendLabels m_labelsLegendPanel;
70
    private JButton btnApply;
71
    private JButton btnCancelar;
72

    
73
    // private FRenderer m_Renderer;
74
    // private TOC toc;
75
    // private FSymbolTable m_panelTable = new FSymbolTable();
76
    // Variables declaration - do not modify
77
    // private javax.swing.JSplitPane jSplitPane1;
78
    private JPanel m_panelBotones = new JPanel();
79
    private ComandosListener m_actionListener = new ComandosListener(this);
80
    private ViewInfo m_viewinfo=null;
81
    /**
82
     * Creates new form JPanel
83
     */
84
    public FLegendManagerWindow() {
85
        initComponents();
86
                // this.setLayout(null);
87
                this.setSize(500, 360);
88
                this.setPreferredSize(new java.awt.Dimension(500,360));
89
        
90
    }
91

    
92
    /**
93
     * This method is called from within the constructor to initialize the
94
     * form. WARNING: Do NOT modify this code. The content of this method is
95
     * always regenerated by the Form Editor.
96
     */
97
    private void initComponents() {
98
     /*   addWindowListener(new java.awt.event.WindowAdapter() {
99
                public void windowClosing(java.awt.event.WindowEvent evt) {
100
                    closeDialog(evt);
101
                }
102
            });
103
*/
104
        //Createmos los paneles. 
105
        m_defaultLegendPanel = new FPanelLegendDefault();
106
        m_valuesLegendPanel = new FPanelLegendValues();
107
        m_breaksLegendPanel = new FPanelLegendBreaks();
108
        m_labelsLegendPanel = new FPanelLegendLabels(this);
109

    
110
        //Add the scroll panes to a split pane.
111
        organizador.addTab(Utilities.getMessage(this,"Simbolo_unico"), m_defaultLegendPanel);
112
        organizador.addTab(Utilities.getMessage(this,"Valores_unicos"), m_valuesLegendPanel);
113
        organizador.addTab(Utilities.getMessage(this,"Intervalos"), m_breaksLegendPanel);
114
        organizador.addTab(Utilities.getMessage(this,"Etiquetado"), m_labelsLegendPanel);
115

    
116
        /* JScrollPane tableView = new JScrollPane(m_grid);
117
           // tableView.setBackground(java.awt.Color.WHITE);
118
           jSplitPane1.setRightComponent(tableView);
119
         */
120
        java.awt.Dimension minimumSize = new java.awt.Dimension(100, 50);
121

    
122
        // m_grid.setMinimumSize(minimumSize);
123
        // treeView.setMinimumSize(minimumSize);
124
        // splitPane.setDividerLocation(100); //XXX: ignored in some releases
125
        //of Swing. bug 4101306
126
        //workaround for bug 4101306:
127
        //treeView.setPreferredSize(new Dimension(100, 100)); 
128
        // jSplitPane1.setPreferredSize(new java.awt.Dimension(300, 200));
129
        JPanel panelButtons = new JPanel();
130
        JButton btnAceptar = new JButton(Utilities.getMessage(this,"Aceptar"));
131
        btnAceptar.setActionCommand("OK");
132
        btnAceptar.addActionListener(m_actionListener);
133

    
134
        btnApply = new JButton(Utilities.getMessage(this,"Aplicar"));
135
        btnApply.setActionCommand("APPLY");
136
        btnApply.addActionListener(m_actionListener);
137

    
138
        // BOTONES PARA GUARDAR Y CARGAR LEYENDAS
139
        JButton btnSaveLegend = new JButton(Utilities.getMessage(this,"Guardar_leyenda")+"...");
140
        btnSaveLegend.setActionCommand("SAVE_LEGEND");
141
        btnSaveLegend.addActionListener(m_actionListener);
142

    
143
        JButton btnLoadLegend = new JButton(Utilities.getMessage(this,"Recuperar_leyenda")+"...");
144
        btnLoadLegend.setActionCommand("LOAD_LEGEND");
145
        btnLoadLegend.addActionListener(m_actionListener);
146

    
147
        ///////////////////////////////////////////////////////
148
        btnCancelar = new JButton(Utilities.getMessage(this,"Cerrar"));
149
        btnCancelar.setActionCommand("CANCEL");
150
        btnCancelar.addActionListener(m_actionListener);
151

    
152
        panelButtons.add(btnAceptar);
153
        panelButtons.add(btnApply);
154
        panelButtons.add(btnSaveLegend);
155
        panelButtons.add(btnLoadLegend);
156
        panelButtons.add(btnCancelar);
157
        setLayout(new BorderLayout());
158
        add(organizador, java.awt.BorderLayout.NORTH);
159
        add(panelButtons, java.awt.BorderLayout.SOUTH);
160

    
161
        //pack();
162
    }
163

    
164
  
165

    
166
    /**
167
     * En esta funci?n se coge el primer tema activo del TOC y se usa su
168
     * renderer para inicializar. Hay que llamarla SIEMPRE que se abra el
169
     * cuadro de di?logo, en el  openLegendManager() de la vista.
170
     *
171
     * @param associatedToc TOC que abre este cuadro de di?logo.
172
     */
173
    public void setToc(TOC associatedToc) {
174
        m_Toc = associatedToc;
175

    
176
        // Comprobar en openLegendManager que hay alg?n tema activo!
177
        FLyrVect lyr = m_Toc.getFirstLyrVectSelected();
178

    
179
        if (lyr == null) {
180
            System.out.println(Utilities.getMessage(this,"Por_favor_active_el_tema")+".");
181

    
182
            return;
183
        }
184

    
185
        m_Renderer = (FRenderer) lyr.getRenderer().cloneRenderer();
186
        actualizar();
187
    }
188
    
189
    /**
190
     * Esto solo lo usa el localizador para las leyendas
191
     * 
192
     * @param m
193
     * @param lyr
194
     */
195
    public void setMapControl(MapControl m, FLyrVect lyr)
196
    {
197
            m_MapControl = m;
198
            m_Lyr = lyr;
199
            m_Renderer = lyr.getRenderer().cloneRenderer();            
200
            m_Toc = null;
201
            
202
            actualizar();
203
    }
204

    
205
    /**
206
     * DOCUMENT ME!
207
     */
208
    private void actualizar() {
209
            // Avisar si no es Vectorial
210
            FLyrVect lyrSelected = null;
211
            if (m_Toc != null)            
212
                    lyrSelected = (FLyrVect) m_Toc.getFirstLyrVectSelected();
213
            else
214
                    lyrSelected = m_Lyr;
215
            
216
        m_defaultLegendPanel.setFSymbol(m_Renderer.getDefaultSymbol());
217
        m_valuesLegendPanel.setLayer(lyrSelected, m_Renderer);
218
        m_breaksLegendPanel.setLayer(lyrSelected, m_Renderer);
219
        m_labelsLegendPanel.setLayer(lyrSelected, m_Renderer);
220

    
221
        switch (m_Renderer.getLegendType()) {
222
        case FConstant.LEGEND_TYPE_DEFAULT:
223
            organizador.setSelectedIndex(0);
224

    
225
            break;
226

    
227
        case FConstant.LEGEND_TYPE_VALUE:
228
            organizador.setSelectedIndex(1);
229

    
230
            break;
231

    
232
        case FConstant.LEGEND_TYPE_BREAK:
233
            organizador.setSelectedIndex(2);
234

    
235
            break;
236
        }
237
    }
238

    
239
    /**
240
     * DOCUMENT ME!
241
     *
242
     * @param evt DOCUMENT ME!
243
     */
244
    private void btnApply_actionPerformed(ActionEvent evt) {
245
        FLyrVect lyr;
246
        ArrayList listSelLayers = new ArrayList();
247
        if (m_Toc == null)
248
        {
249
                listSelLayers.add(m_Lyr);
250
        }
251
        else
252
        {
253
                listSelLayers= m_Toc.getSelectedLayers();
254
        }
255

    
256
        switch (organizador.getSelectedIndex()) {
257
        case 0: // default symbol
258

    
259
            if (m_defaultLegendPanel.getFSymbol().m_symbolType == FConstant.SYMBOL_TYPE_POINT) {
260
                m_defaultLegendPanel.updateControls(); // Para que lo que haya en 
261
            }
262

    
263
            // ese momento en los controles pase al m_FSymbol
264
            m_Renderer.setLegendType(FConstant.LEGEND_TYPE_DEFAULT);
265
            m_Renderer.setDefaultSymbol(m_defaultLegendPanel.getFSymbol());
266

    
267
            break;
268

    
269
        case 1: // Unique Values
270
            m_Renderer.setLegendType(FConstant.LEGEND_TYPE_VALUE);
271
            m_valuesLegendPanel.fillSymbolListFromTable();
272

    
273
            break;
274

    
275
        case 2: // Breaks
276
            m_Renderer.setLegendType(FConstant.LEGEND_TYPE_BREAK);
277
            m_breaksLegendPanel.fillSymbolListFromTable();
278

    
279
            break;
280

    
281
        case 3: // Etiquetado                                
282
            m_labelsLegendPanel.updateValuesFromControls();
283
            if (m_Renderer.getLabelField() != null)
284
            {
285
                    for (int i = 0; i < listSelLayers.size(); i++) {
286
                        lyr = (FLyrVect) listSelLayers.get(i);
287
        
288
                        FRecordset rs = lyr.getRecordset();
289
                        int idFieldText = lyr.getFieldID(m_Renderer.getLabelField());
290
                        // int idFieldRotationText = lyr.getFieldID(m_Renderer.getLabelRotationField());
291
                        // int idFieldHeightText = lyr.getFieldID(m_Renderer.getLabelHeightField());
292
        
293
                        lyr.m_labels.clear();
294
                        for (int j = 0; j < lyr.m_NumShapes; j++) {
295
                            rs.moveTo(j);                            
296
                            FLabel theLabel = new FLabel(rs.getFieldValueAsString(idFieldText));
297
                            // Valor por defecto de las etiquetas
298
                            theLabel.setHeight(m_Renderer.getDefaultSymbol().m_FontSize);
299
                            
300
                            // Si el campo de heightfield est? definido, rellenamos el height del label
301
                            // con su valor
302
                            /* if (m_Renderer.getLabelHeightField() != null)
303
                                    theLabel.setHeight(rs.getFieldValueAsNumber(idFieldRotationText).doubleValue());
304
                            // idem para el de rotaci?n
305
                            if (m_Renderer.getLabelRotationField() != null)
306
                                    theLabel.setHeight(rs.getFieldValueAsNumber(idFieldHeightText).doubleValue()); */
307

    
308
                            lyr.m_labels.add(theLabel);
309
                        }
310
                    }
311
            }
312

    
313
            break;
314
        }
315

    
316
        for (int i = 0; i < listSelLayers.size(); i++) {
317
            if (listSelLayers.get(i) instanceof FLyrVect) {
318
                lyr = (FLyrVect) listSelLayers.get(i);
319

    
320
                if ((m_Renderer.getLegendType() == FConstant.LEGEND_TYPE_VALUE) ||
321
                        (m_Renderer.getLegendType() == FConstant.LEGEND_TYPE_BREAK)) {
322
                    int idField = lyr.getFieldID(m_Renderer.getFieldName());
323

    
324
                    if ((i == 0) &&
325
                            ((!m_valuesLegendPanel.m_bCacheDirty) ||
326
                            (!m_breaksLegendPanel.m_bCacheDirty))) // la primera capa la cogemos del arrayCache
327
                     {
328
                        if (m_Renderer.getLegendType() == FConstant.LEGEND_TYPE_VALUE) {
329
                            for (int j = 0; j < lyr.m_NumShapes; j++) {
330
                                lyr.m_legendValues[j] = m_valuesLegendPanel.m_keysCache[j];
331
                            }
332
                        } else {
333
                            for (int j = 0; j < lyr.m_NumShapes; j++) {
334
                                lyr.m_legendValues[j] = m_breaksLegendPanel.m_valuesCache[j];
335
                            }
336
                        }
337
                    } else {
338
                        FRecordset rs = lyr.getRecordset();
339
                        int fieldType = rs.getFieldType(idField);
340

    
341
                        for (int j = 0; j < lyr.m_NumShapes; j++) {
342
                            rs.moveTo(j);
343

    
344
                            /*switch (fieldType) {
345
                            case FRecordset.STRING: */
346
                                lyr.m_legendValues[j] = rs.getFieldValueAsString(idField);
347
                            /*
348
                                break;
349

350
                            case FRecordset.DECIMAL:
351
                            case FRecordset.INTEGER:
352
                                lyr.m_legendValues[j] = rs.getFieldValueAsNumber(idField);
353

354
                                break;
355
                            }*/
356
                        }
357
                    }
358
                }
359

    
360
                lyr.setRenderer(m_Renderer);
361
            }
362
             // if es vectorial
363
        }
364

    
365
        // closeDialog(null);
366
        if (m_Toc != null)
367
        {
368
                m_Toc.getView().repaintMap();
369
                m_Toc.refresh();
370
        }
371
        else
372
                m_MapControl.drawMap();
373
    }
374

    
375
    /* (non-Javadoc)
376
     * @see com.iver.mdiApp.FileListener#readFile(java.io.File)
377
     */
378
    public Object read(File file) {
379
                FRenderer ret = null;
380
        try {
381
            TransformerFactory transFact = TransformerFactory.newInstance();
382

    
383
            if (transFact.getFeature(SAXTransformerFactory.FEATURE)) {
384
                SAXTransformerFactory saxTransFact = (SAXTransformerFactory) transFact;
385

    
386
                XMLReader reader = XMLReaderFactory.createXMLReader();
387

    
388
                // attach the XSLT processor to the CSVXMLReader
389
                XMLEntityXMLHandler handler = new XMLEntityXMLHandler();
390
                reader.setContentHandler(handler);
391
                reader.parse(file.getPath());
392

    
393
                ret = FRenderer.createFRenderer(handler.getXMLEntity());
394
            } else {
395
                throw new SAXNotSupportedException("SAX no soportado");
396
            }
397
        } catch (Exception exc) {
398
                        App.instance.getNm().addError("Error leyendo la leyenda", exc);
399
        }
400
        
401
        return ret;
402
    }
403

    
404
    /* (non-Javadoc)
405
     * @see com.iver.mdiApp.FileListener#writeFile(java.io.File)
406
     */
407
    public void write(File file, Object object) {
408
            FRenderer renderer = (FRenderer) object;
409
        try {
410
            TransformerFactory transFact = TransformerFactory.newInstance();
411

    
412
            if (transFact.getFeature(SAXTransformerFactory.FEATURE)) {
413
                SAXTransformerFactory saxTransFact = (SAXTransformerFactory) transFact;
414
                TransformerHandler transHand = null;
415

    
416
                transHand = saxTransFact.newTransformerHandler();
417
                transHand.setResult(new StreamResult(file.getPath()));
418

    
419
                RendererReader reader = new RendererReader();
420

    
421
                // attach the XSLT processor to the CSVXMLReader
422
                reader.setContentHandler(transHand);
423
                reader.parse(renderer);
424
            } else {
425
                throw new SAXNotSupportedException("SAX no soportado");
426
            }
427
        } catch (Exception exc) {
428
                        App.instance.getNm().addError("Error escribiendo la leyenda", exc);
429
        }
430
    }
431

    
432
    /**
433
     * DOCUMENT ME!
434
     *
435
     * @author Fernando Gonz?lez Cort?s
436
     */
437
    private class ComandosListener implements ActionListener {
438
        private FLegendManagerWindow m_lg;
439

    
440
        /**
441
         * Creates a new ComandosListener object.
442
         *
443
         * @param lg DOCUMENT ME!
444
         */
445
        public ComandosListener(FLegendManagerWindow lg) {
446
            m_lg = lg;
447
        }
448

    
449
        /* (non-Javadoc)
450
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
451
         */
452
        public void actionPerformed(ActionEvent e) {
453
            if (e.getActionCommand() == "OK") {
454
                m_lg.btnApply_actionPerformed(e);
455
                    if (App.instance == null)
456
                            ((JDialog) (getParent().getParent().getParent().getParent())).dispose();
457
                    else                
458
                            App.instance.getMDIContext().closeView(FLegendManagerWindow.this);
459
                System.out.println("Ok del FLegendManager");
460
            } else if (e.getActionCommand() == "CANCEL") {
461
                    if (App.instance == null)
462
                            ((JDialog) (getParent().getParent().getParent().getParent())).dispose();
463
                    else
464
                            App.instance.getMDIContext().closeView(FLegendManagerWindow.this);
465
            } else if (e.getActionCommand() == "APPLY") {
466
                m_lg.btnApply_actionPerformed(e);
467
            } else if (e.getActionCommand() == "SAVE_LEGEND") {
468
                                m_lg.btnApply_actionPerformed(e);
469
                SelectedFile sf = App.instance.getMDIContext().showFileChooser(m_lg,
470
                    new String[] { "xml" },
471
                    new String[] {
472
                        Utilities.getMessage(this, "tipo_leyenda")
473
                    }, Utilities.getMessage(this, "guardar_leyenda"), true,
474
                    MDIApplicationContext.FILES_ONLY);
475
                if (sf != null){
476
                        try {
477
                                                sf.write(m_Renderer);
478
                                        } catch (Exception e1) {
479
                                                App.instance.getNm().addError("Error escribiendo la leyenda", e1);
480
                                        }
481
                }
482
            } else if (e.getActionCommand() == "LOAD_LEGEND") {
483
                                SelectedFile sf = App.instance.getMDIContext().showFileChooser(m_lg,
484
                                        new String[] { "xml" },
485
                                        new String[] {
486
                                                Utilities.getMessage(this, "tipo_leyenda")
487
                                        }, Utilities.getMessage(this, "cargar_leyenda"), false,
488
                                        MDIApplicationContext.FILES_ONLY);
489

    
490
                                if (sf != null){
491
                                        try {
492
                                                m_Renderer = (FRenderer) sf.read();
493
                                        } catch (Exception e1) {
494
                                                App.instance.getNm().addError("Error leyendo la leyenda", e1);
495
                                        }
496
                                        actualizar();
497
                                }
498
            }
499
        }
500
    }
501
        /* (non-Javadoc)
502
         * @see com.iver.mdiApp.ui.MDIManager.View#getViewInfo()
503
         */
504
        public ViewInfo getViewInfo() {
505
                if (m_viewinfo==null){
506
                        m_viewinfo=new ViewInfo();
507
                m_viewinfo.setWidth(500);
508
                m_viewinfo.setHeight(360);
509
                m_viewinfo.setFeatures(ViewInfo.MODALDIALOG);
510
                //vi.setResizable(false);
511
                m_viewinfo.setTitle(Utilities.getMessage(this,"Cambio_de_estilo"));
512
                }
513
                        return m_viewinfo;
514
                }
515

    
516
        /**
517
         * @see com.iver.mdiApp.ui.MDIManager.View#viewActivated()
518
         */
519
        public void viewActivated() {
520
        }
521

    
522
        
523
}