Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / fmap / dal / serverexplorer / filesystem / swing / FilesystemExplorerWizardPanelController.java @ 43256

History | View | Annotate | Download (15.3 KB)

1
package org.gvsig.fmap.dal.serverexplorer.filesystem.swing;
2

    
3
import org.gvsig.fmap.dal.swing.dataStoreParameters.DataStoreParametersPanelManager;
4
import org.gvsig.fmap.dal.swing.dataStoreParameters.DataStoreParametersPanel;
5
import java.awt.Component;
6
import java.awt.Window;
7
import java.awt.event.ActionEvent;
8
import java.awt.event.ActionListener;
9
import java.io.File;
10
import java.util.ArrayList;
11
import java.util.Iterator;
12
import java.util.List;
13
import java.util.Locale;
14

    
15
import javax.swing.DefaultListSelectionModel;
16
import javax.swing.JFileChooser;
17
import javax.swing.ListSelectionModel;
18
import javax.swing.event.ListSelectionEvent;
19
import javax.swing.event.ListSelectionListener;
20

    
21
import org.cresques.cts.IProjection;
22
import org.slf4j.Logger;
23
import org.slf4j.LoggerFactory;
24

    
25
import org.gvsig.andami.messages.NotificationManager;
26
import org.gvsig.app.ApplicationLocator;
27
import org.gvsig.app.ApplicationManager;
28
import org.gvsig.app.prepareAction.PrepareContext;
29
import org.gvsig.filedialogchooser.FileDialogChooser;
30
import org.gvsig.fmap.dal.DataStoreParameters;
31
import org.gvsig.fmap.dal.exception.DataException;
32
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
33
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
34
import org.gvsig.fmap.dal.serverexplorer.filesystem.swing.FilesystemExplorerWizardPanel.MyFileFilter;
35
import org.gvsig.fmap.dal.swing.DALSwingLocator;
36
import org.gvsig.fmap.mapcontext.MapContext;
37
import org.gvsig.tools.ToolsLocator;
38
import org.gvsig.tools.dynobject.DynObject;
39
import org.gvsig.tools.i18n.I18nManager;
40
import org.gvsig.tools.util.ToolsUtilLocator;
41

    
42

    
43
/**
44
 * @author fdiaz
45
 *
46
 */
