Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / grid / filter / convolution / ConvolutionUI.java @ 2443

History | View | Annotate | Download (11.1 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.impl.grid.filter.convolution;
23

    
24
import java.awt.BorderLayout;
25
import java.awt.Color;
26
import java.awt.GridLayout;
27
import java.awt.event.ActionEvent;
28
import java.awt.event.ActionListener;
29
import java.awt.event.FocusEvent;
30
import java.awt.event.FocusListener;
31
import java.text.NumberFormat;
32

    
33
import javax.swing.JButton;
34
import javax.swing.JComboBox;
35
import javax.swing.JFormattedTextField;
36
import javax.swing.JLabel;
37
import javax.swing.JPanel;
38
import javax.swing.JTextField;
39
import javax.swing.text.DefaultFormatterFactory;
40
import javax.swing.text.NumberFormatter;
41

    
42
import org.gvsig.fmap.dal.coverage.datastruct.Params;
43
import org.gvsig.fmap.dal.coverage.grid.FilterUIListener;
44
import org.gvsig.fmap.dal.coverage.grid.RegistrableFilterListener;
45
import org.gvsig.raster.impl.datastruct.Kernel;
46
import org.gvsig.raster.impl.grid.filter.DefaultRegistrableFilterListener;
47
import org.gvsig.raster.impl.store.ParamsImpl;
48

    
49
/**
50
 * Panel del filtro personalizado de convoluci?n. Consta de una matriz de cajas de texto
51
 * de 3x3 o de 5x5 seleccionable desde un combo.
52
 *
53
 * 28/09/2007
54
 * @author Nacho Brodin nachobrodin@gmail.com
55
 */
56
public class ConvolutionUI extends JPanel implements RegistrableFilterListener, ActionListener, FocusListener {
57

    
58
        private static final long    serialVersionUID             = 7102390746959243164L;
59
        private JTextField[][]       matrix                       = new JTextField[5][5];
60
        //Panel superior
61
        private JPanel               panelMatrixSelector          = null;
62
        private JPanel               panelMatrix                  = null;
63
        private JPanel               panelSelector                = null;
64
        //Panel inferior
65
        private JPanel               panelTest                    = null;
66
        private JComboBox            selector                     = null;
67
        private JButton              buttonTest                   = null;
68
        private JFormattedTextField  divisor                      = null;
69
        private double               lastValue                    = 0;
70
        private DefaultRegistrableFilterListener
71
                                 defaultRegistrableListener   = null;
72
        private Kernel               kernel                       = null;
73
        private Params               loadedParams                 = null; 
74
        
75
        /**
76
         * Constructor.
77
         */
78
        public ConvolutionUI(Kernel k) {
79
                init(k);
80
        }
81
        
82
        /**
83
         * Initialize this object
84
         * @param obj
85
         */
86
        public void init(Object obj) {
87
                if(!(obj instanceof Kernel) && obj != null )
88
                        return;
89
                this.kernel = (Kernel)obj;
90
                defaultRegistrableListener = new DefaultRegistrableFilterListener();
91
                getPanelMatrixSelector().setLayout(new BorderLayout());
92
                getPanelTest().setLayout(new BorderLayout());
93

    
94
                GridLayout gridLayout = new GridLayout(5, 5);
95
                getPanelMatrix().setLayout(gridLayout);
96
                gridLayout.setVgap(2);
97
                gridLayout.setHgap(2);
98

    
99
                for (int i = 0; i < matrix.length; i++) {
100
                        for (int j = 0; j < matrix[0].length; j++) {
101
                                if(kernel == null) { //Caso en que no se pase ning?n kernel. Se ponen todos a 0 y el del centro a 1.
102
                                        matrix[i][j] = new JTextField("0");
103
                                        if(i == Math.ceil(matrix.length / 2) && j == Math.ceil(matrix[0].length / 2))
104
                                                matrix[i][j].setText("1");
105
                                } else {
106
                                        if(kernel.kernel.length == 5) {
107
                                                String value = (kernel.kernel[i][j] == (int)kernel.kernel[i][j]) ? ((int)kernel.kernel[i][j]) + "" : kernel.kernel[i][j] + "";
108
                                                matrix[i][j] = new JTextField(value + "");
109
                                        } else {
110
                                                if(kernel.kernel.length == 3) {
111
                                                        if(i > 0 && j > 0 && i < 4 && j < 4) {
112
                                                                String value = (kernel.kernel[i - 1][j - 1] == (int)kernel.kernel[i - 1][j - 1]) ? ((int)kernel.kernel[i - 1][j - 1]) + "" : kernel.kernel[i - 1][j - 1] + "";
113
                                                                matrix[i][j] = new JTextField(value + "");
114
                                                        } else {
115
                                                                matrix[i][j] = new JTextField("0");
116
                                                                matrix[i][j].setVisible(false);
117
                                                        }
118
                                                }
119
                                        }
120
                                }
121
                                matrix[i][j].addFocusListener(this);
122
                                getPanelMatrix().add(matrix[i][j]);
123
                        }
124
                }
125

    
126
                getPanelSelector().add(new JLabel("Kernel: "));
127
                getPanelSelector().add(getSelector());
128
                getPanelSelector().add(new JLabel("Divisor: "));
129
                getPanelSelector().add(getDivisor());
130

    
131
                getPanelMatrixSelector().add(getPanelMatrix(), BorderLayout.NORTH);
132
                getPanelMatrixSelector().add(getPanelSelector(), BorderLayout.SOUTH);
133
                if(kernel != null && kernel.kernel.length == 3)
134
                        getSelector().setSelectedIndex(0);
135
                else if(kernel != null && kernel.kernel.length == 5)
136
                        getSelector().setSelectedIndex(1);
137

    
138
                getPanelTest().add(getButtonTest(), BorderLayout.SOUTH);
139

    
140
                this.setLayout(new BorderLayout());
141
                this.add(getPanelMatrixSelector(), BorderLayout.CENTER);
142
                this.add(getPanelTest(), BorderLayout.SOUTH);
143
        }
144
        
145
        /**
146
         * Obtiene el bot?n de test
147
         * @return JPanel
148
         */
149
        private JButton getButtonTest() {
150
                if(buttonTest == null) {
151
                        buttonTest = new JButton("Test");
152
                        buttonTest.addActionListener(this);
153
                }
154
                return buttonTest;
155
        }
156

    
157
        /**
158
         * Obtiene el panel con el bot?n de test
159
         * @return JPanel
160
         */
161
        private JPanel getPanelTest() {
162
                if(panelTest == null)
163
                        panelTest = new JPanel();
164
                return panelTest;
165
        }
166

    
167
        /**
168
         * Obtiene el panel de la matriz y el selector
169
         * @return JPanel
170
         */
171
        private JPanel getPanelMatrixSelector() {
172
                if(panelMatrixSelector == null)
173
                        panelMatrixSelector = new JPanel();
174
                return panelMatrixSelector;
175
        }
176

    
177
        /**
178
         * Obtiene el panel de la matriz
179
         * @return JPanel
180
         */
181
        private JPanel getPanelMatrix() {
182
                if(panelMatrix == null)
183
                        panelMatrix = new JPanel();
184
                return panelMatrix;
185
        }
186

    
187
        /**
188
         * Obtiene el panel que contiene el selector de lado
189
         * @return JPanel
190
         */
191
        private JPanel getPanelSelector() {
192
                if(panelSelector == null) {
193
                        panelSelector = new JPanel();
194
                }
195
                return panelSelector;
196
        }
197

    
198
        /**
199
         * Obtiene el selector de lado
200
         * @return JComboBox
201
         */
202
        private JComboBox getSelector() {
203
                if(selector == null) {
204
                        selector = new JComboBox(new String[]{"3", "5"});
205
                        selector.setSelectedIndex(1);
206
                        selector.addActionListener(this);
207
                }
208
                return selector;
209
        }
210

    
211
        /**
212
         * Obtiene el selector de lado
213
         * @return JComboBox
214
         */
215
        private JFormattedTextField getDivisor() {
216
                if(divisor == null) {
217
                        NumberFormat doubleDisplayFormat = NumberFormat.getNumberInstance();
218
                        doubleDisplayFormat.setMinimumFractionDigits(0);
219
                        NumberFormat doubleEditFormat = NumberFormat.getNumberInstance();
220
                        divisor = new JFormattedTextField(new DefaultFormatterFactory(
221
                                        new NumberFormatter(doubleDisplayFormat),
222
                                        new NumberFormatter(doubleDisplayFormat),
223
                                        new NumberFormatter(doubleEditFormat)));
224
                        divisor.setBackground(Color.white);
225
                        divisor.setValue(new Double(0));
226
                        divisor.setColumns(3);
227
                }
228
                return divisor;
229
        }
230

    
231
        /**
232
         * Convierte la matrix de JTextField en un objeto de tipo Kernel
233
         * @return Kernel
234
         */
235
        public Kernel getKernel() {
236
                double[][] values = null;
237
                if(((String)selector.getSelectedItem()).equals("3")) {
238
                        values = new double[matrix.length - 2][matrix[0].length - 2];
239
                        for (int i = 1; i < matrix.length - 1; i++)
240
                                for (int j = 1; j < matrix[0].length - 1; j++)
241
                                        values[i - 1][j - 1] = new Double(matrix[i][j].getText()).doubleValue();
242

    
243
                }
244
                if(((String)selector.getSelectedItem()).equals("5")) {
245
                        values = new double[matrix.length][matrix[0].length];
246
                        for (int i = 0; i < matrix.length; i++)
247
                                for (int j = 0; j < matrix[0].length; j++)
248
                                        values[i][j] = new Double(matrix[i][j].getText()).doubleValue();
249
                }
250
                double value = ((Number)divisor.getValue()).doubleValue();
251
                if(value != 0)
252
                        kernel = new Kernel(values, value);
253
                else
254
                        kernel = new Kernel(values);
255
                return kernel;
256
        }
257

    
258
        /**
259
         * Eventos lanzados por el bot?n de test y el combo de selecci?n de
260
         * lados del kernel.
261
         */
262
        public void actionPerformed(ActionEvent e) {
263
                if(e.getSource().equals(getSelector())) {
264
                        if(((String)selector.getSelectedItem()).equals("3")) {
265
                                for (int i = 0; i < matrix.length; i++) {
266
                                        for (int j = 0; j < matrix[0].length; j++) {
267
                                                if(i == 0 || i == (matrix.length - 1) || j == 0 || j == (matrix[0].length - 1))
268
                                                        matrix[i][j].setVisible(false);
269
                                                else
270
                                                        matrix[i][j].setVisible(true);
271
                                        }
272
                                }
273
                        }
274
                        if(((String)selector.getSelectedItem()).equals("5")) {
275
                                for (int i = 0; i < matrix.length; i++)
276
                                        for (int j = 0; j < matrix[0].length; j++)
277
                                                matrix[i][j].setVisible(true);
278
                        }
279
                }
280

    
281
                //Si es el bot?n de test cargamos el objeto Params y llamamos al listener.
282
                if(e.getSource().equals(getButtonTest())) {
283
                        callStateChanged();
284
                }
285
        }
286

    
287
        /**
288
         * Sobrecargamos el m?todo getParams para que siempre devuelva
289
         * algo.
290
         */
291
        public Params getParams() {
292
                Params params = null;
293
                if(loadedParams != null) {
294
                        params = loadedParams;
295
                        loadedParams = null;
296
                        return params;
297
                }
298
                
299
                params = new ParamsImpl();
300
                defaultRegistrableListener.setParams(params);
301
                
302
                int lado = 0;
303
                if(((String)selector.getSelectedItem()).equals("5"))
304
                        lado = 1;
305
                params.setParam("LadoVentana",
306
                                new Integer(lado),
307
                                Params.CHOICE,
308
                                new String[] {"3","5","7"});
309
                params.setParam("Kernel",
310
                                getKernel(),
311
                                Params.CHOICE,
312
                                null);
313
                params.setParam("FilterName",
314
                                "personalizado",
315
                                -1,
316
                                null);
317
                return params;
318
        }
319
        
320
        public void setParams(Params params) {
321
                this.loadedParams = params;
322
        }
323

    
324
        /**
325
         * Cuando un elemento de la matriz tiene el foco se salva el valor
326
         * que hay dentro.
327
         */
328
        public void focusGained(FocusEvent e) {
329
                if(e.getSource() instanceof JTextField) {
330
                        try {
331
                                lastValue = Double.parseDouble(((JTextField)e.getSource()).getText());
332
                        } catch (NumberFormatException ex) {
333
                                lastValue = 0;
334
                                ((JTextField)e.getSource()).setText("0");
335
                        }
336
                }
337
        }
338

    
339
        /**
340
         * Cuando un elemento de la matriz pierde el foco se comprueba
341
         * que el nuevo elemento sea double. Si no lo es se restaura el antiguo valor.
342
         */
343
        public void focusLost(FocusEvent e) {
344
                if(e.getSource() instanceof JTextField) {
345
                        try {
346
                                Double.parseDouble(((JTextField)e.getSource()).getText());
347
                        } catch (NumberFormatException ex) {
348
                                if(lastValue == (int)lastValue)
349
                                        ((JTextField)e.getSource()).setText(((int)lastValue) + "");
350
                                else
351
                                        ((JTextField)e.getSource()).setText(lastValue + "");
352
                        }
353
                }
354
        }
355

    
356
        public void addFilterUIListener(FilterUIListener listener) {
357
                defaultRegistrableListener.addFilterUIListener(listener);
358
        }
359

    
360
        public void callStateChanged() {
361
                defaultRegistrableListener.callStateChanged();
362
        }
363

    
364
        public void removeStateChangedListener(FilterUIListener listener) {
365
                defaultRegistrableListener.removeStateChangedListener(listener);
366
        }
367
}