Statistics
| Revision:

gvsig-raster / org.gvsig.raster.roimask / trunk / org.gvsig.raster.roimask / org.gvsig.raster.roimask.app / org.gvsig.raster.roimask.app.client / src / main / java / org / gvsig / raster / roimask / app / ROIMaskExtension.java @ 3379

History | View | Annotate | Download (12.9 KB)

1
package org.gvsig.raster.roimask.app;
2

    
3
import java.awt.event.ActionEvent;
4
import java.awt.event.ActionListener;
5
import java.io.File;
6
import java.util.HashMap;
7
import java.util.List;
8

    
9
import javax.swing.JComponent;
10
import javax.swing.JPanel;
11

    
12
import org.gvsig.andami.IconThemeHelper;
13
import org.gvsig.andami.PluginServices;
14
import org.gvsig.andami.plugins.Extension;
15
import org.gvsig.andami.ui.mdiManager.IWindow;
16
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
17
import org.gvsig.fmap.dal.coverage.RasterLibrary;
18
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
19
import org.gvsig.fmap.dal.coverage.exception.ROIException;
20
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
21
import org.gvsig.fmap.dal.exception.ReadException;
22
import org.gvsig.fmap.mapcontext.layers.FLayer;
23
import org.gvsig.fmap.mapcontext.layers.FLayers;
24
import org.gvsig.fmap.mapcontrol.MapControl;
25
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
26
import org.gvsig.gui.beans.table.exceptions.NotInitializeException;
27
import org.gvsig.i18n.Messages;
28
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
29
import org.gvsig.raster.algorithm.process.DataProcess;
30
import org.gvsig.raster.algorithm.process.IProcessActions;
31
import org.gvsig.raster.algorithm.process.ProcessException;
32
import org.gvsig.raster.fmap.layers.FLyrRaster;
33
import org.gvsig.raster.fmap.layers.IRasterLayerActions;
34
import org.gvsig.raster.mainplugin.RasterMainPluginUtils;
35
import org.gvsig.raster.roi.ROI;
36
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
37
import org.gvsig.raster.roimask.app.toolbox.ToolboxROIMaskLoader;
38
import org.gvsig.raster.roimask.swing.ROIMaskPanel;
39
import org.gvsig.raster.roimask.swing.ROIMaskSwingLocator;
40
import org.gvsig.raster.swing.RasterSwingLibrary;
41
import org.gvsig.raster.swing.RasterSwingLocator;
42
import org.gvsig.raster.swing.newlayer.CreateNewLayerPanel;
43
import org.gvsig.raster.swing.preview.PreviewPanel;
44
import org.gvsig.raster.util.RasterNotLoadException;
45
import org.gvsig.tools.ToolsLocator;
46
import org.gvsig.tools.extensionpoint.ExtensionPoint;
47
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
48
import org.slf4j.Logger;
49
import org.slf4j.LoggerFactory;
50

    
51
public class ROIMaskExtension extends Extension implements ActionListener,
52
    IProcessActions {
53

    
54
  private int windowWidth = 600;
55

    
56
  private int windowHeight = 370;
57

    
58
  private IWindow window = null;
59

    
60
  private PreviewPanel previewPanel = null;
61

    
62
  private ROIMaskPreview processPreview = null;
63

    
64
  private ROIMaskPanel panel = null;
65

    
66
  private CreateNewLayerPanel newLayerPanel = null;
67

    
68
  private static final Logger logger = LoggerFactory
69
      .getLogger(ROIMaskExtension.class);
70

    
71
  public void initialize() {
72

    
73
    // Adds an entry to the TOC's floating menu to those layers defined in this
74
    // extension
75

    
76
    // ExtensionPoint exPoint =
77
    // ToolsLocator.getExtensionPointManager().add("My_TocActions");
78
    // exPoint.append("MyMenuEntry", "", new ROIMaskTocMenuEntry());
79

    
80
    // Adds a new tab to the "add layer" dialog
81

    
82
    // AddLayer.addWizard(ROIMaskWizard.class);
83

    
84
    // Adds a new button in the raster bar
85

    
86
    ExtensionPointManager extensionPoints = ToolsLocator
87
        .getExtensionPointManager();
88
    ExtensionPoint point = extensionPoints.add("GenericToolBarMenu");
89
    point.append("ROIMask", "", ROIMaskTocMenuEntry.getSingleton());
90
    ROIMaskTocMenuEntry.setExtension(this);
91

    
92
    Messages.addResourceFamily("org.gvsig.raster.roimask.app.i18n.text",
93
        ROIMaskExtension.class.getClassLoader(), ROIMaskExtension.class
94
            .getClass().getName());
95

    
96
    initilizeIcons();
97
  }
98

    
99
  public void postInitialize() {
100
    new ToolboxROIMaskLoader().registerTool();
101
  }
102

    
103
  public void execute(String actionCommand) {
104
    if (actionCommand.compareTo("ROIMask") == 0) {
105
      if (getSelectedLayer() == null) {
106
        RasterSwingLibrary.messageBoxError("layer_not_selected", null);
107
        return;
108
      }
109
      try {
110
        initializeMainPanel();
111
      }
112
      catch (ReadException e) {
113
        logger.error("Error initializing the main panel", e);
114
      }
115
      catch (ROIException e) {
116
        logger.error("Error getting ROI", e);
117
      }
118
    }
119
  }
120

    
121
  /**
122
   * Creates and initializes the main panel
123
   *
124
   * @throws ReadException
125
   * @throws ROIException
126
   */
127
  private void initializeMainPanel() throws ReadException, ROIException {
128
    try {
129
      loadROIMaskPanel();
130
    }
131
    catch (NotInitializeException e) {
132
      throw new ReadException("Error loading the table", e);
133
    }
134

    
135
    MainPanel mainPanel = new MainPanel(getROIMaskPanel().getComponent(),
136
        (JComponent) getNewLayerPanel());
137

    
138
    window = new ROIMaskWindow(mainPanel, (JPanel) getPreviewPanel(),
139
        Messages.getText("roimask"), windowWidth, windowHeight, false, this);
140

    
141
    PluginServices.getMDIManager().addWindow(window);
142
    getPreviewPanel().previewInitializeSizes();
143
    getPreviewPanel().refreshPreview();
144
  }
145

    
146
  /**
147
   * Loads the main panel with the data
148
   *
149
   * @throws NotInitializeException
150
   * @throws ROIException
151
   */
152
  private void loadROIMaskPanel() throws NotInitializeException, ROIException {
153
    FLyrRaster lyr = getSelectedLayer();
154
    LayerElement element = new LayerElement(lyr);
155
    getROIMaskPanel().getDataModel().setInputLayer(element);
156
    ColorInterpretation ci = lyr.getDataStore().getColorInterpretation();
157

    
158
    if (ci.isRGB() || ci.isRGBA()) {
159
      getROIMaskPanel().activeSlider(true);
160
    }
161
    else
162
      getROIMaskPanel().activeSlider(false);
163

    
164
    if (lyr.getRois() == null || lyr.getRois().size() == 0)
165
      getROIMaskPanel().showWarning(true);
166
    else
167
      getROIMaskPanel().showWarning(false);
168

    
169
    getROIMaskPanel().getDataModel().clearROIs();
170

    
171
    List<ROI> roisArray = lyr.getRois();
172
    if (roisArray != null) {
173
      for (int i = 0; i < roisArray.size(); i++) {
174
        ROI roi = (ROI) roisArray.get(i);
175

    
176
        Object row[] = { "", "", "" };
177

    
178
        boolean active = false;
179

    
180
        row[0] = new Boolean(active);
181
        row[1] = roi.getName();
182
        row[2] = new Integer(i);
183
        getROIMaskPanel().getDataModel().addROI(row);
184
      }
185
    }
186

    
187
    if (lyr != null) {
188
      switch (lyr.getDataStore().getDataType()[0]) {
189
        case Buffer.TYPE_BYTE:
190
          getROIMaskPanel().getDataModel().setValueNoData(
191
              RasterLibrary.defaultByteNoDataValue);
192
          break;
193
        case Buffer.TYPE_SHORT:
194
          getROIMaskPanel().getDataModel().setValueNoData(
195
              RasterLibrary.defaultShortNoDataValue);
196
          break;
197
        case Buffer.TYPE_INT:
198
          getROIMaskPanel().getDataModel().setValueNoData(
199
              RasterLibrary.defaultIntegerNoDataValue);
200
          break;
201
        case Buffer.TYPE_FLOAT:
202
          getROIMaskPanel().getDataModel().setValueNoData(
203
              RasterLibrary.defaultFloatNoDataValue);
204
          break;
205
        case Buffer.TYPE_DOUBLE:
206
          getROIMaskPanel().getDataModel().setValueNoData(
207
              RasterLibrary.defaultDoubleNoDataValue);
208
          break;
209
      }
210
    }
211
  }
212

    
213
  /**
214
   * Gets the list of layers from the gvSIG view
215
   *
216
   * @return
217
   */
218
  private FLayers getLayers() {
219
    MapControl mapControl = null;
220
    IWindow[] windowList = PluginServices.getMDIManager().getOrderedWindows();
221
    for (int i = 0; i < windowList.length; i++) {
222
      if (windowList[i] instanceof AbstractViewPanel) {
223
        mapControl = ((AbstractViewPanel) windowList[i]).getMapControl();
224
        break;
225
      }
226
    }
227
    if (mapControl != null) return mapControl.getMapContext().getLayers();
228
    return null;
229
  }
230

    
231
  /**
232
   * Gets the selected layer
233
   *
234
   * @return
235
   */
236
    private FLyrRaster getSelectedLayer() {
237
        FLayers lyrs = getLayers();
238
        if (lyrs != null) {
239
            for (int i = 0; i < lyrs.getLayersCount(); i++) {
240
                FLayer lyr = lyrs.getLayer(i);
241
                if (lyr.isActive() && lyr instanceof FLyrRaster)
242
                    return (FLyrRaster) lyr;
243
            }
244
        }
245
        return null;
246
    }
247

    
248
  public boolean isEnabled() {
249
    FLyrRaster selectedLayer = getSelectedLayer();
250
    if (selectedLayer == null) return false;
251

    
252
    if (selectedLayer != null && selectedLayer.isActive()
253
        && selectedLayer instanceof FLyrRaster) {
254
      return true;
255
    }
256
    return false;
257
  }
258

    
259
  public boolean isVisible() {
260
    FLyrRaster selectedLayer = getSelectedLayer();
261
    if (selectedLayer == null)
262
      return false;
263

    
264
    if (!(selectedLayer instanceof IRasterLayerActions))
265
      return false;
266

    
267
    return ((IRasterLayerActions) selectedLayer).isActionEnabled(IRasterLayerActions.ENHANCED);
268
  }
269

    
270
  void initilizeIcons() {
271
    IconThemeHelper.registerIcon(null, "gvsig-icon", this);
272
    IconThemeHelper.registerIcon(null, "mask-icon", this);
273
    IconThemeHelper.registerIcon(null, "gvsig-icon16x16", this);
274
  }
275

    
276
  /**
277
   * Gets the {@link ROIMaskPanel}
278
   *
279
   * @return {@link ROIMaskPanel}
280
   */
281
  private CreateNewLayerPanel getNewLayerPanel() {
282
    if (newLayerPanel == null)
283
      newLayerPanel = RasterSwingLocator.getSwingManager().createNewLayerPanel(
284
          Messages.getText("create_output_layer"));
285
    return newLayerPanel;
286
  }
287

    
288
  /**
289
   * Gets the {@link PreviewPanel}
290
   *
291
   * @return {@link PreviewPanel}
292
   */
293
  private PreviewPanel getPreviewPanel() {
294
    if (previewPanel == null)
295
      previewPanel = RasterSwingLocator.getSwingManager()
296
          .createSinglePreviewPanel(null, getDataSourcePreview());
297
    return previewPanel;
298
  }
299

    
300
  /**
301
   * Gets the {@link ROIMaskPreview}
302
   *
303
   * @return {@link ROIMaskPreview}
304
   */
305
  private ROIMaskPreview getDataSourcePreview() {
306
    if (processPreview == null) {
307
      processPreview = new ROIMaskPreview();
308
    }
309
    processPreview.setData(getROIMaskPanel().getDataModel());
310
    return processPreview;
311
  }
312

    
313
  /**
314
   * Gets the {@link ROIMaskPanel}
315
   *
316
   * @return {@link ROIMaskPanel}
317
   */
318
  private ROIMaskPanel getROIMaskPanel() {
319
    if (panel == null) {
320
      panel = ROIMaskSwingLocator.getSwingManager().createROIMaskPanel();
321
      panel.addListener(this);
322
    }
323
    return panel;
324
  }
325

    
326
  public void actionPerformed(ActionEvent e) {
327
    if (window != null
328
        && (e.getSource() == ((ROIMaskWindow) window).getButtonsPanel()
329
            .getButton(ButtonsPanel.BUTTON_ACCEPT) || e.getSource() == ((ROIMaskWindow) window)
330
            .getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY))) {
331
      DataProcess task = null;
332
      try {
333
        task = RasterBaseAlgorithmLibrary.getManager().createRasterTask(
334
            "ROIMaskProcess");
335
      }
336
      catch (ProcessException e1) {
337
        RasterSwingLibrary.messageBoxError("error_processing_layer", null, e1);
338
      }
339
      task.setActions(this);
340
      try {
341
        getDataSourcePreview().addParams(task,
342
            getNewLayerPanel().getDirectorySelected(),
343
            getNewLayerPanel().getFileSelected());
344
      }
345
      catch (ROIException e1) {
346
        RasterSwingLibrary.messageBoxError("error_processing_layer", null, e1);
347
      }
348
      task.start();
349
      return;
350
    }
351

    
352
    getPreviewPanel().refreshPreview();
353
  }
