Statistics
| Revision:

root / trunk / libraries / libCq_CMS_praster / src / org / cresques / ui / raster / listener / PalettePanelListener.java @ 8026

History | View | Annotate | Download (12.1 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
package org.cresques.ui.raster.listener;
20

    
21
import java.awt.Color;
22
import java.awt.event.ActionEvent;
23
import java.awt.event.ActionListener;
24
import java.awt.event.KeyEvent;
25
import java.awt.event.KeyListener;
26
import java.io.BufferedReader;
27
import java.io.BufferedWriter;
28
import java.io.File;
29
import java.io.FileInputStream;
30
import java.io.FileNotFoundException;
31
import java.io.FileReader;
32
import java.io.FileWriter;
33
import java.io.IOException;
34
import java.io.Reader;
35
import java.io.StringWriter;
36
import java.io.Writer;
37
import java.util.ArrayList;
38

    
39
import javax.swing.JButton;
40
import javax.swing.JColorChooser;
41

    
42
import org.cresques.ui.raster.NameChooserDialog;
43
import org.cresques.ui.raster.PalettePanel;
44
import org.gvsig.gui.beans.table.TableControlerPanel;
45
import org.gvsig.gui.beans.table.exceptions.NotInitializeException;
46
import org.kxml2.io.KXmlParser;
47
import org.kxml2.io.KXmlSerializer;
48
import org.xmlpull.v1.XmlPullParserException;
49

    
50
/**
51
 * Listener para eventos del panel de paleta
52
 * @author Nacho Brodin <brodin_ign@gva.es>
53
 *
54
 */
55
public class PalettePanelListener implements KeyListener, ActionListener{
56

    
57
        private PalettePanel                        panel = null;        
58
        public static boolean                         comboEventEnable = true;
59
        private TableControlerPanel                control = null;
60
        private JColorChooser                        colorSelector = null;;
61
        private NameChooserDialog                 nameChooser;
62
        private String                                        savePaletteName;
63
                
64
        /**
65
         * Constructor 
66
         * @param p Panel 
67
         */
68
        public PalettePanelListener(PalettePanel p){
69
                panel = p;
70
        }
71
        
72
        /**
73
         * Asigna a los controles que el listener por defecto sea esta clase.
74
         * El panel tendr? que llamar a este m?todo explicitamente si quiere que  
75
         * los listener sean asignados.
76
         */
77
        public void setControlListeners(){
78
                control = panel.getPTable().getControl();
79
                
80
                panel.getBSave().addActionListener(this);
81
                panel.getBAccept().addActionListener(this);
82
                panel.getBApply().addActionListener(this);
83
                panel.getBCancel().addActionListener(this);
84
                panel.getCActive().addActionListener(this);
85
                panel.getCbInterpolar().addActionListener(this);
86
                panel.getCbList().addActionListener(this);
87

    
88
                control.getBNew().addActionListener(this);
89
                control.getBDelPoint().addActionListener(this);
90
                control.getBClear().addActionListener(this);
91
                panel.getPTable().setEnableControlsListener(false);
92
                
93
                /*panel.getPTable().addKeyListener(this);
94
                panel.getBAccept().addKeyListener(this);
95
                panel.getBApply().addKeyListener(this);
96
                panel.getBCancel().addKeyListener(this);
97
                panel.getCActive().addKeyListener(this);
98
                panel.getCbInterpolar().addKeyListener(this);
99
                panel.getCbList().addKeyListener(this);*/
100
        }
101
        
102
        /**
103
         * Controlamos las acciones de:
104
         * <UL>
105
         * <LI>Nueva fila: Asigna un nuevo bot?n con su listener para que pueda se controlado desde esta misma clase</LI>
106
         * <LI>Lista de botones: Para cada bot?n de la tabla asignamos el listener que hace que se muestre el 
107
         * dialogo de color. El valor retornado por este se pondra en la columna RGB y el bot?n se colorear?</LI>
108
         * </UL>
109
         * @throws NotInitializeException 
110
         */
111
        public void actionPerformed(ActionEvent e) {
112
                
113
                //Bot?n de salvar tabla
114
                if(e.getSource() == panel.getBSave()){
115
                        if (nameChooser == null)
116
                                nameChooser = new NameChooserDialog(panel, this);
117
                        else
118
                                nameChooser.init();
119
                }
120
                
121
                //Bot?n de nueva fila
122
                if(e.getSource() == control.getBNew())
123
                        try {
124
                                panel.addRowToTable(Color.WHITE, "C" + panel.getPTable().getRowCount(), "0", "255");
125
                        } catch (NotInitializeException e1) {
126
                                panel.addRowToTable(Color.WHITE, "C0" , "0", "255");
127
                        }
128
                
129
                
130
                //Bot?n eliminar fila
131
                if(e.getSource() == control.getBDelPoint())
132
                        panel.deleteSelectedRow();
133
                                
134
                //Bot?n eliminar todas las filas
135
                if(e.getSource() == control.getBClear())
136
                        panel.deleteAllRows();
137
                
138
                
139
                //Comobo elegir paleta predeterminada.
140
                if(e.getSource() == panel.getCbList()){
141
                        if (panel.getCbList().getSelectedItem()!=null){
142
                                loadPalette(panel.getPalettesPath(), panel.getCbList().getSelectedItem().toString());
143
                                panel.orderRows();
144
                        }
145
                }
146
                                
147
                //Check de activo
148
                if(e.getSource() == panel.getCActive()){
149
                        if(panel.getCActive().isSelected())
150
                                panel.setEnabled(true);
151
                        else
152
                                panel.setEnabled(false);
153
                }
154
                
155
        }
156

    
157
        
158
        
159
        public void keyPressed(KeyEvent e) {
160
                /*if(e.getKeyCode() == 10){//Enter=Aceptar
161
                                                
162
                }
163
                
164
                if(e.getKeyCode() == 27){ //Escape=Cancelar
165
                        
166
                }*/
167
        }
168

    
169
        public void keyReleased(KeyEvent e) {
170
                // TODO Auto-generated method stub
171
                
172
        }
173

    
174
        public void keyTyped(KeyEvent e) {
175
                // TODO Auto-generated method stub
176
                
177
        }
178
        
179
        
180
        /**
181
         * Lee una paleta del fichero xml de paletas y la carga en la tabla del panel.
182
         * 
183
         *  @param palettesPath Camino al fichero de paletas predefinidas.
184
         *  @param paletteName Nombre de paleta a cargar desde el fichero xml.
185
         * 
186
         */
187
        public void loadPalette(String palettesPath, String paletteName){
188
                
189
                File palettesFile = new File(palettesPath);
190
                if(!palettesFile.exists())
191
                        return;
192
                
193
                try {
194
                        KXmlParser parser = new KXmlParser();
195
                        FileInputStream fileInputStream = new FileInputStream(palettesPath);
196
                        parser.setInput(fileInputStream, null);
197
                        int tag = parser.nextTag();
198
                        
199
                        parser.require(KXmlParser.START_TAG, null, "palettes");
200
                        tag = parser.nextTag();
201
                        parser.require(KXmlParser.START_TAG, null, "palette_list");
202
                        parser.skipSubTree();
203
                        parser.require(KXmlParser.END_TAG, null, "palette_list");
204
                        tag = parser.nextTag();
205
                        
206
                        while (tag == KXmlParser.START_TAG){
207
                                parser.require(KXmlParser.START_TAG, null, "palette");
208
                                if(parser.getAttributeCount()==2) 
209
                                        if (parser.getAttributeValue(0).equals(paletteName)){        
210
                                                boolean interpolate = Boolean.valueOf(parser.getAttributeValue(1)).booleanValue();
211
                                                tag = parser.nextTag();
212
                                                parser.require(KXmlParser.START_TAG, null, "table");
213
                                                tag = parser.nextTag();
214
                                                try {
215
                                                        panel.getPTable().removeAllRows();
216
                                                } catch (NotInitializeException e1) {
217
                                                        e1.printStackTrace();
218
                                                }
219
                                                
220
                                                ArrayList rows = new ArrayList();
221
                                                
222
                                                while(tag == KXmlParser.START_TAG){
223
                                                        parser.require(KXmlParser.START_TAG, null, "entry");
224
                                                        if (parser.getAttributeCount()==3){
225
                                                                
226
                                                                String rgb = parser.getAttributeValue(1).substring(parser.getAttributeValue(1).indexOf(",")+1,
227
                                                                                parser.getAttributeValue(1).length());
228
                                                                
229
                                                                int a = Integer.valueOf(parser.getAttributeValue(1).substring(0,parser.getAttributeValue(1).indexOf(","))).intValue();
230
                                                                int r= Integer.valueOf(rgb.substring(0,rgb.indexOf(","))).intValue();
231
                                                                int g=Integer.valueOf(rgb.substring(rgb.indexOf(",")+1,rgb.lastIndexOf(","))).intValue();
232
                                                                int b=Integer.valueOf(rgb.substring(rgb.lastIndexOf(",")+1,rgb.length())).intValue();
233
                                                
234
                                                                //No a?ado filas a la tabla hasta que no se ha leido correctamente la paleta completa:
235
                                                                Object row[] = {new Color(r,g,b), parser.getAttributeValue(0), parser.getAttributeValue(2), String.valueOf(a)};
236
                                                                rows.add(row);
237
                                                        }
238
                                                        tag = parser.nextTag();
239
                                                        parser.require(KXmlParser.END_TAG, null, "entry");
240
                                                        tag = parser.nextTag();
241
                                                }
242
                                                parser.require(KXmlParser.END_TAG, null, "table");
243
                                                
244
                                                // Rellenar la tabla con las entradas leidas:
245
                                                for (int i=0;i<rows.size();i++)
246
                                                        panel.addRowToTable((Color)((Object[])rows.get(i))[0], (String)((Object[])rows.get(i))[1], 
247
                                                                        (String)((Object[])rows.get(i))[2], (String)((Object[])rows.get(i))[3]);
248
                                                panel.getCbInterpolar().setSelected(interpolate);
249
                                                fileInputStream.close();
250
                                                return;
251
                                }
252
                                parser.skipSubTree();
253
                                parser.require(KXmlParser.END_TAG, null, "palette");
254
                                tag = parser.nextTag();
255
                        }
256
                                        
257
                        parser.require(KXmlParser.END_TAG, null, "palettes");
258
                        panel.deleteAllRows();
259
                        fileInputStream.close();
260
                        return;
261
                        
262
                }catch (FileNotFoundException fnfEx) {
263
                        fnfEx.printStackTrace();
264
                }catch (XmlPullParserException xmlEx) {
265
                        System.out.println("El fichero de paletas predeterminadas no tiene la estructura correcta:\n        " + xmlEx.getMessage());
266
                }catch (IOException e) {
267
                }
268
        }
269

    
270
        /**
271
         * Salva la paleta que hay en la tabla al fichero xml de paletas conel nombre especificado.
272
         * 
273
         *  @param palettesPath Camino al fichero de paletas predefinidas.
274
         *  @param paletteName Nombre de paleta a cargar desde el fichero xml.
275
         * 
276
         */
277
        public void savePalette(String palettesPath, String paletteName){
278
                
279
                File tmp = new File(palettesPath.substring(0,palettesPath.lastIndexOf(File.separator)+1)+"palettes.tmp");
280
                File palettes = new File(palettesPath);
281
                
282
                try {
283
                        if (!tmp.exists())
284
                                tmp.createNewFile();
285
                        
286
                        Reader reader = new FileReader(palettesPath);
287
                        BufferedReader bReader = new BufferedReader(reader);
288
                        
289
                        Writer writer = new FileWriter(palettesPath.substring(0,palettesPath.lastIndexOf(File.separator)+1)+"palettes.tmp");
290
                        BufferedWriter bWriter = new BufferedWriter(writer);
291
                        
292
                        String line = bReader.readLine();
293
                        while (line != null){
294
                                
295
                                if (line.indexOf("</palette_list>")>=0){
296
                                        bWriter.write("\t\t<name>"+paletteName+"</name>");
297
                                        bWriter.newLine();
298
                                }else if (line.indexOf("</palettes>")>=0){
299
                                        bWriter.newLine();
300
                                        bWriter.write(createXmlStringFromTable(paletteName));
301
                                        bWriter.newLine();
302
                                }
303
                                        
304
                                bWriter.write(line);
305
                                bWriter.newLine();
306
                                
307
                                line = bReader.readLine();
308
                        }
309
                        
310
                        bReader.close();
311
                        bWriter.close();
312
                
313
                        palettes.delete();
314
                        tmp.renameTo(palettes);
315
                } catch (FileNotFoundException e) {
316
                        // TODO Auto-generated catch block
317
                        e.printStackTrace();
318
                }catch (IOException e) {
319
                        // TODO Auto-generated catch block
320
                        e.printStackTrace();
321
                }
322
        }
323
        
324
        /**
325
         * Crea un String con el bloque XML correspondiente a la paleta que hay en la tabla.
326
         * 
327
         *  @param palettesPath Camino al fichero de paletas predefinidas.
328
         *  @param paletteName Nombre de paleta a cargar desde el fichero xml.
329
         * 
330
         */
331
        private String createXmlStringFromTable(String paletteName){
332
                Writer writer = new  StringWriter();
333
                try {
334
                        KXmlSerializer serializer = new KXmlSerializer();
335
                        serializer.setOutput(writer);
336
                        
337
                        serializer.text("\t");
338
                        serializer.startTag(null,"palette").attribute(null,"name",paletteName).attribute(null,"interpolate",
339
                                        Boolean.toString(panel.getCbInterpolar().isSelected()));
340
                        serializer.text("\n");
341
                        serializer.text("\t\t");
342
                        serializer.startTag(null,"table");
343
                        serializer.text("\n");
344
                        
345
                        
346
                        for (int row = 0; row<panel.getPTable().getRowCount();row++){
347
                                
348
                                String name = (String)panel.getPTable().getModel().getValueAt(row,1);
349
                                String value = (String)panel.getPTable().getModel().getValueAt(row,3);
350
                                String rgb = (String)panel.getPTable().getModel().getValueAt(row,2);
351
                                String argb = (String)panel.getPTable().getModel().getValueAt(row,4) + "," + rgb;
352
                                
353
                                serializer.text("\t\t\t");
354
                                serializer.startTag(null,"entry").attribute(null,"class",name);
355
                                serializer.attribute(null,"argb",argb);
356
                                serializer.attribute(null,"value",value).endTag(null,"entry");
357
                                serializer.text("\n");
358
                        }
359
                                
360
                        serializer.text("\t\t");
361
                        serializer.endTag(null,"table");
362
                        serializer.text("\n");
363
                        serializer.text("\t");
364
                        serializer.endTag(null,"palette");
365
                        
366
                }catch (FileNotFoundException fnfEx) {
367
                        fnfEx.printStackTrace();
368
                }catch (IOException e) {
369
                }catch (NotInitializeException e) {
370
                        // TODO Auto-generated catch block
371
                        e.printStackTrace();
372
                } 
373
                
374
                return writer.toString();
375
        }
376

    
377
        public String getSavePaletteName() {
378
                return savePaletteName;
379
        }
380

    
381
        public void setSavePaletteName(String savePaletteName) {
382
                this.savePaletteName = savePaletteName;
383
        }
384
}