Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.library / org.gvsig.raster / org.gvsig.raster.swing / org.gvsig.raster.swing.buffer / org.gvsig.raster.swing.buffer.impl / src / main / java / org / gvsig / raster / swing / buffer / impl / save / DefaultSaveBufferDialog.java @ 43876

History | View | Annotate | Download (13.7 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2017 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.raster.swing.buffer.impl.save;
24

    
25
import java.awt.Dimension;
26
import java.beans.PropertyChangeEvent;
27
import java.beans.PropertyChangeListener;
28
import java.io.File;
29
import java.util.Iterator;
30

    
31
import javax.swing.JComponent;
32
import javax.swing.JFileChooser;
33
import javax.swing.JOptionPane;
34
import javax.swing.JPanel;
35
import javax.swing.SwingUtilities;
36

    
37
import org.slf4j.Logger;
38
import org.slf4j.LoggerFactory;
39

    
40
import org.gvsig.fmap.dal.DALLocator;
41
import org.gvsig.fmap.dal.DataManager;
42
import org.gvsig.fmap.dal.DataServerExplorer;
43
import org.gvsig.fmap.dal.DataServerExplorerParameters;
44
import org.gvsig.fmap.dal.exception.DataException;
45
import org.gvsig.fmap.dal.exception.InitializeException;
46
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
47
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
48
import org.gvsig.fmap.dal.raster.NewRasterStoreParameters;
49
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
50
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
51
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
52
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
53
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
54
import org.gvsig.fmap.dal.spi.DALSPILocator;
55
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
56
import org.gvsig.fmap.dal.swing.DALSwingLocator;
57
import org.gvsig.fmap.dal.swing.dataStoreParameters.DataStoreParametersPanel;
58
import org.gvsig.fmap.dal.swing.dataStoreParameters.DataStoreParametersPanelManager;
59
import org.gvsig.raster.lib.buffer.api.Buffer;
60
import org.gvsig.raster.lib.buffer.api.BufferLocator;
61
import org.gvsig.raster.swing.buffer.save.SaveBufferDialog;
62
import org.gvsig.tools.ToolsLocator;
63
import org.gvsig.tools.dataTypes.DataTypes;
64
import org.gvsig.tools.dynform.DynFormDefinition;
65
import org.gvsig.tools.dynform.DynFormFieldDefinition;
66
import org.gvsig.tools.dynform.JDynForm;
67
import org.gvsig.tools.i18n.I18nManager;
68
import org.gvsig.tools.locator.LocatorException;
69
import org.gvsig.tools.swing.api.ToolsSwingLocator;
70
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
71

    
72
/**
73
 * @author fdiaz
74
 *
75
 */
76
public class DefaultSaveBufferDialog extends JFileChooser implements SaveBufferDialog {
77

    
78
    /**
79
     *
80
     */
81
    private static final long serialVersionUID = 3382921398256836543L;
82
    private static final Logger logger = LoggerFactory.getLogger(DefaultSaveBufferDialog.class);
83

    
84
    private Iterator<FilesystemServerExplorerProvider> fileFilters;
85
    private Buffer buffer;
86
    private DataStoreParametersPanel panelProperty;
87
    private JPanel emptyAccessoryPanel;
88

    
89

    
90
    /**
91
    *
92
    */
93
   public DefaultSaveBufferDialog() {
94
       super(BufferLocator.getBufferManager().getLastFolderUsedToSaveRaster());
95
       setAccessory(getEmptyAccessoryPanel());
96
   }
97

    
98
    /**
99
     * @param buffer
100
     *
101
     */
102
    public DefaultSaveBufferDialog(Buffer buffer) {
103
        this();
104
        setBuffer(buffer);
105
    }
106

    
107
    /* (non-Javadoc)
108
     * @see org.gvsig.tools.swing.api.Component#asJComponent()
109
     */
110
    @Override
111
    public JComponent asJComponent() {
112
        return this;
113
    }
114

    
115
    public void setFilters(Iterator<FilesystemServerExplorerProvider> fileFilters) {
116
        this.fileFilters = fileFilters;
117
    }
118

    
119

    
120
    @Override
121
    public void setBuffer(Buffer buffer) {
122
        this.buffer = buffer;
123
    }
124

    
125

    
126
    private void initializeComponents() {
127
        while (getFileFilters().hasNext()) {
128
            FilesystemServerExplorerProvider provider = (FilesystemServerExplorerProvider) fileFilters.next();
129
            if (provider.canCreate()) {
130
                this.addChoosableFileFilter(new MyFileFilter(provider));
131
            }
132
        }
133

    
134
        this.addPropertyChangeListener(new PropertyChangeListener() {
135

    
136
            @Override
137
            public void propertyChange(PropertyChangeEvent evt) {
138
                evt.getNewValue();
139

    
140
                if (evt.getNewValue() instanceof MyFileFilter) {
141
                    String dataStoreProviderName =
142
                        ((MyFileFilter) evt.getNewValue()).getFileFilter().getDataStoreProviderName();
143
                    final NewRasterStoreParameters params = getParams(dataStoreProviderName);
144

    
145
                    SwingUtilities.invokeLater(new Runnable() {
146

    
147
                        @Override
148
                        public void run() {
149
                            panelProperty = loadPanelProperties(params);
150
                            if (panelProperty != null) {
151
                                setAccessory(panelProperty.asJComponent());
152
                                Dimension dimension = getPreferredSize();
153
                                getParent().setPreferredSize(new Dimension(dimension.width * 2, dimension.height));
154
                            } else {
155
                                JPanel panel = getEmptyAccessoryPanel();
156
                                setAccessory(panel);
157
                            }
158
                            revalidate();
159
                            repaint();
160
                        }
161
                    });
162
                }
163

    
164
            }
165
        });
166

    
167

    
168
        this.setFileSelectionMode(JFileChooser.FILES_ONLY);
169
        this.setAcceptAllFileFilterUsed(false);
170

    
171
    }
172

    
173
    private Iterator<FilesystemServerExplorerProvider> getFileFilters() {
174
        if(fileFilters == null){
175

    
176
            DataManager dm = DALLocator.getDataManager();
177
            FilesystemServerExplorerParameters param;
178
            FilesystemServerExplorer explorer = null;
179
            try {
180
                param =
181
                    (FilesystemServerExplorerParameters) dm
182
                        .createServerExplorerParameters(FilesystemServerExplorer.NAME);
183
                explorer = (FilesystemServerExplorer) dm.openServerExplorer(FilesystemServerExplorer.NAME, param);
184
            } catch (Exception e) {
185
                throw new RuntimeException(e);
186
            }
187

    
188
            fileFilters = explorer.getFilters(DataServerExplorer.MODE_RASTER);
189
        }
190
        return fileFilters;
191
    }
192

    
193
    /* (non-Javadoc)
194
     * @see org.gvsig.raster.swing.buffer.save.SaveBufferPanel#getParameters()
195
     */
196
    @Override
197
    public NewRasterStoreParameters getParameters() {
198
        MyFileFilter fileFilter = (MyFileFilter) this.getFileFilter();
199
        FilesystemFileFilter fileSystemFilter = fileFilter.getFileFilter();
200
        String providerName = fileSystemFilter.getDataStoreProviderName();
201

    
202
        NewRasterStoreParameters params = getParams(providerName);
203

    
204
        File selectedFile = this.getSelectedFile();
205

    
206
        if( panelProperty!=null && panelProperty instanceof DataStoreParametersPanel){
207
            panelProperty.fetchParameters(params);
208
        }
209

    
210
        params.setBuffer(buffer);
211
        ((FilesystemStoreParameters)params).setFile(selectedFile);
212
        return params;
213
    }
214

    
215
    @Override
216
    public String getProviderName() {
217
        FilesystemFileFilter fileSystemFilter = ((MyFileFilter)getFileFilter()).getFileFilter();
218
        return fileSystemFilter.getDataStoreProviderName();
219
    }
220

    
221

    
222
    /**
223
     * @param dataStoreProviderName
224
     * @param buffer
225
     * @return
226
     */
227
    private NewRasterStoreParameters getParams(String dataStoreProviderName) {
228

    
229
        DataManagerProviderServices dataManager = null;
230
        try {
231
            dataManager = DALSPILocator.getDataManagerProviderServices();
232
        } catch (LocatorException e) {
233
            logger.warn("Can't get data manager.", e);
234
            return null;
235
        }
236

    
237
        DataServerExplorerParameters eparams = null;
238
        DataServerExplorer serverExplorer;
239
        try {
240
            serverExplorer = dataManager.openServerExplorer(FilesystemServerExplorer.NAME, eparams);
241
        } catch (ValidateDataParametersException | InitializeException | ProviderNotRegisteredException e) {
242
            logger.warn("Can't open explorer.", e);
243
            return null;
244
        }
245

    
246
        NewRasterStoreParameters params;
247
        try {
248
            params = (NewRasterStoreParameters) serverExplorer.getAddParameters(dataStoreProviderName);
249
        } catch (DataException e) {
250
            logger.warn("Can't create store parameters.", e);
251
            return null;
252
        }
253
        return params;
254

    
255
    }
256

    
257
    protected DataStoreParametersPanel loadPanelProperties(NewRasterStoreParameters params) {
258

    
259
        if (params != null) {
260
            DataStoreParametersPanelManager manager =
261
                DALSwingLocator.getDataStoreParametersPanelManager();
262
            DataStoreParametersPanel panel = manager.createDataStoreParametersPanel(params);
263
            panel.setExcludeGeometryOptions(false);
264
            JDynForm form = panel.getForm();
265
            if( form!=null ) {
266
                int cnt=0;
267
                DynFormDefinition def = form.getDefinition();
268
                for (DynFormFieldDefinition fieldDef : def.getDefinitions()) {
269
                    if( fieldDef.getType()== DataTypes.FILE && fieldDef.isMandatory() ) {
270
                        fieldDef.setHidden(true);
271
                    } else if( "providername".equalsIgnoreCase(fieldDef.getName()) ) {
272
                        fieldDef.setHidden(true);
273
                    } else if( ! fieldDef.isHidden() ) {
274
                        cnt++;
275
                    }
276
                }
277
                if (cnt==0){
278
                    return null;
279
                }
280
                form.setLayoutMode(JDynForm.USE_SEPARATORS);
281
            }
282
            return panel;
283
        }
284

    
285
        return null;
286
    }
287

    
288

    
289
    @Override
290
    public void approveSelection() {
291
        BufferLocator.getBufferManager().setLastFolderUsedToSaveRaster(this.getSelectedFile().getParentFile());
292
        super.approveSelection();
293
    }
294

    
295
    private JPanel getEmptyAccessoryPanel(){
296
        if(emptyAccessoryPanel==null){
297
            emptyAccessoryPanel = new JPanel();
298
            emptyAccessoryPanel.setPreferredSize(new Dimension(500,250));
299
        }
300
        return emptyAccessoryPanel;
301
    }
302

    
303

    
304

    
305
    /**
306
     * @author fdiaz
307
     *
308
     */
309
    private static class MyFileFilter extends javax.swing.filechooser.FileFilter {
310

    
311
        private FilesystemFileFilter fileFilter;
312

    
313
        /**
314
         * @param fileFilter
315
         */
316
        public MyFileFilter(FilesystemFileFilter fileFilter) {
317
            this.fileFilter = fileFilter;
318
        }
319

    
320
        @Override
321
        public boolean accept(File f) {
322
            if (f.isDirectory()) {
323
                return true;
324
            }
325
            return this.getFileFilter().accept(f);
326
        }
327

    
328
        @Override
329
        public String getDescription() {
330
            return this.getFileFilter().getDescription();
331
        }
332

    
333
        /**
334
         * @return the fileFilter
335
         */
336
        public FilesystemFileFilter getFileFilter() {
337
            return fileFilter;
338
        }
339

    
340
    }
341

    
342
    @Override
343
    public void showDialog(java.awt.Component parent) {
344
        initializeComponents();
345

    
346
        boolean exit = false;
347

    
348
        I18nManager i18nManager = ToolsLocator.getI18nManager();
349
        while (!exit) {
350

    
351
            if (super.showSaveDialog(parent) == SaveBufferDialog.APPROVE_OPTION) {
352

    
353
                NewRasterStoreParameters params = getParameters();
354
                String providerName = getProviderName();
355

    
356
                File file = ((FilesystemStoreParameters) params).getFile();
357
                ThreadSafeDialogsManager dlgManager = ToolsSwingLocator.getThreadSafeDialogsManager();
358
                try {
359
                    if (file.exists()) {
360
                        String message = i18nManager.getTranslation("_File_exists_Overwrite_question");
361
                        String title = i18nManager.getTranslation("_export_raster");
362
                        int confirm =
363
                            dlgManager.confirmDialog(message, title, JOptionPane.YES_NO_OPTION,
364
                                JOptionPane.QUESTION_MESSAGE);
365

    
366
                        if (confirm == JOptionPane.YES_OPTION) {
367
                            DALLocator.getDataManager().createFileStore(providerName, params, true);
368
                            exit = true;
369
                        }
370
                        continue;
371
                    } else {
372
                        DALLocator.getDataManager().createFileStore(providerName, params, true);
373
                        exit = true;
374
                    }
375
                } catch (LocatorException | DataException e) {
376
                    logger.warn("Can't export buffer from view's image.", e);
377
                    String message = i18nManager.getTranslation("_error_exporting_buffer");
378
                    String title = i18nManager.getTranslation("_export_raster");
379
                    dlgManager.messageDialog(message, title, JOptionPane.WARNING_MESSAGE);
380
                    return;
381
                }
382
            } else {
383
                exit = true;
384
            }
385
        }
386
    }
387

    
388
    @Override
389
    public Buffer getBuffer() {
390
        return buffer;
391
    }
392
}