Statistics
| Revision:

gvsig-3d / org.gvsig.netcdf3d / trunk / org.gvsig.netcdf3d / org.gvsig.netcdf3d.swing / org.gvsig.netcdf3d.swing.impl / src / main / java / org / gvsig / netcdf3d / swing / impl / JNetCDFLoaderParametersController.java @ 727

History | View | Annotate | Download (12.6 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2016 gvSIG Association
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., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.netcdf3d.swing.impl;
24

    
25
import java.awt.BorderLayout;
26
import java.awt.event.ActionEvent;
27
import java.awt.event.ActionListener;
28
import java.util.Calendar;
29
import java.util.Date;
30
import java.util.List;
31

    
32
import javax.swing.JComponent;
33
import javax.swing.JOptionPane;
34

    
35
import org.gvsig.fmap.dal.exception.DataException;
36
import org.gvsig.fmap.dal.raster.api.BandAttributeDescriptor;
37
import org.gvsig.fmap.dal.raster.api.BandDescriptor;
38
import org.gvsig.fmap.dal.raster.api.RasterStore;
39
import org.gvsig.fmap.mapcontext.layers.FLayer;
40
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer;
41
import org.gvsig.netcdf3d.lib.api.NetCDFLoaderParameters;
42
import org.gvsig.netcdf3d.swing.api.JNetCDFLoaderParameters;
43
import org.gvsig.raster.lib.buffer.api.BandInfo;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.dataTypes.CoercionException;
46
import org.gvsig.tools.dataTypes.DataTypes;
47
import org.gvsig.tools.dataTypes.DataTypesManager;
48
import org.gvsig.tools.i18n.I18nManager;
49
import org.gvsig.tools.locator.LocatorException;
50
import org.gvsig.tools.swing.api.ToolsSwingLocator;
51
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
52
import org.gvsig.view3d.lib.api.exception.FactoryNotRegisteredException;
53
import org.gvsig.view3d.lib.api.loader.LoaderParameters;
54
import org.gvsig.view3d.lib.api.loader.RasterLoaderParameters;
55
import org.gvsig.view3d.swing.api.View3DSwingLocator;
56
import org.gvsig.view3d.swing.api.exception.InvalidLoaderParametersException;
57
import org.gvsig.view3d.swing.api.exception.JLoaderParameterCreationException;
58
import org.gvsig.view3d.swing.api.loader.JLoaderParameters;
59
import org.gvsig.view3d.swing.api.loader.JLoaderParametersFactory;
60
import org.slf4j.Logger;
61
import org.slf4j.LoggerFactory;
62

    
63
/**
64
 *
65
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
66
 *
67
 */
68
public class JNetCDFLoaderParametersController extends JNetCDFLoaderParametersView implements
69
    JNetCDFLoaderParameters {
70

    
71
    private static final Logger LOG = LoggerFactory
72
        .getLogger(JNetCDFLoaderParametersController.class);
73

    
74
    private static final long serialVersionUID = 5836627499994023353L;
75

    
76
    private JLoaderParameters jRasterLoaderParameters;
77

    
78
    private NetCDFLoaderParameters parameters;
79

    
80
    /**
81
     *
82
     * @param parameters
83
     */
84
    public JNetCDFLoaderParametersController(LoaderParameters parameters) {
85

    
86
        if (!(parameters instanceof NetCDFLoaderParameters)) {
87
            throw new IllegalArgumentException(
88
                "The type of parameters has to be NetCDFLoaderParameters");
89
        }
90

    
91
        this.parameters = (NetCDFLoaderParameters) parameters;
92

    
93
        translate();
94
        initComponents();
95
    }
96

    
97
    @SuppressWarnings("unchecked")
98
    private void initComponents() {
99

    
100
        // Initialize raster loader parameters
101
        try {
102
            JLoaderParametersFactory jLoaderParameterFactory =
103
                View3DSwingLocator.getManager().getJLoaderParameterFactory(
104
                    RasterLoaderParameters.NAME);
105
            jRasterLoaderParameters =
106
                jLoaderParameterFactory.createJLoaderParameters(this.parameters);
107
        } catch (FactoryNotRegisteredException | JLoaderParameterCreationException e) {
108
            ThreadSafeDialogsManager dialogsManager =
109
                ToolsSwingLocator.getThreadSafeDialogsManager();
110
            dialogsManager.messageDialog("error_initializing_netcdf_loader_parameters", "_error",
111
                JOptionPane.ERROR_MESSAGE);
112
            return;
113
        }
114

    
115
        this.rasterLoaderParameters.setLayout(new BorderLayout());
116
        this.rasterLoaderParameters
117
            .add(jRasterLoaderParameters.asJComponent(), BorderLayout.CENTER);
118

    
119
        // Set NetCDF combobox render
120
        this.variables.setRenderer(new NetCDFLevelComboBoxRenderer());
121
        this.initialTimes.setRenderer(new NetCDFTimeComboBoxRenderer());
122
        this.finalTimes.setRenderer(new NetCDFTimeComboBoxRenderer());
123

    
124
        // Fill NetCDF variables
125
        try {
126
            fillVariables();
127
        } catch (DataException e) {
128
            ThreadSafeDialogsManager dialogsManager =
129
                ToolsSwingLocator.getThreadSafeDialogsManager();
130
            dialogsManager.messageDialog("error_initializing_netcdf_loader_parameters", "_error",
131
                JOptionPane.ERROR_MESSAGE);
132
            return;
133
        }
134

    
135
        // Fill lapse time
136
        this.lapse.setText(String.valueOf(this.parameters.getLapse()));
137

    
138
        // Add action listener to fill levels and times when a variable is
139
        // selected
140
        this.variables.addActionListener(new ActionListener() {
141

    
142
            @Override
143
            public void actionPerformed(ActionEvent e) {
144
                doSelectedVariable();
145
            }
146
        });
147

    
148
        // Fire selected item events
149
        this.variables.setSelectedIndex(0);
150
    }
151

    
152
    @SuppressWarnings("unchecked")
153
    private void fillVariables() throws DataException {
154
        FLayer layer = this.parameters.getLayer();
155
        if (layer instanceof RasterLayer) {
156
            RasterLayer rasterLayer = (RasterLayer) layer;
157
            RasterStore rasterStore = rasterLayer.getRasterStore();
158
            int bands = rasterStore.getBands();
159
            for (int i = 0; i < bands; i++) {
160
                BandInfo bandInfo = rasterStore.getBandInfo(i);
161
                this.variables.addItem(bandInfo);
162
            }
163
        }
164
    }
165

    
166
    protected void doSelectedVariable() {
167
        FLayer layer = this.parameters.getLayer();
168
        RasterLayer rasterLayer = null;
169
        if (layer instanceof RasterLayer) {
170

    
171
            rasterLayer = (RasterLayer) layer;
172
            RasterStore rasterStore = rasterLayer.getRasterStore();
173
            BandInfo bandInfo = (BandInfo) this.variables.getSelectedItem();
174
            int band = bandInfo.getBand();
175
            BandDescriptor bandDescriptor = rasterStore.getBandDescriptor(band);
176

    
177
            // If band does not have band descriptors remove all levels and
178
            // times.
179
            if (bandDescriptor.size() == 0) {
180

    
181
                setEnableLevels(false);
182
                levels.removeAllItems();
183

    
184
                setEnableTime(false);
185
                initialTimes.removeAllItems();
186
                finalTimes.removeAllItems();
187

    
188
            } else if (bandDescriptor.size() == 1) {
189
                BandAttributeDescriptor bandAttributeDescriptor = bandDescriptor.iterator().next();
190
                List<Object> values = bandAttributeDescriptor.getValues();
191
                if (bandAttributeDescriptor.getName().equals("level")) {
192

    
193
                    setEnableTime(false);
194
                    initialTimes.removeAllItems();
195
                    finalTimes.removeAllItems();
196
                    fillLevels(values);
197
                    unitText.setText(bandAttributeDescriptor.getUnits());
198

    
199

    
200
                } else if (bandAttributeDescriptor.getName().equals("time")) {
201
                    setEnableLevels(false);
202
                    levels.removeAllItems();
203

    
204
                    fillTimes(values);
205
                }
206
            } else {
207
                for (BandAttributeDescriptor bandAttributeDescriptor : bandDescriptor) {
208
                    List<Object> values = bandAttributeDescriptor.getValues();
209
                    if (bandAttributeDescriptor.getName().equals("level")) {
210
                        fillLevels(values);
211
                        unitText.setText(bandAttributeDescriptor.getUnits());
212

    
213
                    } else if (bandAttributeDescriptor.getName().equals("time")) {
214
                        fillTimes(values);
215
                    }
216
                }
217
            }
218
        }
219
    }
220

    
221
    @SuppressWarnings("unchecked")
222
    private void fillLevels(List<Object> values) {
223
        setEnableLevels(true);
224
        levels.removeAllItems();
225
        for (Object value : values) {
226
            levels.addItem(value);
227
        }
228
    }
229

    
230
    @SuppressWarnings("unchecked")
231
    private void fillTimes(List<Object> values) {
232
        setEnableTime(true);
233
        initialTimes.removeAllItems();
234
        finalTimes.removeAllItems();
235

    
236
        for (Object value : values) {
237
            initialTimes.addItem(value);
238
            finalTimes.addItem(value);
239
        }
240
        finalTimes.setSelectedIndex(values.size()-1);
241
    }
242

    
243
    private void setEnableTime(boolean enable) {
244
        initialTimes.setEnabled(enable);
245
        initialTimeText.setEnabled(enable);
246
        finalTimeText.setEnabled(enable);
247
        finalTimes.setEnabled(enable);
248
    }
249

    
250
    private void setEnableLevels(boolean enable) {
251
        levelText.setEnabled(enable);
252
        levels.setEnabled(enable);
253
        if(!enable){
254
            unitText.setText("");
255
        }
256
    }
257

    
258
    private void translate() {
259

    
260
        I18nManager i18nManager = ToolsLocator.getI18nManager();
261
        variableText.setText(i18nManager.getTranslation(variableText.getText()));
262
        levelText.setText(i18nManager.getTranslation(levelText.getText()));
263
        initialTimeText.setText(i18nManager.getTranslation(initialTimeText.getText()));
264
        finalTimeText.setText(i18nManager.getTranslation(finalTimeText.getText()));
265
        lapseText.setText(i18nManager.getTranslation(lapseText.getText()));
266
    }
267

    
268
    @Override
269
    public LoaderParameters getLoaderParameters() throws InvalidLoaderParametersException {
270

    
271
        NetCDFLoaderParameters loaderParameters =
272
            (NetCDFLoaderParameters) jRasterLoaderParameters.getLoaderParameters();
273
        BandInfo bandInfo = (BandInfo) this.variables.getSelectedItem();
274
        loaderParameters.setVariable(bandInfo.getName());
275
        loaderParameters.setBand(bandInfo.getBand());
276

    
277
        if(this.levels.getSelectedItem() != null){
278
            loaderParameters.setLevel((double) this.levels.getSelectedItem());
279
        }
280

    
281
        DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
282
        try {
283
            loaderParameters.setLapse((double) dataTypesManager.coerce(DataTypes.DOUBLE,
284
                this.lapse.getText()));
285
        } catch (CoercionException e) {
286
            LOG.warn("Lapse value has to be numeric");
287
            throw new InvalidLoaderParametersException("Lapse value has to be numeric",
288
                "value_lapse_field_has_to_be_numeric", null);
289
        }
290

    
291
        Calendar initialDate = (Calendar) this.initialTimes.getSelectedItem();
292
        Calendar finalDate = (Calendar) this.finalTimes.getSelectedItem();
293

    
294
        if (initialDate != null && finalDate != null) {
295
            if (finalDate.before(initialDate)) {
296
                LOG.warn("Final date can not be before initial date");
297
                throw new InvalidLoaderParametersException(
298
                    "Final date can not be previous initial date",
299
                    "final_date_can_not_be_previous_initial_date", null);
300
            }
301

    
302
            loaderParameters.setStartDate(initialDate);
303
            loaderParameters.setFinalDate(finalDate);
304
        }
305

    
306
        return loaderParameters;
307
    }
308

    
309
    @Override
310
    public JComponent asJComponent() {
311
        return this;
312
    }
313

    
314
    @Override
315
    public String getLevel() {
316
        return (String) this.levels.getSelectedItem();
317
    }
318

    
319
    @Override
320
    public String getVariable() {
321
        BandInfo bandInfo = (BandInfo) this.variables.getSelectedItem();
322
        if (bandInfo != null) {
323
            return bandInfo.getName();
324
        }
325
        return null;
326
    }
327

    
328
    @Override
329
    public Date getStartDate() {
330
        return (Date) this.initialTimes.getSelectedItem();
331
    }
332

    
333
    @Override
334
    public Date getEndDate() {
335
        return (Date) this.finalTimes.getSelectedItem();
336
    }
337

    
338
    @Override
339
    public double getLapse() {
340
        try {
341
            return (double) ToolsLocator.getDataTypesManager().coerce(DataTypes.DOUBLE,
342
                this.lapse.getText());
343
        } catch (LocatorException | CoercionException e) {
344
            LOG.warn(String.format("Can not coerce %1s values to double", this.lapse.getText()), e);
345
            return 1; // Returns default value
346
        }
347
    }
348

    
349
}