Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.swing / org.gvsig.exportto.swing.impl / src / main / java / org / gvsig / exportto / swing / impl / DefaultJExporttoServicePanel.java @ 43502

History | View | Annotate | Download (12.9 KB)

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

    
26
import java.awt.BorderLayout;
27
import java.awt.Dimension;
28

    
29
import javax.swing.ImageIcon;
30
import javax.swing.JOptionPane;
31

    
32
import jwizardcomponent.DefaultJWizardComponents;
33

    
34
import org.cresques.cts.IProjection;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37

    
38
import org.gvsig.exportto.ExporttoService;
39
import org.gvsig.exportto.ExporttoServiceException;
40
import org.gvsig.exportto.ExporttoServiceFinishAction;
41
import org.gvsig.exportto.swing.JExporttoServicePanel;
42
import org.gvsig.exportto.swing.JExporttoServicePanelListener;
43
import org.gvsig.exportto.swing.impl.panel.MessagePanel;
44
import org.gvsig.exportto.swing.impl.wizard.DefaultWizardContainer;
45
import org.gvsig.exportto.swing.impl.wizard.ExportFilterWizard;
46
import org.gvsig.exportto.swing.impl.wizard.ExportTargetProjectionWizard;
47
import org.gvsig.exportto.swing.impl.wizard.ExporterSelectionWizard;
48
import org.gvsig.exportto.swing.impl.wizard.ExporttoProgressWizard;
49
import org.gvsig.exportto.swing.spi.ExporttoSwingProvider;
50
import org.gvsig.exportto.swing.spi.ExporttoSwingProviderFactory;
51
import org.gvsig.exportto.swing.spi.ExporttoSwingProviderLocator;
52
import org.gvsig.exportto.swing.spi.ExporttoSwingProviderManager;
53
import org.gvsig.fmap.dal.DALLocator;
54
import org.gvsig.fmap.dal.DataManager;
55
import org.gvsig.fmap.dal.exception.DataException;
56
import org.gvsig.fmap.dal.feature.Feature;
57
import org.gvsig.fmap.dal.feature.FeatureQuery;
58
import org.gvsig.fmap.dal.feature.FeatureSet;
59
import org.gvsig.fmap.dal.feature.FeatureStore;
60
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
61
import org.gvsig.gui.beans.wizard.WizardPanel;
62
import org.gvsig.gui.beans.wizard.WizardPanelActionListener;
63
import org.gvsig.gui.beans.wizard.WizardPanelWithLogo;
64
import org.gvsig.tools.ToolsLocator;
65
import org.gvsig.tools.evaluator.Evaluator;
66
import org.gvsig.tools.i18n.I18nManager;
67
import org.gvsig.tools.service.ServiceException;
68
import org.gvsig.tools.swing.api.ToolsSwingLocator;
69
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
70
import org.gvsig.tools.task.SimpleTaskStatus;
71

    
72
/**
73
 * Default implementation for the {@link JExporttoServicePanel}.
74
 *
75
 * @author gvSIG Team
76
 * @version $Id$
77
 */
