Statistics
| Revision:

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

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.FConstant;
35
import com.iver.cit.gvsig.fmap.FLabel;
36
import com.iver.cit.gvsig.fmap.FLyrVect;
37
import com.iver.cit.gvsig.fmap.FRecordset;
38
import com.iver.cit.gvsig.fmap.FRenderer;
39
import com.iver.cit.gvsig.fmap.MapControl;
40
import com.iver.cit.gvsig.gui.Panels.FPanelLegendBreaks;
41
import com.iver.cit.gvsig.gui.Panels.FPanelLegendDefault;
42
import com.iver.cit.gvsig.gui.Panels.FPanelLegendLabels;
43
import com.iver.cit.gvsig.gui.Panels.FPanelLegendValues;
44
import com.iver.cit.gvsig.project.RendererReader;
45
import com.iver.cit.gvsig.project.XMLEntityXMLHandler;
46
import com.iver.mdiApp.App;
47
import com.iver.mdiApp.Utilities;
48
import com.iver.mdiApp.plugins.files.FileExtension;
49
import com.iver.mdiApp.plugins.files.SelectedFile;
50
import com.iver.mdiApp.ui.MDIApplicationContext;
51
import com.iver.mdiApp.ui.MDIManager.View;
52
import com.iver.mdiApp.ui.MDIManager.ViewInfo;
53

    
54

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

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

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

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

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

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

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

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

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

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

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

    
162
        //pack();
163
    }
164

    
165
  
166

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

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

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

    
183
            return;
184
        }
185

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

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

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

    
226
            break;
227

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

    
231
            break;
232

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

    
236
            break;
237
        }
238
    }
239

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

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

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

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

    
268
            break;
269

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

    
274
            break;
275

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

    
280
            break;
281

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

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

    
314
            break;
315
        }
316

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

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

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

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

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

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

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

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

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

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

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

    
387
                XMLReader reader = XMLReaderFactory.createXMLReader();
388

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

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

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

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

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

    
420
                RendererReader reader = new RendererReader();
421

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

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

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

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

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

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

    
523
        
524
}