354

    
355
  @SuppressWarnings("unchecked")
356
  public void end(Object params) {
357
    if (params instanceof HashMap<?, ?>) {
358
      HashMap<String, Object> map = (HashMap<String, Object>) params;
359
      String fName = (String) map.get(ROIMaskProcess.FILENAME);
360
      long milis = (Long) map.get(ROIMaskProcess.TIME);
361
      processFinalize(fName, milis);
362
      RasterSwingLocator.getSwingManager().showSummaryProcessDialog(fName,
363
          milis);
364
    }
365
  }
366

    
367
  private void processFinalize(String fileName, long milis) {
368
    if (!new File(fileName).exists()) return;
369

    
370
    String viewName = getViewName();
371
    if (viewName != null) {
372
      if (RasterSwingLibrary.messageBoxYesOrNot("cargar_toc", this)) {
373
        try {
374
          RasterMainPluginUtils.loadLayer(viewName, fileName, null);
375
        }
376
        catch (RasterNotLoadException e) {
377
          RasterSwingLibrary.messageBoxError("error_load_layer", null, e);
378
        }
379
      }
380
    }
381
  }
382

    
383
  private String getViewName() {
384
    FLyrRaster lyrRaster = getSelectedLayer();
385
    IWindow[] w = PluginServices.getMDIManager().getAllWindows();
386
    for (int i = 0; i < w.length; i++) {
387
      if (w[i] instanceof AbstractViewPanel) {
388
        FLayers lyrs = ((AbstractViewPanel) w[i]).getMapControl()
389
            .getMapContext().getLayers();
390
        for (int j = 0; j < lyrs.getLayersCount(); j++) {
391
          FLayer lyr = lyrs.getLayer(j);
392
          if (lyrRaster == lyr) {
393
            return PluginServices.getMDIManager()
394
                .getWindowInfo((AbstractViewPanel) w[i]).getTitle();
395
          }
396
        }
397
      }
398
    }
399
    return null;
400
  }
401

    
402
  public void interrupted() {
403

    
404
  }
405

    
406
  public class LayerElement {
407

    
408
    private FLayer lyr = null;
409

    
410
    public LayerElement(FLayer lyr) {
411
      this.lyr = lyr;
412
    }
413

    
414
    public FLayer getLayer() {
415
      return lyr;
416
    }
417

    
418
    public String toString() {
419
      return lyr.getName();
420
    }
421

    
422
    public int getNumOfElements() {
423
      if (lyr instanceof FLyrRaster)
424
        return ((FLyrRaster) lyr).getDataStore().getBandCount();
425
      return 0;
426
    }
427
  }
428

    
429
  public void updateProgress(int current, int total) {
430
    // TODO Auto-generated method stub
431

    
432
  }
433
}