78
public class DefaultJExporttoServicePanel extends JExporttoServicePanel
79
    implements WizardPanel {
80

    
81
    private static final Logger LOG = LoggerFactory
82
        .getLogger(DefaultJExporttoServicePanel.class);
83

    
84
    private static final ExporttoSwingProviderManager EXPORTTO_SWING_PROVIDER_MANAGER =
85
        ExporttoSwingProviderLocator.getManager();
86
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
87

    
88
    private static final long serialVersionUID = -7026467582252285238L;
89

    
90
    private FeatureStore featureStore;
91
    private IProjection projection;
92
    private FLyrVect vectorLayer = null;
93
    private DefaultExporttoSwingManager uimanager;
94

    
95
    // Used to get the new feature store parameters
96
    private ExporttoSwingProvider exporttoSwingProvider;
97

    
98
    // Provider types that will be displayed
99
    private int[] providerTypes;
100

    
101
    // Wizards used to create the main wizard
102
    private ExporterSelectionWizard exporterSelectionWizard = null;
103
    private ExportFilterWizard exportFilterWizard = null;
104
    private ExportTargetProjectionWizard exportTargetProjectionWizard  = null;
105
    private ExporttoProgressWizard exporttoProgressWizard = null;
106

    
107
    // Listener for the finish and cancell button
108
    private WizardPanelActionListener exporttoServicePanelListener;
109

    
110
    private WizardPanelWithLogo wizardPanelWithLogo = null;
111

    
112
    // Action to execute at the end of the export process
113
    ExporttoServiceFinishAction exporttoServiceFinishAction;
114

    
115
    private int status;
116

    
117
    public DefaultJExporttoServicePanel(DefaultExporttoSwingManager uimanager,
118
        FLyrVect vlayer,
119
        ExporttoServiceFinishAction exporttoServiceFinishAction,
120
        int[] providerTypes) {
121

    
122
        this(
123
            uimanager,
124
            vlayer.getFeatureStore(),
125
            vlayer.getProjection(),
126
            exporttoServiceFinishAction,
127
            providerTypes);
128
        vectorLayer = vlayer;
129
    }
130

    
131
    public DefaultJExporttoServicePanel(DefaultExporttoSwingManager uimanager,
132
        FeatureStore featureStore, IProjection projection,
133
        ExporttoServiceFinishAction exporttoServiceFinishAction,
134
        int[] providerTypes) {
135
        this.featureStore = featureStore;
136
        this.projection = projection;
137
        this.uimanager = uimanager;
138
        this.exporttoServiceFinishAction = exporttoServiceFinishAction;
139
        this.providerTypes = providerTypes;
140
        this.status = JOptionPane.UNDEFINED_CONDITION;
141

    
142
        ImageIcon ii = IconThemeHelper.getImageIcon("wizard-export-to");
143
        wizardPanelWithLogo = new WizardPanelWithLogo(ii);
144

    
145
        // Initialize the wizards
146
        exporterSelectionWizard =
147
            new ExporterSelectionWizard(this, providerTypes);
148
        exportTargetProjectionWizard = new ExportTargetProjectionWizard(this);
149
        exportFilterWizard = new ExportFilterWizard(this);
150
        exporttoProgressWizard = new ExporttoProgressWizard(this);
151

    
152
        // Adding the wizards to the main wizard
153
        wizardPanelWithLogo.addOptionPanel(exporterSelectionWizard);
154

    
155
        // The finish button is called "export"
156
        this.wizardPanelWithLogo.getWizardComponents().getFinishButton()
157
            .setText(uimanager.getTranslation("export"));
158

    
159
        this.setLayout(new BorderLayout());
160
        this.add(wizardPanelWithLogo, BorderLayout.CENTER);
161

    
162
        // Disable the nextbutton
163
        setNextButtonEnabled(false);
164
        setExportButtonEnabled(false);
165

    
166
        // Set the listener for the finish and cancell events
167
        this.wizardPanelWithLogo.setWizardListener(this);
168
        this.setPreferredSize(new Dimension(700, 350));
169
    }
170

    
171
    public FeatureStore getFeatureStore() {
172
        return this.featureStore;
173
    }
174

    
175
    public void setNextButtonEnabled(boolean isEnabled) {
176
        wizardPanelWithLogo.setNextButtonEnabled(isEnabled);
177
    }
178

    
179
    public void setExportButtonEnabled(boolean isEnabled) {
180
        wizardPanelWithLogo.setFinishButtonEnabled(isEnabled);
181
    }
182

    
183
    public void setCancelButtonText(String text) {
184
        wizardPanelWithLogo.getWizardComponents().getCancelButton()
185
            .setText(text);
186
    }
187

    
188
    /**
189
     * @return the uimanager
190
     */
191
    public DefaultExporttoSwingManager getExporttoSwingManager() {
192
        return uimanager;
193
    }
194

    
195
    /**
196
     * @param exporttoSwingProvider
197
     * @throws ServiceException
198
     */
199
    public void selectExporttoSwingProvider(
200
        ExporttoSwingProviderFactory provider)
201
        throws ServiceException {
202

    
203
        if (vectorLayer == null) {
204
            exporttoSwingProvider =
205
                EXPORTTO_SWING_PROVIDER_MANAGER.createExporttoSwingProvider(
206
                    provider.getName(), featureStore, projection);
207
        } else {
208
            exporttoSwingProvider =
209
                EXPORTTO_SWING_PROVIDER_MANAGER.createExporttoSwingProvider(
210
                    provider.getName(), vectorLayer);
211
        }
212

    
213
        DefaultJWizardComponents wizardComponents =
214
            wizardPanelWithLogo.getWizardComponents();
215
        for (int i = wizardComponents.getWizardPanelList().size() - 1; i >= 1; i--) {
216
            wizardComponents.removeWizardPanel(i);
217
        }
218
        for (int i = 0; i < exporttoSwingProvider.getPanelCount(); i++) {
219
            wizardPanelWithLogo.addOptionPanel(new DefaultWizardContainer(
220
                exporttoSwingProvider.getPanelAt(i)));
221
        }
222
        exportTargetProjectionWizard.setVectorLayer(vectorLayer);
223
        if (exporttoSwingProvider.needsPanelTargetProjection()){
224
            wizardPanelWithLogo.addOptionPanel(exportTargetProjectionWizard);
225
        }
226
        wizardPanelWithLogo.addOptionPanel(exportFilterWizard);
227
        wizardPanelWithLogo.addOptionPanel(exporttoProgressWizard);
228
    }
229

    
230
    public Dimension getPreferredSize() {
231
        return new Dimension(800, 550);
232
    }
233

    
234
    public void export() throws DataException, ExporttoServiceException {
235
        this.lastWizard();
236

    
237
        // Create the feature Set...
238
        FeatureSet featureSet = null;
239
        if ( exportFilterWizard.isFullLayerSelected() ) {
240
            featureSet = featureStore.getFeatureSet();
241

    
242
        } else if ( exportFilterWizard.isSelectedFeaturesSelected() ) {
243
            featureSet = (FeatureSet) featureStore.getSelection();
244

    
245
        } else {
246
            Evaluator filter = exportFilterWizard.getFilter();
247
            if( filter!=null ) {
248
                FeatureQuery featureQuery = featureStore.createFeatureQuery();
249
                featureQuery.setFilter(filter);
250
                featureSet = featureStore.getFeatureSet(featureQuery);
251
            }
252
        }
253
        if( exporttoSwingProvider.needsPanelTargetProjection()) {
254
            exporttoSwingProvider.setTargetProjection(exportTargetProjectionWizard.getTargetProjection());
255
        }
256

    
257
        Export export = new Export(featureSet);
258
        export.start();
259
    }
260

    
261
    public void lastWizard() {
262
        this.wizardPanelWithLogo.getWizardComponents().getNextButton()
263
            .getActionListeners()[0].actionPerformed(null);
264
    }
265

    
266
    private class Export extends Thread {
267

    
268
        private FeatureSet featureSet;
269

    
270
        public Export(FeatureSet featureSet) {
271
            super();
272
            this.featureSet = featureSet;
273
        }
274

    
275
        public synchronized void run() {
276
            ExporttoService exportService;
277
            try {
278
                exportService = exporttoSwingProvider.createExporttoService();
279
            } catch(Exception ex) {
280
                LOG.warn("Problems exporting layer.", ex);
281
                showError(ex);
282
                return;
283
            }
284
            exporttoProgressWizard.bind(exportService.getTaskStatus());
285
            exportService.setFinishAction(exporttoServiceFinishAction);
286
            String layerName = "(unknow)";
287
            String layerFullName = "(unknow)";
288
            try {
289
                layerName = featureStore.getName();
290
                layerFullName = featureStore.getFullName();
291
                LOG.info("Exporting '"+layerName+"' using '"+exportService.getClass().getName()+"' ("+layerFullName+").");
292
                ((SimpleTaskStatus)(exportService.getTaskStatus())).setTitle("Exporting "+layerName+"...");
293
                exportService.export(featureSet);
294
            } catch (ExporttoServiceException e) {
295
                LOG.warn("Problems exporting the data (layer="+layerName+").", e);
296
                showError(e);
297
            } finally {
298
                ((SimpleTaskStatus)(exportService.getTaskStatus())).terminate();
299
            }
300
        }
301
    }
302

    
303
    private void showError(Exception e) {
304
        Feature f = null;
305
        if( e instanceof ExporttoServiceException ) {
306
            f = ((ExporttoServiceException)e).getFeature();
307
        }
308
        I18nManager i18nManager = ToolsLocator.getI18nManager();
309
        MessagePanel.showMessage(
310
                i18nManager.getTranslation("_Warning"),
311
                i18nManager.getTranslation("_There_have_been_problems_exporting_data"),
312
                e,
313
                f
314
        );
315
    }
316

    
317
    public void setWizardPanelActionListener(
318
        WizardPanelActionListener wizardActionListener) {
319
        this.exporttoServicePanelListener = wizardActionListener;
320
    }
321

    
322
    public WizardPanelActionListener getWizardPanelActionListener() {
323
        if (exporttoServicePanelListener == null) {
324
            exporttoServicePanelListener =
325
                new DefaultJExporttoServicePanelListener(this);
326
        }
327
        return exporttoServicePanelListener;
328
    }
329

    
330
    @Override
331
    public void setExporttoServicePanelListener(
332
        JExporttoServicePanelListener exporttoServicePanelListener) {
333
        ((DefaultJExporttoServicePanelListener) getWizardPanelActionListener())
334
            .setExporttoServicePanelListener(exporttoServicePanelListener);
335
    }
336

    
337
    @Override
338
    public int getStatus() {
339
        return this.status;
340
    }
341

    
342
    public void setStatus(int status) {
343
        this.status = status;
344
        if( this.status == JOptionPane.CANCEL_OPTION ) {
345
            this.setVisible(false);
346
        }
347
    }
348
}