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

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
    
86
        public void postInitialize() {
87
                new ToolboxROIMaskLoader().registerTool();
88
        }
89

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

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

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

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

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

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

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

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

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

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

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

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