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

History | View | Annotate | Download (15.4 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

    
6
import java.awt.Component;
7
import java.awt.Window;
8
import java.awt.event.ActionEvent;
9
import java.awt.event.ActionListener;
10
import java.io.File;
11
import java.util.ArrayList;
12
import java.util.Iterator;
13
import java.util.List;
14
import java.util.Locale;
15

    
16
import javax.swing.DefaultListSelectionModel;
17
import javax.swing.JFileChooser;
18
import javax.swing.ListSelectionModel;
19
import javax.swing.event.ListSelectionEvent;
20
import javax.swing.event.ListSelectionListener;
21
import javax.swing.table.TableColumn;
22

    
23
import org.cresques.cts.IProjection;
24
import org.slf4j.Logger;
25
import org.slf4j.LoggerFactory;
26

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

    
44

    
45
/**
46
 * @author fdiaz
47
 *
48
 */
49
public class FilesystemExplorerWizardPanelController extends FilesystemExplorerWizardPanelView {
50

    
51

    
52
    /**
53
     *
54
     */
55
    private static final long serialVersionUID = -2351856603294610783L;
56

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

    
61
    /**
62
     *
63
     */
64
    public static final String OPEN_LAYER_FILE_CHOOSER_ID = "OPEN_LAYER_FILE_CHOOSER_ID";
65

    
66
    private static final String DEFAULT_FILTER = "All_supported";
67

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

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

    
85
        initComponents();
86
        translate();
87
    }
88

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

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

    
110
    private void initComponents() {
111

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

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

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

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

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

    
142
        I18nManager i18nManager = ToolsLocator.getI18nManager();
143

    
144
        this.tableFiles.setModel(new FilesystemExplorerWizardTableModel());
145
        this.tableFiles.getColumn(
146
            i18nManager.getTranslation(FilesystemExplorerWizardTableModel.COLUMN_STORE_PARAMETERS_NAME))
147
            .setCellRenderer(new FilesystemStoreParameteresCellRenderer(mapContext));
148
        TableColumn columnTiled = this.tableFiles.getColumn(
149
            i18nManager.getTranslation(FilesystemExplorerWizardTableModel.COLUMN_TILED_NAME));
150
        columnTiled.setMaxWidth(80);
151
        columnTiled.setCellRenderer(new TiledCellRenderer());
152
        this.tableFiles.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
153
        this.tableFiles.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
154

    
155
            public void valueChanged(ListSelectionEvent e) {
156
                handleSelectionEvent(e);
157
            }
158
        });
159
    }
160

    
161

    
162
    protected void updateComponents() {
163
        btnUp.setEnabled(selectedIndex > 0 && selectedIndex < tableFiles.getRowCount());
164
        btnDown.setEnabled(selectedIndex >= 0 && selectedIndex < (tableFiles.getRowCount() - 1));
165
        btnProperties.setEnabled(selectedIndex >= 0 && selectedIndex < tableFiles.getRowCount());
166
        btnRemove.setEnabled(selectedIndex >= 0 && selectedIndex < tableFiles.getRowCount());
167
    }
168

    
169
    protected void handleSelectionEvent(ListSelectionEvent e){
170
        if (e.getValueIsAdjusting())
171
            return;
172

    
173
        final DefaultListSelectionModel target = (DefaultListSelectionModel)e.getSource();
174
        selectedIndex = target.getAnchorSelectionIndex();
175

    
176
        updateComponents();
177
    }
178

    
179
    protected void doAdd() {
180

    
181
        List<FilesystemStoreParameters> list = chooseFilesParameters();
182
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel) this.tableFiles.getModel();
183

    
184
        for (FilesystemStoreParameters filesystemStoreParameters : list) {
185
            model.add(filesystemStoreParameters);
186
            updateTable();
187
            int index = model.getRowCount()-1;
188
            this.tableFiles.getSelectionModel().setSelectionInterval(index, index);
189
        }
190
    }
191

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

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

    
216
    protected void doUp() {
217
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel)this.tableFiles.getModel();
218
        if(selectedIndex>0 && selectedIndex<model.getRowCount()){
219
            int index = selectedIndex;
220
            model.up(index);
221
            updateTable();
222

    
223
            this.tableFiles.getSelectionModel().setSelectionInterval(index-1, index-1);
224
        }
225
    }
226

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

    
237
    protected void showPropertiesDialog(final DynObject parameters) {
238
        DataStoreParametersPanelManager manager = DALSwingLocator.getDataStoreParametersPanelManager();
239
        DataStoreParametersPanel panel = manager.createDataStoreParametersPanel(parameters);
240
        panel.setExcludeGeometryOptions(false);
241
        manager.showPropertiesDialog(parameters, panel);
242
    }
