Statistics
| Revision:

gvsig-raster / org.gvsig.raster.multifile / trunk / org.gvsig.raster.multifile / org.gvsig.raster.multifile.app.multifileclient / src / main / java / org / gvsig / raster / multifile / app / panel / AbstractBandSelectorListener.java @ 4181

History | View | Annotate | Download (9.12 KB)

1
package org.gvsig.raster.multifile.app.panel;
2

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

    
11
import javax.swing.JOptionPane;
12

    
13
import org.gvsig.gui.beans.swing.JFileChooser;
14
import org.gvsig.fmap.dal.DALLocator;
15
import org.gvsig.fmap.dal.DataServerExplorer;
16
import org.gvsig.fmap.dal.DataServerExplorerParameters;
17
import org.gvsig.fmap.dal.coverage.RasterLocator;
18
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
19
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
20
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
21
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
22
import org.gvsig.fmap.dal.coverage.store.parameter.RasterDataParameters;
23
import org.gvsig.fmap.dal.coverage.util.ProviderServices;
24
import org.gvsig.fmap.dal.exception.CloseException;
25
import org.gvsig.fmap.dal.serverexplorer.filesystem.swing.FilesystemExplorerWizardPanel;
26
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
27
import org.gvsig.i18n.Messages;
28
import org.gvsig.raster.multifile.io.MultiFileDataParameters;
29
import org.gvsig.raster.multifile.io.MultiFileFormat;
30
import org.gvsig.raster.multifile.io.MultiFileProvider;
31
import org.gvsig.raster.swing.RasterSwingLibrary;
32
import org.gvsig.raster.swing.basepanel.ButtonsPanelListener;
33
import org.gvsig.tools.locator.LocatorException;
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

    
37
/**
38
 * Listener for <code>BandSelectorPanel</code>. This interface is implemented by two listeners
39
 * , the new layer listener and the properties panel listener.
40
 * @author Nacho Brodin (nachobrodin@gmail.com)
41
 */