47
public class FilesystemExplorerWizardPanelController extends FilesystemExplorerWizardPanelView {
48

    
49

    
50
    /**
51
     *
52
     */
53
    private static final long serialVersionUID = -2351856603294610783L;
54

    
55
    @SuppressWarnings("unused")
56
    private static final Logger LOG = LoggerFactory
57
        .getLogger(FilesystemExplorerWizardPanelController.class);
58

    
59
    /**
60
     *
61
     */
62
    public static final String OPEN_LAYER_FILE_CHOOSER_ID = "OPEN_LAYER_FILE_CHOOSER_ID";
63

    
64
    private static final String DEFAULT_FILTER = "All_supported";
65

    
66
    protected FilesystemServerExplorer explorer;
67
    private ArrayList<MyFileFilter> filters;
68
    protected MapContext mapContext;
69
    protected int selectedIndex;
70
    private static MyFileFilter lastFilter = null;
71

    
72
    /**
73
     * @param mapContext
74
     * @param explorer
75
     * @param filters
76
     */
77
    public FilesystemExplorerWizardPanelController(MapContext mapContext, FilesystemServerExplorer explorer, ArrayList<MyFileFilter> filters) {
78
        this.mapContext = mapContext;
79
        this.explorer = explorer;
80
        this.filters = filters;
81
        this.selectedIndex = -1;
82

    
83
        initComponents();
84
        translate();
85
    }
86

    
87
    private void translate() {
88
        I18nManager i18nManager = ToolsLocator.getI18nManager();
89
        btnAdd.setText(i18nManager.getTranslation("Anadir"));
90
        btnProperties.setText(i18nManager.getTranslation("Properties"));
91
        btnRemove.setText(i18nManager.getTranslation("Eliminar"));
92
        btnUp.setText(i18nManager.getTranslation("arriba"));
93
        btnDown.setText(i18nManager.getTranslation("abajo"));
94
    }
95

    
96
    /**
97
     * @param locale
98
    *
99
    */
100
    public void setLocate(Locale locale) {
101
        Locale l = super.getLocale();
102
        if (!l.equals(locale)) {
103
            translate();
104
        }
105
        super.setLocale(locale);
106
    }
107

    
108
    private void initComponents() {
109

    
110
        this.btnAdd.addActionListener(new ActionListener() {
111
            public void actionPerformed(ActionEvent e) {
112
                doAdd();
113
            }
114
        });
115

    
116
        this.btnProperties.addActionListener(new ActionListener() {
117
            public void actionPerformed(ActionEvent e) {
118
                doOpenProperties();
119
            }
120
        });
121

    
122
        this.btnRemove.addActionListener(new ActionListener() {
123
            public void actionPerformed(ActionEvent e) {
124
                doRemove();
125
            }
126
        });
127

    
128
        this.btnUp.addActionListener(new ActionListener() {
129
            public void actionPerformed(ActionEvent e) {
130
                doUp();
131
            }
132
        });
133

    
134
        this.btnDown.addActionListener(new ActionListener() {
135
            public void actionPerformed(ActionEvent e) {
136
                doDown();
137
            }
138
        });
139

    
140
        I18nManager i18nManager = ToolsLocator.getI18nManager();
141

    
142
        this.tableFiles.setModel(new FilesystemExplorerWizardTableModel());
143
        this.tableFiles.getColumn(
144
            i18nManager.getTranslation(FilesystemExplorerWizardTableModel.COLUMN_STORE_PARAMETERS_NAME))
145
            .setCellRenderer(new FilesystemStoreParameteresCellRenderer(mapContext));
146
        this.tableFiles.getColumn(
147
            i18nManager.getTranslation(FilesystemExplorerWizardTableModel.COLUMN_TILED_NAME)).setMaxWidth(80);
148
        this.tableFiles.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
149
        this.tableFiles.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
150

    
151
            public void valueChanged(ListSelectionEvent e) {
152
                handleSelectionEvent(e);
153
            }
154
        });
155
    }
156

    
157

    
158
    protected void updateComponents() {
159
        btnUp.setEnabled(selectedIndex > 0 && selectedIndex < tableFiles.getRowCount());
160
        btnDown.setEnabled(selectedIndex >= 0 && selectedIndex < (tableFiles.getRowCount() - 1));
161
        btnProperties.setEnabled(selectedIndex >= 0 && selectedIndex < tableFiles.getRowCount());
162
        btnRemove.setEnabled(selectedIndex >= 0 && selectedIndex < tableFiles.getRowCount());
163
    }
164

    
165
    protected void handleSelectionEvent(ListSelectionEvent e){
166
        if (e.getValueIsAdjusting())
167
            return;
168

    
169
        final DefaultListSelectionModel target = (DefaultListSelectionModel)e.getSource();
170
        selectedIndex = target.getAnchorSelectionIndex();
171

    
172
        updateComponents();
173
    }
174

    
175
    protected void doAdd() {
176

    
177
        List<FilesystemStoreParameters> list = chooseFilesParameters();
178
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel) this.tableFiles.getModel();
179

    
180
        for (FilesystemStoreParameters filesystemStoreParameters : list) {
181
            model.add(filesystemStoreParameters, false);
182
            updateTable();
183
            int index = model.getRowCount()-1;
184
            this.tableFiles.getSelectionModel().setSelectionInterval(index, index);
185
        }
186
    }
187

    
188
    protected void doRemove() {
189
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel)this.tableFiles.getModel();
190
        if(selectedIndex>=0 && selectedIndex<model.getRowCount()){
191
            int index = selectedIndex;
192
            model.remove(index);
193
            updateTable();
194
            if(index>(model.getRowCount()-1)) {
195
                index = model.getRowCount()-1;
196
            };
197
            this.tableFiles.getSelectionModel().setSelectionInterval(index, index);
198
        }
199
    }
200

    
201
    protected void doOpenProperties() {
202
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel) this.tableFiles.getModel();
203
        if (selectedIndex >= 0 && selectedIndex < model.getRowCount()) {
204
            int index = selectedIndex;
205
            FilesystemStoreParameters parameters = model.getParams(index);
206
            showPropertiesDialog((DynObject) parameters);
207
            updateTable();
208
            this.tableFiles.getSelectionModel().setSelectionInterval(index, index);
209
        }
