Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / templates / examples / org.gvsig.raster.roimask_v2_1 / org.gvsig.raster.roimask.app / org.gvsig.raster.roimask.app.client / src / main / java / org / gvsig / raster / roimask / app / ROIMaskExtension.java @ 2139

History | View | Annotate | Download (12.7 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.ArrayList;
7
import java.util.HashMap;
8
import java.util.List;
9

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

    
13
import org.gvsig.andami.IconThemeHelper;
14
import org.gvsig.andami.PluginServices;
15
import org.gvsig.andami.plugins.Extension;
16
import org.gvsig.andami.ui.mdiManager.IWindow;
17
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
18
import org.gvsig.fmap.dal.coverage.RasterLibrary;
19
import org.gvsig.fmap.dal.coverage.RasterLocator;
20
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
21
import org.gvsig.fmap.dal.coverage.exception.ROIException;
22
import org.gvsig.fmap.dal.coverage.util.FileUtils;
23
import org.gvsig.fmap.dal.exception.ReadException;
24
import org.gvsig.fmap.mapcontext.layers.FLayer;
25
import org.gvsig.fmap.mapcontext.layers.FLayers;
26
import org.gvsig.fmap.mapcontrol.MapControl;
27
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
28
import org.gvsig.gui.beans.table.exceptions.NotInitializeException;
29
import org.gvsig.i18n.Messages;
30
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
31
import org.gvsig.raster.algorithm.process.DataProcess;
32
import org.gvsig.raster.algorithm.process.IProcessActions;
33
import org.gvsig.raster.algorithm.process.ProcessException;
34
import org.gvsig.raster.fmap.layers.FLyrRaster;
35
import org.gvsig.raster.mainplugin.RasterMainPluginUtils;
36
import org.gvsig.raster.roi.ROI;
37
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
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.newlayer.FileNameManagement;
44
import org.gvsig.raster.swing.preview.PreviewPanel;
45
import org.gvsig.raster.tools.algorithm.swing.bean.LayerComboElement;
46
import org.gvsig.raster.util.RasterNotLoadException;
47
import org.gvsig.tools.ToolsLocator;
48
import org.gvsig.tools.extensionpoint.ExtensionPoint;
49
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
50
import org.slf4j.Logger;
51
import org.slf4j.LoggerFactory;
52

    
53

    
54
public class ROIMaskExtension extends Extension implements ActionListener, IProcessActions {
55
        private int                      windowWidth         = 600;
56
        private int                      windowHeight        = 370;
57
        private IWindow                  window              = null;
58
        private PreviewPanel             previewPanel        = null;
59
        private ROIMaskPreview           processPreview      = null;
60
        private ROIMaskPanel             panel               = null;
61
        private CreateNewLayerPanel      newLayerPanel       = null;
62
        private static final Logger      logger              = LoggerFactory.getLogger(ROIMaskExtension.class);
63
        
64
    public void initialize() {
65
            
66
            // Adds an entry to the TOC's floating menu to those layers defined in this extension
67
            
68
                //ExtensionPoint exPoint = ToolsLocator.getExtensionPointManager().add("My_TocActions");
69
                //exPoint.append("MyMenuEntry", "", new ROIMaskTocMenuEntry());
70

    
71
        // Adds a new tab to the "add layer" dialog
72
            
73
            //AddLayer.addWizard(ROIMaskWizard.class);
74
            
75
            // Adds a new button in the raster bar
76
            
77
                ExtensionPointManager extensionPoints = ToolsLocator.getExtensionPointManager();
78
                ExtensionPoint point = extensionPoints.add("GenericToolBarMenu");
79
                point.append("ROIMask", "", ROIMaskTocMenuEntry.getSingleton());
80
                ROIMaskTocMenuEntry.setExtension(this);
81
            
82
        Messages.addResourceFamily("org.gvsig.raster.roimask.app.i18n.text",
83
                        ROIMaskExtension.class.getClassLoader(),
84
                        ROIMaskExtension.class.getClass().getName()); 
85

    
86
            initilizeIcons();
87
    }
88
    
89
        public void postInitialize() {
90
        }
91

    
92
    public void execute(String actionCommand) {
93
            if (actionCommand.compareTo("ROIMask") == 0) {
94
                    if(getSelectedLayer() == null) {
95
                            RasterSwingLibrary.messageBoxError("layer_not_selected", null);
96
                            return;
97
                    }
98
                    try {
99
                            initializeMainPanel();
100
                    } catch (ReadException e) {
101
                            logger.error("Error initializing the main panel", e);
102
                    } catch (ROIException e) {
103
                            logger.error("Error getting ROI", e);
104
                        }
105
            }
106
    }
107
    
108
    /**
109
     * Creates and initializes the main panel
110
     * @throws ReadException
111
     * @throws ROIException 
112
     */
113
    private void initializeMainPanel() throws ReadException, ROIException {
114
            try {
115
                    loadROIMaskPanel();
116
            } catch (NotInitializeException e) {
117
                    throw new ReadException("Error loading the table", e);
118
            }
119

    
120
            MainPanel mainPanel = new MainPanel(
121
                            getROIMaskPanel().getComponent(), 
122
                            (JComponent)getNewLayerPanel());
123

    
124
            window = new ROIMaskWindow(
125
                            mainPanel, 
126
                            (JPanel)getPreviewPanel(), 
127
                            Messages.getText("roimask"), 
128
                            windowWidth, 
129
                            windowHeight,
130
                            false,
131
                            this);
132

    
133
            PluginServices.getMDIManager().addWindow(window);
134
            getPreviewPanel().previewInitializeSizes();
135
            getPreviewPanel().refreshPreview();
136
    }
137
    
138
    /**
139
     * Loads the main panel with the data
140
     * @throws NotInitializeException 
141
     * @throws ROIException 
142
     */
143
    private void loadROIMaskPanel() throws NotInitializeException, ROIException {
144
            FLyrRaster lyr = getSelectedLayer();
145
            LayerElement element = new LayerElement(lyr);
146
            getROIMaskPanel().getDataModel().setInputLayer(element);
147
            
148
            if(lyr.getDataStore().getDataType()[0] == Buffer.TYPE_BYTE &&
149
                    (lyr.getDataStore().getBandCount() == 3 || lyr.getDataStore().getBandCount() == 4)) {
150
                    getROIMaskPanel().activeSlider(true);
151
            } else
152
                    getROIMaskPanel().activeSlider(false);
153
            
154
            if(lyr.getRois() == null || lyr.getRois().size() == 0)
155
                    getROIMaskPanel().showWarning(true);
156
            else
157
                    getROIMaskPanel().showWarning(false);
158
            
159
                getROIMaskPanel().getDataModel().clearROIs();
160
                
161
            List<ROI> roisArray = lyr.getRois();
162
                if (roisArray != null) {
163
                        for (int i = 0; i < roisArray.size(); i++) {
164
                                ROI roi = (ROI) roisArray.get(i);
165
        
166
                                Object row[] = {"", "", ""};
167
                                
168
                                boolean active = false;
169
                                
170
                                row[0] = new Boolean(active);
171
                                row[1] = roi.getName(); 
172
                                row[2] = new Integer(i);
173
                                getROIMaskPanel().getDataModel().addROI(row);
174
                        }
175
                }
176
                
177
                if(lyr != null) {
178
                        switch(lyr.getDataStore().getDataType()[0]) {
179
                        case Buffer.TYPE_BYTE:
180
                                getROIMaskPanel().getDataModel().setValueNoData(RasterLibrary.defaultByteNoDataValue);
181
                                break;
182
                        case Buffer.TYPE_SHORT:
183
                                getROIMaskPanel().getDataModel().setValueNoData(RasterLibrary.defaultShortNoDataValue);
184
                                break;
185
                        case Buffer.TYPE_INT:
186
                                getROIMaskPanel().getDataModel().setValueNoData(RasterLibrary.defaultIntegerNoDataValue);
187
                                break;
188
                        case Buffer.TYPE_FLOAT:
189
                                getROIMaskPanel().getDataModel().setValueNoData(RasterLibrary.defaultFloatNoDataValue);
190
                                break;
191
                        case Buffer.TYPE_DOUBLE:
192
                                getROIMaskPanel().getDataModel().setValueNoData(RasterLibrary.defaultDoubleNoDataValue);
193
                                break;
194
                        }
195
                }
196
    }
197

    
198
    
199
    /**
200
     * Gets the list of layers from the gvSIG view
201
     * @return
202
     */
203
    private FLayers getLayers() {
204
        MapControl mapControl = null;
205
        IWindow[] windowList = PluginServices.getMDIManager().getAllWindows();
206
        for (int i = 0; i < windowList.length; i++) {
207
            if (windowList[i] instanceof AbstractViewPanel)
208
                mapControl = ((AbstractViewPanel) windowList[i]).getMapControl();
209
        }
210
        if (mapControl != null)
211
            return mapControl.getMapContext().getLayers();
212
        return null;
213
    }
214
    
215
    /**
216
     * Gets the selected layer
217
     * @return
218
     */
219
    private FLyrRaster getSelectedLayer() {
220
            FLayers lyrs = getLayers();
221
            for (int i = 0; i < lyrs.getLayersCount(); i++) {
222
                        FLayer lyr = lyrs.getLayer(i);
223
                        if(lyr.isActive() && lyr instanceof FLyrRaster)
224
                                return (FLyrRaster)lyr;
225
                }
226
            return null;
227
    }
228
    
229
    public boolean isEnabled() {
230
        return false;
231
    }
232

    
233
    public boolean isVisible() {
234
        return false;
235
    }
236

    
237
    void initilizeIcons() {
238
                IconThemeHelper.registerIcon(null, "gvsig-icon", this);
239
                IconThemeHelper.registerIcon(null, "mask-icon", this);
240
    }
241
    
242
    /**
243
     * Gets the {@link ROIMaskPanel}
244
     * @return {@link ROIMaskPanel}
245
     */
246
    private CreateNewLayerPanel getNewLayerPanel() {
247
            if(newLayerPanel == null)
248
                     newLayerPanel = RasterSwingLocator.getSwingManager().createNewLayerPanel(
249
                                     new FileNameManagementImpl(),
250
                                     Messages.getText("create_output_layer"));
251
            return newLayerPanel;
252
    }
253
    
254
    /**
255
     * Gets the {@link PreviewPanel}
256
     * @return {@link PreviewPanel}
257
     */
258
    private PreviewPanel getPreviewPanel() {
259
            if(previewPanel == null)
260
                    previewPanel = RasterSwingLocator.getSwingManager().createSinglePreviewPanel(null, getDataSourcePreview());
261
            return previewPanel;
262
    }
263
    
264
    /**
265
     * Gets the {@link ROIMaskPreview}
266
     * @return {@link ROIMaskPreview}
267
     */
268
    private ROIMaskPreview getDataSourcePreview() {
269
            if(processPreview == null) {
270
                    processPreview = new ROIMaskPreview();
271
            }
272
            processPreview.setData(getROIMaskPanel().getDataModel());
273
            return processPreview;
274
    }
275
    
276
    /**
277
     * Gets the {@link ROIMaskPanel}
278
     * @return {@link ROIMaskPanel}
279
     */
280
    private ROIMaskPanel getROIMaskPanel() {
281
            if(panel == null) {
282
                    panel = ROIMaskSwingLocator.getSwingManager().createROIMaskPanel();
283
                    panel.addListener(this);
284
            }
285
            return panel;
286
    }
287

    
288
        public void actionPerformed(ActionEvent e) {
289
                if(window != null && 
290
                        (e.getSource() == ((ROIMaskWindow)window).getButtonsPanel().getButton(ButtonsPanel.BUTTON_ACCEPT) ||
291
                        e.getSource() == ((ROIMaskWindow)window).getButtonsPanel().getButton(ButtonsPanel.BUTTON_APPLY))) {
292
                        DataProcess task = null;
293
                        try {
294
                                task = RasterBaseAlgorithmLibrary.getManager().createRasterTask("ROIMaskProcess");
295
                        } catch (ProcessException e1) {
296
                                RasterSwingLibrary.messageBoxError("error_processing_layer", null, e1);
297
                        }
298
                        task.setActions(this);
299
                        try {
300
                                getDataSourcePreview().addParams(task, 
301
                                                getNewLayerPanel().getDirectorySelected(), 
302
                                                getNewLayerPanel().getFileSelected());
303
                        } catch (ROIException e1) {
304
                                RasterSwingLibrary.messageBoxError("error_processing_layer", null, e1);
305
                        }
306
                        task.start();
307
                        return;
308
                }
309
                
310
                getPreviewPanel().refreshPreview();
311
        }
312
        
313

    
314
        @SuppressWarnings("unchecked")
315
        public void end(Object params) {
316
                if(params instanceof HashMap<?, ?>) {
317
                        HashMap<String, Object>  map = (HashMap<String, Object>) params;
318
                        String fName = (String)map.get(ROIMaskProcess.FILENAME);
319
                        long milis = (Long)map.get(ROIMaskProcess.TIME);
320
                        processFinalize(fName, milis);
321
                        RasterSwingLocator.getSwingManager().showSummaryProcessDialog(fName, milis);
322
                }
323
        }
324
        
325
        private void processFinalize(String fileName, long milis) {
326
                if (!new File(fileName).exists())
327
                        return;
328

    
329
                String viewName = getViewName();
330
                if(viewName != null) {
331
                        if (RasterSwingLibrary.messageBoxYesOrNot("cargar_toc", this)) {
332
                                try {
333
                                        RasterMainPluginUtils.loadLayer(viewName, fileName, null);
334
                                } catch (RasterNotLoadException e) {
335
                                        RasterSwingLibrary.messageBoxError("error_load_layer", null, e);
336
                                }
337
                        }
338
                }
339
        }
340
        
341
        private String getViewName() {
342
                FLyrRaster lyrRaster = getSelectedLayer();
343
                IWindow[] w = PluginServices.getMDIManager().getAllWindows();
344
                for (int i = 0; i < w.length; i++) {
345
                        if(w[i] instanceof AbstractViewPanel) {
346
                                FLayers lyrs = ((AbstractViewPanel)w[i]).getMapControl().getMapContext().getLayers();
347
                                for (int j = 0; j < lyrs.getLayersCount(); j++) {
348
                                        FLayer lyr = lyrs.getLayer(j);
349
                                        if(lyrRaster == lyr) {
350
                                                return PluginServices.getMDIManager().getWindowInfo((AbstractViewPanel) w[i]).getTitle();
351
                                        }
352
                                }
353
                        }
354
                }
355
                return null;
356
        }
357

    
358
        public void interrupted() {
359
                
360
        }
361
        
362
        public class FileNameManagementImpl implements FileNameManagement {
363
                private FileUtils fileUtils = RasterLocator.getManager().getFileUtils();
364
                
365
                public String getDefaultFilePath() {
366
                        return System.getProperty("user.home");
367
                }
368

    
369
                public List<String> getPrefixSupported() {
370
                        List<String> list = new ArrayList<String>();
371
                        list.add("tif");
372
                        return list;
373
                }
374

    
375
                public String getUniqueLayerName() {
376
                        return fileUtils.getOnlyLayerName();
377
                }
378

    
379
                public void usesUniqueLayerName() {
380
                        fileUtils.usesOnlyLayerName();
381
                }
382

    
383
        }
384
        
385
        public class LayerElement implements LayerComboElement {
386
                private FLayer     lyr  = null;
387
                public LayerElement(FLayer lyr) {
388
                        this.lyr = lyr;
389
                }
390
                
391
                public FLayer getLayer() {
392
                        return lyr;
393
                }
394
                
395
                public String toString() {
396
                        return lyr.getName();
397
                }
398
                
399
                public int getNumOfElements() {
400
                        if(lyr instanceof FLyrRaster)
401
                                return ((FLyrRaster)lyr).getDataStore().getBandCount();
402
                        return 0;
403
                }
404
        }
405

    
406
        public void updateProgress(int current, int total) {
407
                // TODO Auto-generated method stub
408
                
409
        }
410
}