Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.gui / src / main / java / es / unex / sextante / gui / algorithm / AnalysisExtentPanel.java @ 338

History | View | Annotate | Download (23.4 KB)

1
package es.unex.sextante.gui.algorithm;
2

    
3
import info.clearthought.layout.TableLayout;
4
import info.clearthought.layout.TableLayoutConstants;
5

    
6
import java.awt.Dimension;
7
import java.awt.event.ActionEvent;
8
import java.awt.event.ActionListener;
9
import java.awt.event.FocusAdapter;
10
import java.awt.event.FocusEvent;
11
import java.awt.event.KeyAdapter;
12
import java.awt.event.KeyEvent;
13
import java.awt.geom.Rectangle2D;
14

    
15
import javax.swing.BorderFactory;
16
import javax.swing.ButtonGroup;
17
import javax.swing.ComboBoxModel;
18
import javax.swing.DefaultComboBoxModel;
19
import javax.swing.JButton;
20
import javax.swing.JComboBox;
21
import javax.swing.JLabel;
22
import javax.swing.JPanel;
23
import javax.swing.JRadioButton;
24
import javax.swing.JTextField;
25

    
26
import es.unex.sextante.core.AnalysisExtent;
27
import es.unex.sextante.core.GeoAlgorithm;
28
import es.unex.sextante.core.NamedExtent;
29
import es.unex.sextante.core.Sextante;
30
import es.unex.sextante.dataObjects.ILayer;
31
import es.unex.sextante.dataObjects.IRasterLayer;
32
import es.unex.sextante.exceptions.WrongAnalysisExtentException;
33
import es.unex.sextante.gui.core.SextanteGUI;
34
import es.unex.sextante.gui.exceptions.TooLargeGridExtentException;
35
import es.unex.sextante.gui.grass.GrassAlgorithm;
36
import es.unex.sextante.outputs.Output;
37
import es.unex.sextante.outputs.OutputRasterLayer;
38

    
39
/**
40
 * A panel to select a extent to be used for generating output layers from a
41
 * given algorithm
42
 * 
43
 * @author volaya
44
 */
