Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / templates / examples / 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 @ 1860

History | View | Annotate | Download (13.4 KB)

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

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

    
11
import javax.swing.JComponent;
12
import javax.swing.JOptionPane;
13
import javax.swing.JPanel;
14

    
15
import org.gvsig.andami.IconThemeHelper;
16
import org.gvsig.andami.PluginServices;
17
import org.gvsig.andami.plugins.Extension;
18
import org.gvsig.andami.ui.mdiManager.IWindow;
19
import org.gvsig.app.project.documents.view.gui.AbstractViewPanel;
20
import org.gvsig.fmap.dal.coverage.RasterLibrary;
21
import org.gvsig.fmap.dal.coverage.RasterLocator;
22
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
23
import org.gvsig.fmap.dal.coverage.exception.ROIException;
24
import org.gvsig.fmap.dal.coverage.grid.ROI;
25
import org.gvsig.fmap.dal.coverage.util.FileUtils;
26
import org.gvsig.fmap.dal.exception.ReadException;
27
import org.gvsig.fmap.mapcontext.layers.FLayer;
28
import org.gvsig.fmap.mapcontext.layers.FLayers;
29
import org.gvsig.fmap.mapcontrol.MapControl;
30
import org.gvsig.gui.beans.buttonspanel.ButtonsPanel;
31
import org.gvsig.gui.beans.table.exceptions.NotInitializeException;
32
import org.gvsig.i18n.Messages;
33
import org.gvsig.raster.fmap.layers.FLyrRaster;
34
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
35
import org.gvsig.raster.roimask.swing.ROIMaskPanel;
36
import org.gvsig.raster.roimask.swing.ROIMaskSwingLocator;
37
import org.gvsig.raster.swing.RasterSwingLocator;
38
import org.gvsig.raster.swing.newlayer.CreateNewLayerPanel;
39
import org.gvsig.raster.swing.newlayer.FileNameManagement;
40
import org.gvsig.raster.swing.preview.PreviewPanel;
41
import org.gvsig.raster.tools.algorithm.base.RasterBaseAlgorithmLibrary;
42
import org.gvsig.raster.tools.algorithm.base.process.IProcessActions;
43
import org.gvsig.raster.tools.algorithm.base.process.ProcessException;
44
import org.gvsig.raster.tools.algorithm.base.process.RasterProcess;
45
import org.gvsig.raster.tools.algorithm.reproject.ReprojectProcess;
46
import org.gvsig.raster.tools.algorithm.swing.bean.LayerComboElement;
47
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
48
import org.gvsig.raster.tools.app.basic.raster.bean.endinfo.EndInfoDialog;
49
import org.gvsig.raster.util.RasterNotLoadException;
50
import org.gvsig.tools.ToolsLocator;
51
import org.gvsig.tools.extensionpoint.ExtensionPoint;
52
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55

    
56

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

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

    
89
            initilizeIcons();
90
    }
91
    
92
        public void postInitialize() {
93
        }
94

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

    
123
            MainPanel mainPanel = new MainPanel(
124
                            getROIMaskPanel().getComponent(), 
125
                            (JComponent)getNewLayerPanel());
126

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

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

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

    
236
    public boolean isVisible() {
237
        return false;
238
    }
239

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

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

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

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

    
361
        public void interrupted() {
362
                
363
        }
364
        
365
        /**
366
         * Shows a error dialog with a text and a accept button 
367
         * @param msg Message to show in the dialog
368
         * @param parentWindow Parent window
369
         */
370
        public static void messageBoxError(String msg, Object parentWindow, Exception exception) {
371
                if(exception != null) {
372
                        LoggerFactory.getLogger(ROIMaskExtension.class).debug(Messages.getText(msg), exception);
373
                }
374
                String string = Messages.getText("accept");
375
                Object[] options = {string};
376
                JOptionPane.showOptionDialog((Component)parentWindow,
377
                                        "<html>" + Messages.getText(msg).replaceAll("\n", "<br>") + "</html>",
378
                                        Messages.getText("confirmacion"),
379
                                        JOptionPane.OK_OPTION,
380
                                        JOptionPane.ERROR_MESSAGE,
381
                                        null,
382
                                        options,
383
                                        string);
384
        }
385
        
386
        public class FileNameManagementImpl implements FileNameManagement {
387
                private FileUtils fileUtils = RasterLocator.getManager().getFileUtils();
388
                
389
                public String getDefaultFilePath() {
390
                        return System.getProperty("user.home");
391
                }
392

    
393
                public List<String> getPrefixSupported() {
394
                        List<String> list = new ArrayList<String>();
395
                        list.add("tif");
396
                        return list;
397
                }
398

    
399
                public String getUniqueLayerName() {
400
                        return fileUtils.getOnlyLayerName();
401
                }
402

    
403
                public void usesUniqueLayerName() {
404
                        fileUtils.usesOnlyLayerName();
405
                }
406

    
407
        }
408
        
409
        public class LayerElement implements LayerComboElement {
410
                private FLayer     lyr  = null;
411
                public LayerElement(FLayer lyr) {
412
                        this.lyr = lyr;
413
                }
414
                
415
                public FLayer getLayer() {
416
                        return lyr;
417
                }
418
                
419
                public String toString() {
420
                        return lyr.getName();
421
                }
422
                
423
                public int getNumOfElements() {
424
                        if(lyr instanceof FLyrRaster)
425
                                return ((FLyrRaster)lyr).getDataStore().getBandCount();
426
                        return 0;
427
                }
428
        }
429
}