210
    }
211

    
212
    protected void doUp() {
213
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel)this.tableFiles.getModel();
214
        if(selectedIndex>0 && selectedIndex<model.getRowCount()){
215
            int index = selectedIndex;
216
            model.up(index);
217
            updateTable();
218

    
219
            this.tableFiles.getSelectionModel().setSelectionInterval(index-1, index-1);
220
        }
221
    }
222

    
223
    protected void doDown() {
224
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel)this.tableFiles.getModel();
225
        if(selectedIndex>=0 && selectedIndex<model.getRowCount()-1){
226
            int index = selectedIndex;
227
            model.down(index);
228
            updateTable();
229
            this.tableFiles.getSelectionModel().setSelectionInterval(index+1, index+1);
230
        }
231
    }
232

    
233
    protected void showPropertiesDialog(final DynObject parameters) {
234
        DataStoreParametersPanelManager manager = DALSwingLocator.getDataStoreParametersPanelManager();
235
        DataStoreParametersPanel panel = manager.createDataStoreParametersPanel(parameters);
236
        panel.setExcludeGeometryOptions(false);
237
        manager.showPropertiesDialog(parameters, panel);
238
    }
239

    
240
    private void updateTable(){
241
        ((FilesystemExplorerWizardTableModel)this.tableFiles.getModel()).fireTableDataChanged();
242
        updateRowHeights();
243
    }
244

    
245
    private void updateRowHeights() {
246

    
247
        /*
248
         * Auto adjust the height of rows in a JTable.
249
         * The only way to know the row height for sure is to render each cell
250
         * to determine the rendered height. After your table is populated with
251
         * data you can do:
252
         *
253
         */
254
        for (int row = 0; row < this.tableFiles.getRowCount(); row++) {
255
            int rowHeight = this.tableFiles.getRowHeight();
256
            for (int column = 0; column < this.tableFiles.getColumnCount(); column++)
257
            {
258
                Component comp = this.tableFiles.prepareRenderer(this.tableFiles.getCellRenderer(row, column), row, column);
259
                rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
260
            }
261
            this.tableFiles.setRowHeight(row, rowHeight);
262
        }
263
    }
264

    
265

    
266
     private List<FilesystemStoreParameters> chooseFilesParameters() {
267

    
268
        FileDialogChooser fileChooser = ToolsUtilLocator.getFileDialogChooserManager().create(OPEN_LAYER_FILE_CHOOSER_ID);
269
        fileChooser.setCurrentDirectory(explorer.getCurrentPath());
270
        fileChooser.setMultiSelectionEnabled(true);
271
        fileChooser.setAcceptAllFileFilterUsed(false);
272

    
273
        Iterator<MyFileFilter> iter = this.filters.iterator();
274
        while (iter.hasNext()) {
275
            fileChooser.addChoosableFileFilter(iter.next());
276
        }
277

    
278
        if (filters.size() > 0) {
279
            MyFileFilter firstf = filters.get(0);
280
            // Set first filter
281
            fileChooser.setFileFilter(firstf);
282
        }
283

    
284
        // If there is a last filter, use it
285
        if (lastFilter != null && filters.contains(lastFilter)) {
286
            fileChooser.setFileFilter(lastFilter);
287
        }
288

    
289
        int result = fileChooser.showOpenDialog(this);
290

    
291
        List<FilesystemStoreParameters> toAdd =
292
            new ArrayList<FilesystemStoreParameters>();
293

    
294
        if (result == JFileChooser.APPROVE_OPTION) {
295
            lastFilter = (MyFileFilter) fileChooser.getFileFilter();
296
            String providerName = null;
297
            if( lastFilter!=null ) {
298
                if( !DEFAULT_FILTER.equalsIgnoreCase(lastFilter.getDescription()) ) {
299
                    providerName = lastFilter.getName();
300
                }
301
            }
302
            toAdd = this.getParametersList(
303
                    fileChooser.getCurrentDirectory(),
304
                    fileChooser.getSelectedFiles(),
305
                    providerName
306
            );
307
        }
308
        return toAdd;
309
    }
