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

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.ListSelectionModel;
17
import javax.swing.event.ListSelectionEvent;
18
import javax.swing.event.ListSelectionListener;
19

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

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

    
40

    
41
/**
42
 * @author fdiaz
43
 *
44
 */
45
public class FilesystemExplorerWizardPanelController extends FilesystemExplorerWizardPanelView {
46

    
47

    
48
    /**
49
     *
50
     */
51
    private static final long serialVersionUID = -2351856603294610783L;
52

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

    
57
    /**
58
     *
59
     */
60
    public static final String OPEN_LAYER_FILE_CHOOSER_ID = "OPEN_LAYER_FILE_CHOOSER_ID";
61

    
62
    private static final String DEFAULT_FILTER = "All_supported";
63

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

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

    
81
        initComponents();
82
        translate();
83
    }
84

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

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

    
106
    private void initComponents() {
107

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

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

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

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

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

    
138
        I18nManager i18nManager = ToolsLocator.getI18nManager();
139

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

    
149
            public void valueChanged(ListSelectionEvent e) {
150
                handleSelectionEvent(e);
151
            }
152
        });
153
    }
154

    
155

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

    
163
    protected void handleSelectionEvent(ListSelectionEvent e){
164
        if (e.getValueIsAdjusting())
165
            return;
166

    
167
        final DefaultListSelectionModel target = (DefaultListSelectionModel)e.getSource();
168
        selectedIndex = target.getAnchorSelectionIndex();
169

    
170
        updateComponents();
171
    }
172

    
173
    protected void doAdd() {
174

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

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

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

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

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

    
217
            this.tableFiles.getSelectionModel().setSelectionInterval(index-1, index-1);
218
        }
219
    }
220

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

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

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

    
243
    private void updateRowHeights() {
244

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

    
263

    
264
     private List<FilesystemStoreParameters> chooseFilesParameters() {
265

    
266
        JFileChooser fileChooser =
267
            new JFileChooser(OPEN_LAYER_FILE_CHOOSER_ID,
268
                explorer.getCurrentPath());
269
        fileChooser.setMultiSelectionEnabled(true);
270
        fileChooser.setAcceptAllFileFilterUsed(false);
271

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

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

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

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

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

    
293
        if (result == JFileChooser.APPROVE_OPTION) {
294
            lastFilter = (MyFileFilter) fileChooser.getFileFilter();
295
            JFileChooser.setLastPath(OPEN_LAYER_FILE_CHOOSER_ID, fileChooser.getCurrentDirectory());
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
}