45
public class AnalysisExtentPanel extends javax.swing.JPanel {
46

    
47
  protected static final int BIG_SIZE = 10000000;
48

    
49
  private JTextField jTextFieldCols;
50

    
51
  private JTextField jTextFieldRows;
52

    
53
  protected JTextField jTextFieldCellSize;
54

    
55
  protected JTextField jTextFieldXMax;
56

    
57
  protected JTextField jTextFieldXMin;
58

    
59
  protected JTextField jTextFieldYMax;
60

    
61
  protected JTextField jTextFieldYMin;
62

    
63
  private JLabel jLabelRowsCols;
64

    
65
  private JLabel jLabelCellSize;
66

    
67
  private JLabel jLabelRangeY;
68

    
69
  private JLabel jLabelRangeX;
70

    
71
  protected JComboBox jComboBoxLayers;
72

    
73
  private JComboBox jComboBoxViews;
74

    
75
  protected JPanel jPanelAnalysisExtentValues;
76

    
77
  private JPanel jPanelAnalysisExtentOptions;
78

    
79
  private JRadioButton jRadioButtonAdjustToInputDataExtent;
80

    
81
  private JRadioButton jRadioButtonViewExtent;
82

    
83
  private JRadioButton jRadioButtonUserDefinedExtent;
84

    
85
  private JRadioButton jRadioButtonExtentFromLayer;
86

    
87
  private ButtonGroup jButtonGroup;
88

    
89
  protected final GeoAlgorithm m_Algorithm;
90

    
91
  protected final ILayer[] m_Layers;
92

    
93
  /**
94
   * Creates a new panel
95
   * 
96
   * @param algorithm the algorithm
97
   */
98
  public AnalysisExtentPanel(final GeoAlgorithm algorithm) {
99

    
100
    super();
101

    
102
    m_Layers = SextanteGUI.getInputFactory().getLayers();
103
    m_Algorithm = algorithm;
104

    
105
    initGUI();
106

    
107
  }
108

    
109
  private void initGUI() {
110

    
111
    final TableLayout jPanelParametersRasterLayout = new TableLayout(
112
        new double[][] {
113
            { 1.0, TableLayoutConstants.FILL, 1.0 },
114
            { 1.0, TableLayoutConstants.MINIMUM, TableLayoutConstants.FILL, 1.0 } });
115
    jPanelParametersRasterLayout.setHGap(5);
116
    jPanelParametersRasterLayout.setVGap(5);
117
    this.setLayout(jPanelParametersRasterLayout);
118

    
119
    this.add(getJPanelAnalysisExtentOptions(), "1, 1");
120
    this.add(getJPanelAnalysisExtentValues(), "1, 2");
121
    if (m_Algorithm.canDefineOutputExtentFromInput()) {
122
      getJPanelAnalysisExtentValues().setVisible(false);
123
    }
124
    else {
125
      getJPanelAnalysisExtentValues().setVisible(true);
126
    }
127

    
128
  }
129

    
130
  /**
131
   * Assigns the selected extent to the algorithm
132
   * 
133
   * @throws TooLargeGridExtentException if the dimensions of the extent are too
134
   *           large (too many cells) and the user should be queried to make
135
   *           sure that the input values are correct
136
   * @throws WrongAnalysisExtentException if the input values are not correct
137
   */
138
  public void assignExtent() throws TooLargeGridExtentException,
139
      WrongAnalysisExtentException {
140

    
141
    m_Algorithm.setAnalysisExtent((AnalysisExtent) null);
142

    
143
    if (getJRadioButtonAdjustToInputDataExtent().isSelected()) {
144
      if (!m_Algorithm.adjustOutputExtent()) {
145
        throw new WrongAnalysisExtentException(
146
            Sextante.getText("Wrong_or_missing_region"));
147
      }
148
      else {
149
        return;
150
      }
151

    
152
    }
153

    
154
    final AnalysisExtent outputExtent = new AnalysisExtent();
155
    boolean recalculateForCell = m_Algorithm.getRecalculateForCell();
156
    try {
157
      outputExtent
158
          .setCellSize(Double.parseDouble(jTextFieldCellSize.getText()));
159
      outputExtent.setXRange(Double.parseDouble(jTextFieldXMin.getText()),
160
          Double.parseDouble(jTextFieldXMax.getText()), recalculateForCell);
161
      outputExtent.setYRange(Double.parseDouble(jTextFieldYMin.getText()),
162
          Double.parseDouble(jTextFieldYMax.getText()), recalculateForCell);
163
      m_Algorithm.setAnalysisExtent(outputExtent);
164
    }
165
    catch (final NumberFormatException e) {
166
      // Sextante.addErrorToLog(e);
167
      if (m_Algorithm instanceof GrassAlgorithm) {
168
        // GRASS vector output modules can always fall back to a default extent
169
        outputExtent.setXRange(0.0, 1.0, true);
170
        outputExtent.setYRange(0.0, 1.0, true);
171
        m_Algorithm.setAnalysisExtent(outputExtent);
172
        if (m_Algorithm.getName().contains("v.in.region")) {
173
          // we absolutely need a region for these commands!
174
          throw new WrongAnalysisExtentException(
175
              Sextante.getText("Wrong_or_missing_region"));
176
        }
177
        for (int i = 0; i < m_Algorithm.getNumberOfOutputObjects(); i++) {
178
          final Output out = m_Algorithm.getOutputObjects().getOutput(i);
179
          // Raster import modules also do not need an extent setting
180
          if ((out instanceof OutputRasterLayer)
181
              && !m_Algorithm.getName().contains("r.in.")) {
182
            // But if we have another raster output, then we need an extent!
183
            throw new WrongAnalysisExtentException(
184
                Sextante.getText("Wrong_or_missing_region"));
185
          }
186
        }
187
      }
188
      else {
189
        throw new WrongAnalysisExtentException(
190
            Sextante.getText("Wrong_or_missing_raster_extent_definition"));
191
      }
192
    }
193

    
194
    final int numCells = outputExtent.getNX() * outputExtent.getNY();
195
    /*
196
     * benducke: let's just assume the other knows what (s)he is doing... if
197
     * ((numCells > BIG_SIZE) || (Integer.MAX_VALUE / outputExtent.getNY() <
198
     * outputExtent.getNX())) { throw new
199
     * TooLargeGridExtentException(Sextante.getText
200
     * ("The_selected_grid_extent_seems_too_large") + "(" +
201
     * Integer.toString(outputExtent.getNX()) + " X " +
202
     * Integer.toString(outputExtent.getNY()) + ")\n" +
203
     * Sextante.getText("Are_you_sure_you_want_to_use_it?")); }
204
     */
205
  }
206

    
207
  private ButtonGroup getJButtonGroup() {
208

    
209
    if (jButtonGroup == null) {
210
      jButtonGroup = new ButtonGroup();
211
    }
212
    return jButtonGroup;
213

    
214
  }
215

    
216
  protected JRadioButton getJRadioButtonUserDefinedExtent() {
217

    
218
    if (jRadioButtonUserDefinedExtent == null) {
219
      jRadioButtonUserDefinedExtent = new JRadioButton();
220
      jRadioButtonUserDefinedExtent.setText(Sextante.getText("User_defined"));
221
      jRadioButtonUserDefinedExtent
222
          .addActionListener(new java.awt.event.ActionListener() {
223

    
224
            public void actionPerformed(final java.awt.event.ActionEvent e) {
225
              setTextFieldsEnabled(true);
226
              extentHasChanged();
227
            }
228
          });
229
    }
230

    
231
    return jRadioButtonUserDefinedExtent;
232
  }
233

    
234
  protected JRadioButton getJRadioButtonAdjustToInputDataExtent() {
235

    
236
    if (jRadioButtonAdjustToInputDataExtent == null) {
237
      jRadioButtonAdjustToInputDataExtent = new JRadioButton();
238
      jRadioButtonAdjustToInputDataExtent.setText(Sextante
239
          .getText("Fit_to_input_layers"));
240
      jRadioButtonAdjustToInputDataExtent
241
          .addActionListener(new java.awt.event.ActionListener() {
242

    
243
            public void actionPerformed(final java.awt.event.ActionEvent e) {
244
              getJPanelAnalysisExtentValues().setVisible(false);
245
            }
246
          });
247
    }
248

    
249
    return jRadioButtonAdjustToInputDataExtent;
250
  }
251

    
252
  private JRadioButton getJRadioButtonViewExtent() {
253
    if (jRadioButtonViewExtent == null) {
254
      jRadioButtonViewExtent = new JRadioButton();
255
      jRadioButtonViewExtent.setText(Sextante.getText("Use_extent_from_view"));
256
      jRadioButtonViewExtent
257
          .addActionListener(new java.awt.event.ActionListener() {
258

    
259
            public void actionPerformed(final java.awt.event.ActionEvent evt) {
260
              try {
261
                getJComboBoxViews().setSelectedIndex(
262
                    getJComboBoxViews().getSelectedIndex());
263
                setTextFieldsEnabled(false);
264
              }
265
              catch (final Exception e) {}
266
            }
267
          });
268
    }
269
    return jRadioButtonViewExtent;
270
  }
271

    
272
  JRadioButton getJRadioButtonExtentFromLayer() {
273
    if (jRadioButtonExtentFromLayer == null) {
274
      jRadioButtonExtentFromLayer = new JRadioButton();
275
      jRadioButtonExtentFromLayer.setText(Sextante
276
          .getText("Use_extent_from_layer"));
277
      jRadioButtonExtentFromLayer
278
          .addActionListener(new java.awt.event.ActionListener() {
279

    
280
            public void actionPerformed(final java.awt.event.ActionEvent e) {
281
              getJComboBoxLayers().setSelectedIndex(
282
                  getJComboBoxLayers().getSelectedIndex());
283
              setTextFieldsEnabled(false);
284
            }
285
          });
286
    }
287
    return jRadioButtonExtentFromLayer;
288
  }
289

    
290
  protected JPanel getJPanelAnalysisExtentOptions() {
291
    if (jPanelAnalysisExtentOptions == null) {
292
      jPanelAnalysisExtentOptions = new JPanel();
293
      final TableLayout jPanelRasterExtentOptionsLayout = new TableLayout(
294
          new double[][] {
295
              { 253.0, TableLayoutConstants.FILL },
296
              { TableLayoutConstants.MINIMUM, TableLayoutConstants.MINIMUM,
297
                  TableLayoutConstants.MINIMUM, TableLayoutConstants.MINIMUM } });
298
      jPanelRasterExtentOptionsLayout.setHGap(5);
299
      jPanelRasterExtentOptionsLayout.setVGap(5);
300
      jPanelAnalysisExtentOptions.setLayout(jPanelRasterExtentOptionsLayout);
301
      jPanelAnalysisExtentOptions.setPreferredSize(new java.awt.Dimension(660,
302
          200));
303
      jPanelAnalysisExtentOptions.setBorder(BorderFactory
304
          .createTitledBorder(Sextante.getText("Extent_from")));
305
      jPanelAnalysisExtentOptions.add(getJRadioButtonUserDefinedExtent(),
306
          "0, 1");
307
      jPanelAnalysisExtentOptions.add(getJRadioButtonViewExtent(), "0, 2");
308
      jPanelAnalysisExtentOptions.add(getJRadioButtonExtentFromLayer(), "0, 3");
309
      getJButtonGroup().add(getJRadioButtonUserDefinedExtent());
310
      getJButtonGroup().add(getJRadioButtonViewExtent());
311
      getJButtonGroup().add(getJRadioButtonExtentFromLayer());
312
      if (m_Algorithm.canDefineOutputExtentFromInput()) {
313
        jPanelAnalysisExtentOptions.add(
314
            getJRadioButtonAdjustToInputDataExtent(), "0, 0");
315
        getJButtonGroup().add(getJRadioButtonAdjustToInputDataExtent());
316
        getJRadioButtonAdjustToInputDataExtent().setSelected(true);
317
      }
318
      else {
319
        getJRadioButtonUserDefinedExtent().setSelected(true);
320
      }
321
      jPanelAnalysisExtentOptions.add(getJComboBoxViews(), "1, 2");
322
      jPanelAnalysisExtentOptions.add(getJComboBoxLayers(), "1, 3");
323

    
324
    }
325
    return jPanelAnalysisExtentOptions;
326
  }
327

    
328
  protected JPanel getJPanelAnalysisExtentValues() {
329

    
330
    if (jPanelAnalysisExtentValues == null) {
331
      jPanelAnalysisExtentValues = new JPanel();
332
      final TableLayout jPanelRasterExtentValuesLayout = new TableLayout(
333
          new double[][] {
334
              { 255.0, TableLayoutConstants.FILL, TableLayoutConstants.FILL },
335
              { TableLayoutConstants.MINIMUM, TableLayoutConstants.MINIMUM,
336
                  TableLayoutConstants.MINIMUM, TableLayoutConstants.MINIMUM,
337
                  TableLayoutConstants.FILL } });
338
      jPanelRasterExtentValuesLayout.setHGap(5);
339
      jPanelRasterExtentValuesLayout.setVGap(5);
340
      jPanelAnalysisExtentValues.setLayout(jPanelRasterExtentValuesLayout);
341
      jPanelAnalysisExtentValues.setBorder(BorderFactory
342
          .createTitledBorder(Sextante.getText("Extent__values")));
343
      jPanelAnalysisExtentValues.setPreferredSize(new java.awt.Dimension(660,
344
          145));
345
      jPanelAnalysisExtentValues.add(getJLabelRangeX(), "0, 0");
346
      jPanelAnalysisExtentValues.add(getJLabelCellSize(), "0, 2");
347
      jPanelAnalysisExtentValues.add(getJTextFieldCellSize(), "1, 2");
348
      jPanelAnalysisExtentValues.add(getJTextFieldXMin(), "1, 0");
349
      jPanelAnalysisExtentValues.add(getJTextFieldXMax(), "2, 0");
350
      jPanelAnalysisExtentValues.add(getJTextFieldYMin(), "1, 1");
351
      jPanelAnalysisExtentValues.add(getJTextFieldYMax(), "2, 1");
352
      jPanelAnalysisExtentValues.add(getJLabelRangeY(), "0, 1");
353
      jPanelAnalysisExtentValues.add(getJLabelRowsCols(), "0, 3");
354
      jPanelAnalysisExtentValues.add(getJTextFieldRows(), "1, 3");
355
      jPanelAnalysisExtentValues.add(getJTextFieldCols(), "2, 3");
356
      jPanelAnalysisExtentValues.add(getJButtonExtentFromPoints(), "2,2");
357
    }
358
    return jPanelAnalysisExtentValues;
359
  }
360

    
361
  private JButton getJButtonExtentFromPoints() {
362

    
363
    final JButton button = new JButton("...");
364
    button.setSize(new Dimension(30, 30));
365
    button.addActionListener(new ActionListener() {
366

    
367
      public void actionPerformed(final ActionEvent arg0) {
368
        final ExtentFromSavedPointsDialog dialog = new ExtentFromSavedPointsDialog();
369
        dialog.pack();
370
        dialog.setVisible(true);
371
        final double[] ret = dialog.getPoints();
372
        if (ret != null) {
373
          getJTextFieldXMin().setText(Double.toString(ret[0]));
374
          getJTextFieldYMin().setText(Double.toString(ret[1]));
375
          getJTextFieldXMax().setText(Double.toString(ret[2]));
376
          getJTextFieldYMax().setText(Double.toString(ret[3]));
377
        }
378
      }
379
    });
380
    return button;
381
  }
382

    
383
  protected JComboBox getJComboBoxLayers() {
384

    
385
    if (jComboBoxLayers == null) {
386
      getJRadioButtonExtentFromLayer().setEnabled(m_Layers.length > 0);
387
      final ComboBoxModel jComboBoxLayersModel = new DefaultComboBoxModel(
388
          m_Layers);
389
      jComboBoxLayers = new JComboBox();
390
      jComboBoxLayers.setModel(jComboBoxLayersModel);
391
      jComboBoxLayers.setEnabled(m_Layers.length > 0);
392

    
393
      jComboBoxLayers.addActionListener(new java.awt.event.ActionListener() {
394

    
395
        public void actionPerformed(final java.awt.event.ActionEvent evt) {
396
          double dCoord;
397
          if (getJRadioButtonExtentFromLayer().isSelected()) {
398
            try {
399
              final ILayer layer = (ILayer) jComboBoxLayers.getSelectedItem();
400
              Rectangle2D fullExtent = layer.getFullExtent();
401
              dCoord = fullExtent.getMinX();
402
              getJTextFieldXMin().setText(new Double(dCoord).toString());
403
              dCoord = fullExtent.getMaxX();
404
              getJTextFieldXMax().setText(new Double(dCoord).toString());
405
              dCoord = fullExtent.getMinY();
406
              getJTextFieldYMin().setText(new Double(dCoord).toString());
407
              dCoord = fullExtent.getMaxY();
408
              getJTextFieldYMax().setText(new Double(dCoord).toString());
409
              if (layer instanceof IRasterLayer) {
410
                getJTextFieldCellSize().setText(
411
                    new Double(((IRasterLayer) layer).getLayerCellSize())
412
                        .toString());
413
              }
414
              extentHasChanged();
415
            }
416
            catch (final Exception e) {}
417
          }
418
        }
419
      });
420
    }
421
    return jComboBoxLayers;
422
  }
423

    
424
  private JComboBox getJComboBoxViews() {
425

    
426
    if (jComboBoxViews == null) {
427
      NamedExtent[] predefinedExtents = SextanteGUI.getInputFactory()
428
          .getPredefinedExtents();
429
      boolean enabled = predefinedExtents.length > 1 || (predefinedExtents.length == 1 && predefinedExtents[0] != null);
430
      getJRadioButtonViewExtent().setEnabled(enabled);
431
      final ComboBoxModel jComboBoxViewsModel = new DefaultComboBoxModel(
432
          predefinedExtents);
433
      jComboBoxViews = new JComboBox();
434
      jComboBoxViews.setModel(jComboBoxViewsModel);
435
      jComboBoxViews.setEnabled(enabled);
436

    
437
      jComboBoxViews.addActionListener(new java.awt.event.ActionListener() {
438

    
439
        public void actionPerformed(final java.awt.event.ActionEvent evt) {
440
          if (getJRadioButtonViewExtent().isSelected()) {
441
            try {
442
              final NamedExtent ne = (NamedExtent) jComboBoxViews
443
                  .getSelectedItem();
444
              if (ne != null) {
445
                final Rectangle2D extent = ne.getExtent();
446
                getJTextFieldXMin().setText(
447
                    new Double(extent.getMinX()).toString());
448
                getJTextFieldXMax().setText(
449
                    new Double(extent.getMaxX()).toString());
450
                getJTextFieldYMin().setText(
451
                    new Double(extent.getMinY()).toString());
452
                getJTextFieldYMax().setText(
453
                    new Double(extent.getMaxY()).toString());
454
                setTextFieldsEnabled(false);
455
                extentHasChanged();
456
              }
457
            }
458
            catch (final Exception e) {
459
              Sextante.addErrorToLog(e);
460
            }
461
          }
462
        }
463
      });
464
    }
465
    return jComboBoxViews;
466
  }
467

    
468
  protected JLabel getJLabelRangeX() {
469

    
470
    if (jLabelRangeX == null) {
471
      jLabelRangeX = new JLabel();
472
      jLabelRangeX.setText(Sextante.getText("Range_X"));
473
    }
474
    return jLabelRangeX;
475

    
476
  }
477

    
478
  protected JTextField getNewJTextField() {
479

    
480
    final JTextField jTextField = new JTextField();
481
    jTextField.addFocusListener(new FocusAdapter() {
482

    
483
      @Override
484
      public void focusLost(final FocusEvent e) {
485
        final JTextField textField = (JTextField) e.getSource();
486
        final String content = textField.getText();
487
        if (content.length() != 0) {
488
          try {
489
            final double d = Double.parseDouble(content);
490
            extentHasChanged();
491
          }
492
          catch (final NumberFormatException nfe) {
493
            getToolkit().beep();
494
            textField.requestFocus();
495
          }
496
        }
497
      }
498
    });
499
    jTextField.addKeyListener(new KeyAdapter() {
500

    
501
      @Override
502
      public void keyTyped(final KeyEvent event) {
503
        validateKeyTyping(event);
504
      }
505
    });
506

    
507
    return jTextField;
508
  }
509

    
510
  protected JTextField getJTextFieldXMin() {
511
    if (jTextFieldXMin == null) {
512
      jTextFieldXMin = getNewJTextField();
513
    }
514
    return jTextFieldXMin;
515
  }
516

    
517
  protected JTextField getJTextFieldXMax() {
518
    if (jTextFieldXMax == null) {
519
      jTextFieldXMax = getNewJTextField();
520
    }
521
    return jTextFieldXMax;
522
  }
523

    
524
  protected JTextField getJTextFieldYMin() {
525
    if (jTextFieldYMin == null) {
526
      jTextFieldYMin = getNewJTextField();
527
    }
528
    return jTextFieldYMin;
529
  }
530

    
531
  protected JTextField getJTextFieldYMax() {
532
    if (jTextFieldYMax == null) {
533
      jTextFieldYMax = getNewJTextField();
534
    }
535
    return jTextFieldYMax;
536
  }
537

    
538
  protected JLabel getJLabelRangeY() {
539
    if (jLabelRangeY == null) {
540
      jLabelRangeY = new JLabel();
541
      jLabelRangeY.setText(Sextante.getText("Range_Y"));
542
    }
543
    return jLabelRangeY;
544
  }
545

    
546
  protected JLabel getJLabelCellSize() {
547
    if (jLabelCellSize == null) {
548
      jLabelCellSize = new JLabel();
549
      jLabelCellSize.setText(Sextante.getText("Cell_size"));
550
    }
551
    return jLabelCellSize;
552
  }
553

    
554
  protected JTextField getJTextFieldCellSize() {
555
    if (jTextFieldCellSize == null) {
556
      jTextFieldCellSize = new JTextField();
557
      jTextFieldCellSize.setText("1");
558
      jTextFieldCellSize.addFocusListener(new FocusAdapter() {
559

    
560
        @Override
561
        public void focusLost(final FocusEvent e) {
562
          final JTextField textField = (JTextField) e.getSource();
563
          final String content = textField.getText();
564
          if (content.length() != 0) {
565
            try {
566
              final double d = Double.parseDouble(content);
567
              if (d <= 0) {
568
                throw new NumberFormatException();
569
              }
570
              else {
571
                extentHasChanged();
572
              }
573
            }
574
            catch (final NumberFormatException nfe) {
575
              getToolkit().beep();
576
              textField.requestFocus();
577
            }
578
          }
579

    
580
        }
581
      });
582
      jTextFieldCellSize.addKeyListener(new KeyAdapter() {
583

    
584
        @Override
585
        public void keyTyped(final KeyEvent event) {
586
          validateKeyTyping(event);
587
        }
588
      });
589
    }
590
    return jTextFieldCellSize;
591
  }
592

    
593
  protected JLabel getJLabelRowsCols() {
594
    if (jLabelRowsCols == null) {
595
      jLabelRowsCols = new JLabel();
596
      jLabelRowsCols.setText(Sextante.getText("Number_of_rows-cols"));
597
    }
598
    return jLabelRowsCols;
599
  }
600

    
601
  protected JTextField getJTextFieldRows() {
602
    if (jTextFieldRows == null) {
603
      jTextFieldRows = new JTextField();
604
      jTextFieldRows.setEnabled(false);
605
    }
606
    return jTextFieldRows;
607
  }
608

    
609
  protected JTextField getJTextFieldCols() {
610
    if (jTextFieldCols == null) {
611
      jTextFieldCols = new JTextField();
612
      jTextFieldCols.setEnabled(false);
613
    }
614
    return jTextFieldCols;
615
  }
616

    
617
  private void validateKeyTyping(final KeyEvent event) {
618
    String text = ((JTextField) event.getSource()).getText();
619
    switch (event.getKeyChar()) {
620
      case KeyEvent.VK_ENTER:
621
        extentHasChanged();
622
        break;
623
      default:
624
        text += event.getKeyChar();
625
        break;
626
    }
627
  }
628

    
629
  protected void setTextFieldsEnabled(final boolean bEnabled) {
630

    
631
    getJPanelAnalysisExtentValues().setVisible(true);
632
    getJTextFieldXMin().setEnabled(bEnabled);
633
    getJTextFieldXMax().setEnabled(bEnabled);
634
    getJTextFieldYMin().setEnabled(bEnabled);
635
    getJTextFieldYMax().setEnabled(bEnabled);
636

    
637
  }
638

    
639
  protected void extentHasChanged() {
640

    
641
    double dRangeX;
642
    double dRangeY;
643
    double dCellSize;
644
    int iRows;
645
    int iCols;
646

    
647
    try {
648
      dRangeX = Math.abs(Double.parseDouble(getJTextFieldXMax().getText())
649
          - Double.parseDouble(getJTextFieldXMin().getText()));
650
      dRangeY = Math.abs(Double.parseDouble(getJTextFieldYMax().getText())
651
          - Double.parseDouble(getJTextFieldYMin().getText()));
652
      dCellSize = Double.parseDouble(getJTextFieldCellSize().getText());
653
      iRows = (int) Math.floor(dRangeY / dCellSize);
654
      iCols = (int) Math.floor(dRangeX / dCellSize);
655
      getJTextFieldRows().setText(Integer.toString(iRows));
656
      getJTextFieldCols().setText(Integer.toString(iCols));
657
    }
658
    catch (final NumberFormatException e) {
659
      return;
660
    }
661

    
662
  }
663

    
664
  public void setExtent(final AnalysisExtent ge) {
665

    
666
    getJRadioButtonUserDefinedExtent().setSelected(true);
667
    setTextFieldsEnabled(true);
668

    
669
    getJTextFieldCellSize().setText(Double.toString(ge.getCellSize()));
670
    getJTextFieldXMin().setText(Double.toString(ge.getXMin()));
671
    getJTextFieldXMax().setText(Double.toString(ge.getXMax()));
672
    getJTextFieldYMin().setText(Double.toString(ge.getYMin()));
673
    getJTextFieldYMax().setText(Double.toString(ge.getYMax()));
674
    extentHasChanged();
675

    
676
  }
677

    
678
  public void setAutoExtent() {
679

    
680
    getJRadioButtonAdjustToInputDataExtent().setSelected(true);
681
    setTextFieldsEnabled(false);
682
    getJPanelAnalysisExtentValues().setVisible(false);
683

    
684
  }
685

    
686
}