310

    
311

    
312
    private List<FilesystemStoreParameters> getParametersList(File folder, File[] files, String providerName) {
313
        ApplicationManager application = ApplicationLocator.getManager();
314

    
315
        PrepareContext context = this.getPrepareDataStoreContext();
316

    
317
        List<DataStoreParameters> params = new ArrayList<DataStoreParameters>();
318
        List<DataStoreParameters> preparedParams = null;
319
        List<FilesystemStoreParameters> returnParams = new ArrayList<FilesystemStoreParameters>();
320

    
321
        for ( File aFile : files ) {
322
            String currentProvider = providerName;
323
            DataStoreParameters param;
324
            try {
325
                if( folder == null) {
326
                    explorer.setCurrentPath(aFile.getParentFile());
327
                } else {
328
                    explorer.setCurrentPath(folder);
329
                }
330
                if( currentProvider == null ) {
331
                    for( int i=1; i<this.filters.size(); i++) {
332
                        MyFileFilter filter = this.filters.get(i);
333
                        if( filter.accept(aFile)) {
334
                            currentProvider = filter.getName();
335
                            break;
336
                        }
337
                    }
338
                }
339
                if( currentProvider == null ) {
340
                    // TODO: ask user
341
                    continue;
342
                }
343
                param = explorer.createStoreParameters(aFile, currentProvider);
344
                if ( param == null ) {
345
                    // TODO show warning
346
                    continue;
347
                }
348
                params.add(param);
349

    
350
            } catch (DataException e) {
351
                NotificationManager.addError(e);
352
                return null;
353
            }
354
        }
355

    
356
        try {
357
            preparedParams
358
                    = application.prepareOpenDataStoreParameters(params, context);
359
        } catch (Exception e) {
360
            NotificationManager.addError(e);
361
        }
362

    
363
        if ( preparedParams != null ) {
364
            for ( int i = 0; i < preparedParams.size(); i++ ) {
365
                returnParams.add((FilesystemStoreParameters) preparedParams.get(i));
366
            }
367
        }
368
        return returnParams;
369
    }
370

    
371
    /**
372
     * @return
373
     */
374
    protected PrepareContext getPrepareDataStoreContext() {
375
        return new PrepareContext() {
376

    
377
            @Override
378
            public IProjection getViewProjection() {
379
                return FilesystemExplorerWizardPanelController.this.mapContext.getProjection();
380
            }
381

    
382
            @Override
383
            public Window getOwnerWindow() {
384
                return null;
385
            }
386
        };
387
    }
388

    
389
    /**
390
     * @return DataStoreParameters[]
391
     */
392
    public DataStoreParameters[] getParameters() {
393
        return ((FilesystemExplorerWizardTableModel)this.tableFiles.getModel()).getParameters();
394
    }
395

    
396
    /**
397
     * @param files
398
     */
399
    public void addFiles(List<File> files) {
400
        File[] filesArray = files.toArray(new File[files.size()]);
401
        this.addFilesFromParameters(this.getParametersList(null, filesArray, null));
402
    }
403

    
404
    private void addFilesFromParameters(List<FilesystemStoreParameters> filesParams) {
405
        if ( filesParams.isEmpty() ) {
406
            return;
407
        }
408
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel)this.tableFiles.getModel();
409
        model.add(filesParams, false);
410
    }
411

    
412
    /**
413
     * @param parameters
414
     * @return boolean
415
     */
416
    public boolean isTiled(DataStoreParameters parameters) {
417
        return ((FilesystemExplorerWizardTableModel)this.tableFiles.getModel()).isTiled(parameters);
418
    }
419

    
420
    /**
421
     * @param explorer
422
     */
423
    public void setExplorer(FilesystemServerExplorer explorer) {
424
        this.explorer = explorer;
425
    }
426

    
427
    /**
428
     * @param filters
429
     */
430
    public void setFilters(ArrayList<MyFileFilter> filters) {
431
        this.filters=filters;
432
    }
433

    
434
    /**
435
     * Dispose filters and explorer.
436
     *
437
     */
438
    public void dispose() {
439
        if (explorer != null) {
440
            explorer.dispose();
441
            explorer = null;
442
        }
443
        if (filters != null) {
444
            filters.clear();
445
            filters = null;
446
        }
447
    }
448

    
449

    
450
}