243

    
244
    private void updateTable(){
245
        ((FilesystemExplorerWizardTableModel)this.tableFiles.getModel()).fireTableDataChanged();
246
        updateRowHeights();
247
    }
248

    
249
    private void updateRowHeights() {
250

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

    
269

    
270
     private List<FilesystemStoreParameters> chooseFilesParameters() {
271

    
272
        FileDialogChooser fileChooser = ToolsUtilLocator.getFileDialogChooserManager().create(OPEN_LAYER_FILE_CHOOSER_ID);
273
        fileChooser.setCurrentDirectory(explorer.getCurrentPath());
274
        fileChooser.setMultiSelectionEnabled(true);
275
        fileChooser.setAcceptAllFileFilterUsed(false);
276

    
277
        Iterator<MyFileFilter> iter = this.filters.iterator();
278
        while (iter.hasNext()) {
279
            fileChooser.addChoosableFileFilter(iter.next());
280
        }
281

    
282
        if (filters.size() > 0) {
283
            MyFileFilter firstf = filters.get(0);
284
            // Set first filter
285
            fileChooser.setFileFilter(firstf);
286
        }
287

    
288
        // If there is a last filter, use it
289
        if (lastFilter != null && filters.contains(lastFilter)) {
290
            fileChooser.setFileFilter(lastFilter);
291
        }
292

    
293
        int result = fileChooser.showOpenDialog(this);
294

    
295
        List<FilesystemStoreParameters> toAdd =
296
            new ArrayList<FilesystemStoreParameters>();
297

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

    
315

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

    
319
        PrepareContext context = this.getPrepareDataStoreContext();
320

    
321
        List<DataStoreParameters> params = new ArrayList<DataStoreParameters>();
322
        List<DataStoreParameters> preparedParams = null;
323
        List<FilesystemStoreParameters> returnParams = new ArrayList<FilesystemStoreParameters>();
324

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

    
354
            } catch (DataException e) {
355
                NotificationManager.addError(e);
356
                return null;
357
            }
358
        }
359

    
360
        try {
361
            preparedParams
362
                    = application.prepareOpenDataStoreParameters(params, context);
363
        } catch (Exception e) {
364
            NotificationManager.addError(e);
365
        }
366

    
367
        if ( preparedParams != null ) {
368
            for ( int i = 0; i < preparedParams.size(); i++ ) {
369
                returnParams.add((FilesystemStoreParameters) preparedParams.get(i));
370
            }
371
        }
372
        return returnParams;
373
    }
374

    
375
    /**
376
     * @return
377
     */
378
    protected PrepareContext getPrepareDataStoreContext() {
379
        return new PrepareContext() {
380

    
381
            @Override
382
            public IProjection getViewProjection() {
383
                return FilesystemExplorerWizardPanelController.this.mapContext.getProjection();
384
            }
385

    
386
            @Override
387
            public Window getOwnerWindow() {
388
                return null;
389
            }
390
        };
391
    }
392

    
393
    /**
394
     * @return DataStoreParameters[]
395
     */
396
    public DataStoreParameters[] getParameters() {
397
        return ((FilesystemExplorerWizardTableModel)this.tableFiles.getModel()).getParameters();
398
    }
399

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

    
408
    private void addFilesFromParameters(List<FilesystemStoreParameters> filesParams) {
409
        if ( filesParams.isEmpty() ) {
410
            return;
411
        }
412
        FilesystemExplorerWizardTableModel model = (FilesystemExplorerWizardTableModel)this.tableFiles.getModel();
413
        model.add(filesParams);
414
    }
415

    
416
    /**
417
     * @param parameters
418
     * @return boolean
419
     */
420
    public boolean isTiled(DataStoreParameters parameters) {
421
        return ((FilesystemExplorerWizardTableModel)this.tableFiles.getModel()).isTiled(parameters);
422
    }
423

    
424
    /**
425
     * @param explorer
426
     */
427
    public void setExplorer(FilesystemServerExplorer explorer) {
428
        this.explorer = explorer;
429
    }
430

    
431
    /**
432
     * @param filters
433
     */
434
    public void setFilters(ArrayList<MyFileFilter> filters) {
435
        this.filters=filters;
436
    }
437

    
438
    /**
439
     * Dispose filters and explorer.
440
     *
441
     */
442
    public void dispose() {
443
        if (explorer != null) {
444
            explorer.dispose();
445
            explorer = null;
446
        }
447
        if (filters != null) {
448
            filters.clear();
449
            filters = null;
450
        }
451
    }
452

    
453

    
454
}