42
public abstract class AbstractBandSelectorListener implements ActionListener, ButtonsPanelListener {
43
        protected Logger                log              = LoggerFactory.getLogger(AbstractBandSelectorListener.class);
44
        protected BandSelectorPanel     bandSetupPanel   = null;
45
        protected boolean               enabled          = true;
46
        protected String                file             = null;
47
        protected String                folder           = null;
48

    
49
        /**
50
         * Constructor
51
         * @param bs Panel del selector de bandas
52
         * @param lyr Capa raster
53
         */
54
        public AbstractBandSelectorListener(BandSelectorPanel bs) {
55
                this.bandSetupPanel = bs;
56
                bs.getFileList().getJButtonAdd().addActionListener(this);
57
                bs.getFileList().getJButtonRemove().addActionListener(this);
58
                bs.getNumBandSelectorCombo().addActionListener(this);
59
        }
60

    
61
        public void setDestination(String file, String folder) {
62
                this.file = file;
63
                this.folder = folder;
64
        }
65

    
66
        /**
67
         * Enables or disables the panel action
68
         */
69
        public void setEnabledPanelAction(boolean enabled) {
70
                this.enabled = enabled;
71
        }
72

    
73
        /**
74
         * Sets the band position when these are rendered. The position is read from
75
         * the band table
76
         */
77
        public abstract void setNewBandsPositionInRendering();
78

    
79
        public abstract RasterDataStore getResult();
80

    
81
        /**
82
         * Actions when is applied
83
         */
84
        public abstract void apply();
85

    
86
        public abstract void addFileBand();
87

    
88
        public abstract void delFileBand();
89

    
90
        /**
91
         * Listener para la gesti?n de los botones de a?adir, eliminar fichero y
92
         * el combo de selecci?n de bandas.
93
         */
94
        public void actionPerformed(ActionEvent e) {
95

    
96
                if (e.getSource().equals(bandSetupPanel.getFileList().getJButtonAdd()))
97
                        addFileBand();
98

    
99
                if (e.getSource().equals(bandSetupPanel.getFileList().getJButtonRemove()))
100
                        delFileBand();
101
        }
102

    
103
        protected JFileChooser createJFileChooser() {
104
                JFileChooser fileChooser = new JFileChooser(
105
                                FilesystemExplorerWizardPanel.OPEN_LAYER_FILE_CHOOSER_ID,
106
                                JFileChooser.getLastPath(FilesystemExplorerWizardPanel.OPEN_LAYER_FILE_CHOOSER_ID, null));
107
                fileChooser.setMultiSelectionEnabled(true);
108
                fileChooser.setAcceptAllFileFilterUsed(false);
109

    
110
                fileChooser.addChoosableFileFilter(new DriverFileFilter());
111
                return fileChooser;
112
        }
113

    
114
        protected boolean checkStoresCompatibility(RasterDataStore mainRasterStore, List<File> fileList) {
115
                for (int i = fileList.size() - 1; i >= 0; i--) {
116
                        //Checks extents
117
                        try {
118
                                if(!checkNewFile(mainRasterStore, fileList.get(i).getAbsolutePath())) {
119
                                        JOptionPane.showMessageDialog(null, Messages.getText("extents_no_coincidentes") +  " " + fileList.get(i).getAbsolutePath(), "", JOptionPane.ERROR_MESSAGE);
120
                                        fileList.remove(i);
121
                                }
122
                        } catch (Exception e) {
123
                                log.debug("Problems check the bounding boxes", e);
124
                        }
125
                }
126

    
127
                if(mainRasterStore.isTiled()) {
128
                        if(!RasterSwingLibrary.messageBoxYesOrNot(Messages.getText("store_tiled"), this)) {
129
                                return false;
130
                        }
131
                }
132

    
133
                return true;
134
        }
135

    
136
        /**
137
         * Creates a multifile data provider
138
         * @param layerName
139
         * @param path
140
         * @return
141
         */
142
        protected MultiFileProvider createMultiFileProvider(String layerName, String path) {
143
                DataManagerProviderServices dataManager = (DataManagerProviderServices)DALLocator.getDataManager();
144

    
145
                try {
146
                        //It creates the new Multifile provider
147
                        DataServerExplorerParameters explParams = dataManager.createServerExplorerParameters(MultiFileProvider.NAME);
148
                        DataServerExplorer explorer = dataManager.openServerExplorer(MultiFileProvider.NAME, explParams);
149
                        MultiFileDataParameters newParamsMultifile = (MultiFileDataParameters)dataManager.createStoreParameters(explorer.getProviderName());
150

    
151
                        if(!path.endsWith(File.separator))
152
                                path = path + File.separator;
153
                        File fileURI = new File(path + layerName + ".mff");
154
                        File rmfURI = new File(path + layerName + ".rmf");
155
                        int counter = 0;
156
                        while(fileURI.exists() || rmfURI.exists()) {
157
                                fileURI = new File(path + layerName + "_" + counter + ".mff");
158
                                rmfURI = new File(path + layerName + "_" + counter + ".rmf");
159
                                counter ++;
160
                        }
161
                        if(counter > 0)
162
                                layerName += "_" + counter;
163

    
164
                        newParamsMultifile.setURI(fileURI.toURI());
165

    
166
                        return (MultiFileProvider)dataManager.createProvider(null, newParamsMultifile);
167
                } catch (Exception exc) {
168
                        RasterSwingLibrary.messageBoxError(Messages.getText("addband_error"), bandSetupPanel, exc);
169
                }
170
                return null;
171
        }
172

    
173
        /**
174
         * Comprobar si la asignacion de color es correcta para las 4 bandas. No puede
175
         * existir una banda con distintas interpretaciones de color. Se comprueban dos
176
         * casos, asignaciones en escala de grises o en RGB.
177
         * @param r
178
         * @param g
179
         * @param b
180
         * @param a
181
         * @return
182
         */
183
        protected boolean isCorrectAssignedBand(int r, int g, int b, int a) {
184
                // Si es gris es correcta la asignacion
185
                if ((r == g) && (r == b) && (r >= 0)) {
186
                        // Si el alpha esta asignado a la misma banda es incorrecto
187
                        if (r == a)
188
                                return false;
189
                        // En caso contrario es correcto
190
                        return true;
191
                }
192

    
193
                // Si dos bandas coinciden, se dice que no es correcta la asignacion
194
                int list[] = { r, g, b, a };
195
                for (int i = 0; i <= 3; i++)
196
                        for (int j = 0; j <= 3; j++)
197
                                if ((i != j) && (list[i] == list[j]) && (list[i] > -1))
198
                                        return false;
199

    
200
                return true;
201
        }
202

    
203
        /**
204
         * Checks if the new file is compatible with the old one
205
         * @param file
206
         * @return
207
         * @throws LocatorException
208
         * @throws NotSupportedExtensionException
209
         * @throws RasterDriverException
210
         * @throws CloseException
211
         */
212
        protected boolean checkNewFile(RasterDataStore oldStore, String file) throws LocatorException, NotSupportedExtensionException, RasterDriverException, CloseException {
213
                Rectangle2D extentOrigin = oldStore.getExtent().toRectangle2D();
214

    
215
                ProviderServices provServ = RasterLocator.getManager().getProviderServices();
216
                RasterDataParameters storeParameters = provServ.createParameters(file);
217
                storeParameters.setSRS(oldStore.getProjection());
218
                RasterDataStore dataStore = RasterLocator.getManager().getProviderServices().open(storeParameters);
219

    
220
                Extent extentNewFile = dataStore.getExtent();
221

    
222
                // Comprobamos que el extent y tama?o del fichero a?adido sea igual al
223
                // fichero original. Si no es as? no abrimos la capa y mostramos un aviso
224

    
225
                double widthNewFile = (extentNewFile.getMax().getX() - extentNewFile.getMin().getX());
226
                double heightNewFile = (extentNewFile.getMax().getY() - extentNewFile.getMin().getY());
227

    
228
                if ((widthNewFile - extentOrigin.getWidth()) > 1.0 || (widthNewFile - extentOrigin.getWidth()) < -1.0 || (heightNewFile - extentOrigin.getHeight()) > 1.0
229
                                || (heightNewFile - extentOrigin.getHeight()) < -1.0) {
230
                        return false;
231
                }
232

    
233
                if ((extentNewFile.getMax().getX() - extentNewFile.getMin().getX()) != extentOrigin.getWidth()
234
                                || (extentNewFile.getMax().getY() - extentNewFile.getMin().getY()) != extentOrigin.getHeight()) {
235
                        return false;
236
                }
237

    
238
                dataStore.close();
239
                return true;
240
        }
241

    
242
        /**
243
         * Saves the new layer in disk
244
         * @param layerName
245
         * @param file
246
         * @param uriList
247
         * @throws IOException
248
         */
249
        protected String saveMultiFileLayer(String layerName, String file, ArrayList<File> uriList) throws IOException {
250
                String path = file.substring(0, file.lastIndexOf(File.separator) + 1);
251
                path = path + layerName + ".mff";
252

    
253
                /*File filePath = new File(path);
254
                if(filePath.exists()) {
255
                        RasterToolsUtil.messageBoxInfo("file_exists_rename", bandSetupPanel);
256
                        filePath.renameTo(new File(path + "~"));
257
                }*/
258

    
259
                MultiFileFormat format = new MultiFileFormat();
260
                for (int i = 0; i < uriList.size(); i++) {
261
                        format.addFile(uriList.get(i));
262
                }
263
                format.setName(layerName);
264

    
265
                format.write(path);
266
                return path;
267
        }
268

    
269
}