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 @ 2374

History | View | Annotate | Download (12.1 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.mainplugin.RasterMainPluginUtils;
34
import org.gvsig.raster.roi.ROI;
35
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
36
import org.gvsig.raster.roimask.app.toolbox.ToolboxROIMaskLoader;
37
import org.gvsig.raster.roimask.swing.ROIMaskPanel;
38
import org.gvsig.raster.roimask.swing.ROIMaskSwingLocator;
39
import org.gvsig.raster.swing.RasterSwingLibrary;
40
import org.gvsig.raster.swing.RasterSwingLocator;
41
import org.gvsig.raster.swing.newlayer.CreateNewLayerPanel;
42
import org.gvsig.raster.swing.preview.PreviewPanel;
43
import org.gvsig.raster.util.RasterNotLoadException;
44
import org.gvsig.tools.ToolsLocator;
45
import org.gvsig.tools.extensionpoint.ExtensionPoint;
46
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
47
import org.slf4j.Logger;
48
import org.slf4j.LoggerFactory;
49

    
50

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

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

    
83
            initilizeIcons();
84
            
85
            //new ToolboxROIMaskLoader().registerTool();
86
    }
87
    
88
        public void postInitialize() {
89
        }
90

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

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

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

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

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

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

    
236
    void initilizeIcons() {
237
                IconThemeHelper.registerIcon(null, "gvsig-icon", this);
238
                IconThemeHelper.registerIcon(null, "mask-icon", this);
239
                IconThemeHelper.registerIcon(null, "gvsig-icon16x16", 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
                                     Messages.getText("create_output_layer"));
250
            return newLayerPanel;
251
    }
252
    
253
    /**
254
     * Gets the {@link PreviewPanel}
255
     * @return {@link PreviewPanel}
256
     */
257
    private PreviewPanel getPreviewPanel() {
258
            if(previewPanel == null)
259
                    previewPanel = RasterSwingLocator.getSwingManager().createSinglePreviewPanel(null, getDataSourcePreview());
260
            return previewPanel;
261
    }
262
    
263
    /**
264
     * Gets the {@link ROIMaskPreview}
265
     * @return {@link ROIMaskPreview}
266
     */
267
    private ROIMaskPreview getDataSourcePreview() {
268
            if(processPreview == null) {
269
                    processPreview = new ROIMaskPreview();
270
            }
271
            processPreview.setData(getROIMaskPanel().getDataModel());
272
            return processPreview;
273
    }
274
    
275
    /**
276
     * Gets the {@link ROIMaskPanel}
277
     * @return {@link ROIMaskPanel}
278
     */
279
    private ROIMaskPanel getROIMaskPanel() {
280
            if(panel == null) {
281
                    panel = ROIMaskSwingLocator.getSwingManager().createROIMaskPanel();
282
                    panel.addListener(this);
283
            }
284
            return panel;
285
    }
286

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

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

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

    
356
        public void interrupted() {
357
                
358
        }
359
        
360
        public class LayerElement {
361
                private FLayer     lyr  = null;
362
                public LayerElement(FLayer lyr) {
363
                        this.lyr = lyr;
364
                }
365
                
366
                public FLayer getLayer() {
367
                        return lyr;
368
                }
369
                
370
                public String toString() {
371
                        return lyr.getName();
372
                }
373
                
374
                public int getNumOfElements() {
375
                        if(lyr instanceof FLyrRaster)
376
                                return ((FLyrRaster)lyr).getDataStore().getBandCount();
377
                        return 0;
378
                }
379
        }
380

    
381
        public void updateProgress(int current, int total) {
382
                // TODO Auto-generated method stub
383
                
384
        }
385
}