Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.xml2db / org.gvsig.xml2db.swing / org.gvsig.xml2db.swing.impl / src / main / java / org / gvsig / xml2db / swing / impl / createdbfromxml / CreatedbFromXmlPanel.java @ 47486

History | View | Annotate | Download (24.5 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright (c) 2007-2023 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.xml2db.swing.impl.createdbfromxml;
24

    
25
import java.awt.Color;
26
import java.awt.Cursor;
27
import java.awt.GridBagConstraints;
28
import java.awt.event.ActionEvent;
29
import java.awt.event.ItemEvent;
30
import java.awt.event.ItemListener;
31
import java.io.File;
32
import java.nio.charset.Charset;
33
import java.util.ArrayList;
34
import java.util.Collections;
35
import java.util.List;
36
import java.util.Locale;
37
import javax.swing.AbstractListModel;
38
import javax.swing.DefaultComboBoxModel;
39
import javax.swing.JComponent;
40
import javax.swing.JOptionPane;
41
import javax.swing.SwingUtilities;
42
import javax.swing.event.ChangeEvent;
43
import javax.swing.event.DocumentEvent;
44
import javax.swing.event.DocumentListener;
45
import org.apache.commons.io.FilenameUtils;
46
import org.apache.commons.lang3.StringUtils;
47
import org.cresques.cts.IProjection;
48
import org.gvsig.fmap.dal.DALLocator;
49
import org.gvsig.fmap.dal.DataManager;
50
import org.gvsig.fmap.dal.feature.EditableFeatureType;
51
import org.gvsig.fmap.dal.store.h2.H2SpatialUtils;
52
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
53
import org.gvsig.fmap.dal.swing.DALSwingLocator;
54
import org.gvsig.fmap.dal.swing.DataSwingManager;
55
import org.gvsig.fmap.dal.swing.ProjectionPickerController;
56
import org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel;
57
import static org.gvsig.fmap.dal.swing.featuretype.FeatureTypePanel.MODE_EDIT_ALL;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.i18n.I18nManager;
60
import org.gvsig.tools.swing.api.ToolsSwingLocator;
61
import org.gvsig.tools.swing.api.ToolsSwingManager;
62
import org.gvsig.tools.swing.api.ToolsSwingUtils;
63
import org.gvsig.tools.swing.api.pickercontroller.CharsetPickerController;
64
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
65
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
66
import org.gvsig.tools.swing.api.task.TaskStatusController;
67
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
68
import org.gvsig.tools.swing.api.windowmanager.Dialog;
69
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
70
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
71
import org.gvsig.tools.task.SimpleTaskStatus;
72
import org.gvsig.tools.util.LabeledValue;
73
import org.gvsig.tools.util.LabeledValueImpl;
74
import org.gvsig.xml2db.lib.api.Xml2dbLocator;
75
import org.gvsig.xml2db.lib.api.Xml2dbManager;
76
import org.gvsig.xml2db.lib.api.xmlinfo.XMLInfo;
77
import org.gvsig.xml2db.lib.api.xmlinfo.XMLTableInfo;
78
import org.gvsig.xml2db.swing.Xml2dbPanel;
79
import org.gvsig.xml2db.swing.impl.Task;
80
import org.gvsig.xml2db.swing.impl.Xml2dbSwingCommons;
81
import org.slf4j.Logger;
82
import org.slf4j.LoggerFactory;
83

    
84
/**
85
 *
86
 * @author jjdelcerro
87
 */
88
@SuppressWarnings("UseSpecificCatch")
89
public class CreatedbFromXmlPanel 
90
        extends CreatedbFromXmlPanelView 
91
        implements Xml2dbPanel
92
    {
93

    
94
    protected static final Logger LOGGER = LoggerFactory.getLogger(CreatedbFromXmlPanel.class);
95
    
96
    private static final int MODE_NEW = 0;
97
    private static final int MODE_OVERWRITE = 1;
98
    private static final int MODE_ADD = 2;
99
    
100
    private PickerController<Locale> pickerLocale;
101

    
102
    private static class XMLInfoListModel extends AbstractListModel<LabeledValue<XMLTableInfo>> {
103
        
104
        private final XMLInfo xmlinfo;
105
        private final List<LabeledValue<XMLTableInfo>> tables;
106
        
107
        
108
        public XMLInfoListModel() {
109
            this(null);
110
        }
111
        
112
        public XMLInfoListModel(XMLInfo xmlinfo) {
113
            this.xmlinfo = xmlinfo;
114
            if( xmlinfo != null ) {
115
                this.tables = new ArrayList<>(xmlinfo.size());
116
                for (XMLTableInfo tableInfo : xmlinfo) {
117
                    this.tables.add(new LabeledValueImpl<>(xmlinfo.getNameWithPrefix(tableInfo.getName()),tableInfo));
118
                }
119
            } else {
120
                this.tables = null;
121
            }
122
        }
123

    
124
        @Override
125
        public LabeledValue<XMLTableInfo> getElementAt(int index) {
126
            if( this.tables == null ) {
127
                return null;
128
            }
129
            return tables.get(index);
130
        }
131

    
132
        @Override
133
        public int getSize() {
134
            if( this.tables == null ) {
135
                return 0;
136
            }
137
            return this.tables.size();
138
        }
139
        
140
        
141
    }
142
            
143
    
144
    private Dialog dialog;
145
    private FilePickerController pickerXMLFile;
146
    private FilePickerController pickerDbfile;
147
    private ProjectionPickerController pickerProjection;
148
    private CharsetPickerController pickerCharset;
149
    private TaskStatusController taskStatusController;
150
    private Task lastTask;
151
    private XMLInfo xmlinfo;
152
    
153
    public CreatedbFromXmlPanel() {
154
        this.createComponents();
155
    }
156
    
157
    private void createComponents() {    
158
        this.lastTask = Task.FAKE_TASK;
159
        this.xmlinfo = null;
160
        this.initComponents();
161
    }
162
    
163
    private void initComponents() {
164
    
165
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
166
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
167
        
168
        this.taskStatusController = ToolsSwingLocator.getTaskStatusSwingManager().createTaskStatusController(
169
                lblStatusCaption, 
170
                lblStatusMsg,
171
                pbStatus
172
        );
173
        this.taskStatusController.setVisible(false);
174
        
175
        this.translate();
176
        
177
        this.setTablesModel(null);
178
        
179
        this.pickerXMLFile = toolsSwingManager.createFilePickerController(
180
                this.txtXMLFile, 
181
                this.btnXMLFile,
182
                null,
183
                "Xml2db_xmlFile",
184
                null,
185
                true
186

    
187
        );
188
        this.pickerXMLFile.addChangeListener((ChangeEvent e) -> {
189
            doChangeXMLfile();
190
        });
191

    
192
        this.pickerCharset = toolsSwingManager.createCharsetPickerController(
193
                null,
194
                this.cboCharset
195
        );
196
        
197
        this.pickerProjection = dataSwingManager.createProjectionPickerController(
198
                this.txtProjection, 
199
                this.btnProjection
200
        );
201
        this.pickerProjection.addChangeListener((ChangeEvent e) -> {
202
            setTablesModel(null);
203
        });
204
        
205
        this.txtPrefixesForTables.getDocument().addDocumentListener(new DocumentListener() {
206
            @Override
207
            public void insertUpdate(DocumentEvent e) {
208
                setTablesModel(null);
209
            }
210

    
211
            @Override
212
            public void removeUpdate(DocumentEvent e) {
213
                setTablesModel(null);
214
            }
215

    
216
            @Override
217
            public void changedUpdate(DocumentEvent e) {
218
                setTablesModel(null);
219
            }
220
        });
221
        this.pickerDbfile = toolsSwingManager.createFilePickerController(
222
                this.txtDatabaseFile, 
223
                this.btnDataBaseFile
224
        );
225
        this.pickerDbfile.addChangeListener((ChangeEvent e) -> {
226
            doChangeDBfile();
227
        });
228
        
229
        this.btnAnalizeXML.addActionListener((ActionEvent e) -> {
230
            doAnalizeXML();
231
        });
232
        this.btnAnalizeXML.setCursor(new Cursor(Cursor.HAND_CURSOR));
233
        
234
        this.btnViewTableStructure.addActionListener((ActionEvent e) -> {
235
            doViewTableStructure();
236
        });
237
        this.btnViewTableStructure.setCursor(new Cursor(Cursor.HAND_CURSOR));
238
        
239
        this.pickerCharset.set(Charset.defaultCharset());
240
        
241
        this.chkRegisterConnection.setSelected(true);
242
        
243
        this.cboMode.addItemListener((ItemEvent e) -> {
244
            if(getMode() == MODE_ADD){
245
                chkRegisterConnection.setSelected(false);
246
            }
247
            updateStateComponents();
248
        });
249
        
250
        I18nManager i18n = ToolsLocator.getI18nManager();
251
        DefaultComboBoxModel<LabeledValue<Integer>> model = new DefaultComboBoxModel<>();
252
        model.addElement(new LabeledValueImpl<>(i18n.getTranslation("_New_database"), MODE_NEW));
253
        model.addElement(new LabeledValueImpl<>(i18n.getTranslation("_Overwrite_database"), MODE_OVERWRITE));
254
        model.addElement(new LabeledValueImpl<>(i18n.getTranslation("_Add_to_existing_database"), MODE_ADD));
255
        this.cboMode.setModel(model);
256
        this.cboMode.setSelectedIndex(0);
257
        
258
        
259
        this.cboCharset.setSelectedIndex(-1);
260
        
261
        this.pickerLocale = toolsSwingManager.createLocalePickerController(this.cboLocale);
262
        this.pickerLocale.set(Locale.getDefault());
263
        this.pickerLocale.addChangeListener((ChangeEvent e) -> {
264
            setTablesModel(null);
265
        });
266
        
267
        toolsSwingManager.addClearButton(this.txtPrefixesForTables);
268
        
269
        SwingUtilities.invokeLater(() -> { updateStateComponents(); });
270
        
271
        ToolsSwingUtils.ensureRowsCols(this, 5, 80, 6, 100);
272
    }
273

    
274
    private void translate() {
275
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
276
        
277
        toolsSwingManager.translate(this.lblCharset);
278
        toolsSwingManager.translate(this.lblRepositoryName);
279
        toolsSwingManager.translate(this.lblCreatedb);
280
        toolsSwingManager.translate(this.lblFileXML);
281
        toolsSwingManager.translate(this.lblDatabaseFile);
282
        toolsSwingManager.translate(this.lblProjection);
283
        toolsSwingManager.translate(this.lblTables);
284
        toolsSwingManager.translate(this.btnAnalizeXML);
285
        toolsSwingManager.translate(this.btnViewTableStructure);
286
        toolsSwingManager.translate(this.lblRegisterConnection);
287
        toolsSwingManager.translate(this.lblMode);
288
        toolsSwingManager.translate(this.lblLocale);
289
        toolsSwingManager.translate(this.lblPrefixesForTables);
290
        
291
    }
292
    
293
    private boolean isProcessing() {
294
        return this.lastTask.isProcessing();
295
    }
296
    
297
    private void updateStateComponents() {
298
        if( !SwingUtilities.isEventDispatchThread() ) {
299
            SwingUtilities.invokeLater(this::updateStateComponents);
300
            return;
301
        }
302
        message(null);
303
        if( this.isProcessing() ) {
304
            this.pickerXMLFile.setEnabled(false);
305
            this.pickerCharset.setEnabled(false);
306
            this.pickerProjection.setEnabled(false);
307
            this.btnAnalizeXML.setEnabled(false);
308
            this.lstTables.setEnabled(false);
309
            this.btnViewTableStructure.setEnabled(false);
310
            if( this.dialog!=null ) {
311
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
312
            }
313
            return;
314
        }
315
        this.pickerXMLFile.setEnabled(true);
316
        this.pickerCharset.setEnabled(true);
317
        this.pickerProjection.setEnabled(true);
318
        
319
        I18nManager i18n = ToolsLocator.getI18nManager();
320
        File xmlfile = this.pickerXMLFile.get();
321
        if( xmlfile == null || !xmlfile.exists() ) {
322
            if( xmlfile==null ) {
323
                this.message(i18n.getTranslation("_XML_file_is_required"), JOptionPane.WARNING_MESSAGE);
324
            } else {
325
                this.message(i18n.getTranslation("_XML_file_not_exists"), JOptionPane.WARNING_MESSAGE);
326
            }
327
            this.btnAnalizeXML.setEnabled(false);
328
            this.lstTables.setEnabled(false);
329
            this.btnViewTableStructure.setEnabled(false);
330
            if( this.dialog!=null ) {
331
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
332
            }
333
            return;
334
        }
335
        this.btnAnalizeXML.setEnabled(true);
336
        if( this.lstTables.getModel().getSize()<1 ) {
337
            if( this.xmlinfo == null ) {
338
                this.message(i18n.getTranslation("_Analize_XML_required"), JOptionPane.WARNING_MESSAGE);
339
            } else {
340
                this.message(i18n.getTranslation("_No_tables_recognized_in_the_XML"), JOptionPane.WARNING_MESSAGE);
341
            }
342
            this.btnViewTableStructure.setEnabled(false);
343
            if( this.dialog!=null ) {
344
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
345
            }
346
            return;
347
        }
348
        
349
        if( this.xmlinfo!=null && this.xmlinfo.hasGeometries() && this.pickerProjection.get()==null ) {
350
            this.message(i18n.getTranslation("_Projection_is_required"), JOptionPane.WARNING_MESSAGE);
351
            if( this.dialog!=null ) {
352
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
353
            }
354
            return;
355
        }
356
        
357
        this.lstTables.setEnabled(true);
358
        this.btnViewTableStructure.setEnabled(true);
359
        File dbfile = this.pickerDbfile.get();
360
        if( dbfile == null ) {
361
            this.message(i18n.getTranslation("_Database_file_is_required"), JOptionPane.WARNING_MESSAGE);
362
            if( this.dialog!=null ) {
363
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
364
            }
365
            return;
366
        }
367
        if( H2SpatialUtils.existsH2db(dbfile) && this.getMode() == MODE_NEW ) {
368
            this.message(i18n.getTranslation("_Database_file_already_exists"), JOptionPane.WARNING_MESSAGE);
369
            if( this.dialog!=null ) {
370
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
371
            }
372
            return;
373
        }
374
        if( StringUtils.isBlank(this.txtRepositoryName.getText()) ) {
375
            this.message(i18n.getTranslation("_Repository_name_is_required"), JOptionPane.WARNING_MESSAGE);
376
            if( this.dialog!=null ) {
377
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
378
            }
379
            return;
380
        }
381
        if( this.dialog!=null ) {
382
            this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, true);        
383
        }
384
        this.taskStatusController.setVisible(this.lastTask.needToShowTheStatus());        
385
    }
386

    
387
    @Override
388
    public void setDialog(Dialog dialog) {
389
        this.dialog = dialog;
390
    }
391

    
392
    @Override
393
    public JComponent asJComponent() {
394
        return this;
395
    }
396
    
397
    @Override
398
    public void performAction() {
399
        doCreatedb();
400
    }
401

    
402
    private void doCreatedb() {
403
        if( this.xmlinfo==null ) {
404
            return;
405
        }
406
        File dbfile = this.pickerDbfile.get();
407
        if( dbfile==null || dbfile.exists()) {
408
            return;
409
        }
410
        String s = this.txtRepositoryName.getText();
411
        if( StringUtils.isBlank(s) ) {
412
            s = FilenameUtils.getBaseName(dbfile.getName());
413
        } 
414
        String repoName = s;
415

    
416
        boolean registerConnection = this.chkRegisterConnection.isSelected();
417
        
418
        Xml2dbManager manager = Xml2dbLocator.getXml2dbManager();
419
        
420
        I18nManager i18n = ToolsLocator.getI18nManager();
421
        switch(getMode()){
422
            default:
423
            case MODE_NEW:
424
                if( H2SpatialUtils.existsH2db(dbfile) ) {
425
                    message(i18n.getTranslation("Database already exists"), JOptionPane.WARNING_MESSAGE);
426
                    return;
427
                }
428
                break;
429
            case MODE_OVERWRITE:
430
                break;
431
            case MODE_ADD:
432
                if( !H2SpatialUtils.existsH2db(dbfile) ) {
433
                    message(i18n.getTranslation("Database not exists"), JOptionPane.WARNING_MESSAGE);
434
                    return;
435
                }
436
                break;
437
        }
438
//        if( H2SpatialUtils.existsH2db(dbfile) ) {
439
//            if( !this.chkOverwriteDatabase.isSelected() ) {
440
//                message(i18n.getTranslation("Database already exists"), JOptionPane.WARNING_MESSAGE);
441
//                return;
442
//            }
443
//        }        
444
        
445
        this.lastTask = new Task(                
446
                "Xml2db_Creating_database", 
447
                i18n.getTranslation("_Create_database"), 
448
                this::updateStateComponents, 
449
                taskStatusController
450
            ) {
451
            @Override
452
            protected void task(SimpleTaskStatus taskStatus) throws Throwable{
453
                try {
454
                    JDBCServerExplorerParameters params;
455
                    switch(getMode()){
456
                        default:
457
                        case MODE_NEW:
458
                            if (H2SpatialUtils.existsH2db(dbfile)) {
459
                                message(i18n.getTranslation("Database already exists"), JOptionPane.WARNING_MESSAGE);
460
                                return;
461
                            }
462
                            params = manager.createDatabase(dbfile, xmlinfo, taskStatus);
463
                            break;
464
                        case MODE_OVERWRITE:
465
                            if( H2SpatialUtils.existsH2db(dbfile) ) {
466
                                taskStatus.message(i18n.getTranslation("_Removing_existing_database"));
467
                                H2SpatialUtils.server_stop();
468
                                H2SpatialUtils.removeH2db(dbfile);
469
                                H2SpatialUtils.server_start();
470
                            }        
471
                            params = manager.createDatabase(dbfile, xmlinfo, taskStatus);
472
                            break;
473
                        case MODE_ADD:
474
                            params = manager.addToDatabase(dbfile, xmlinfo, taskStatus);
475
                            break;
476
                    }
477
                    
478
//                    JDBCServerExplorerParameters params = manager.createDatabase(dbfile, xmlinfo, taskStatus);
479
                    if( params == null ) {
480
                        throw new RuntimeException("Can't create database");
481
                    }
482
                    if( registerConnection ) {
483
                        addToConnectionPool(params,repoName);   
484
                    }
485
                } catch(Exception ex) {
486
                    LOGGER.warn("Can't create database",ex);
487
                    throw ex;
488
                }
489
            }
490

    
491
            @Override
492
            protected void postTask() {
493
                message(null);
494
            }
495
        };
496
        
497
        this.lastTask.start();
498
        
499
    }
500

    
501
    public void addToConnectionPool(JDBCServerExplorerParameters params, String id) {
502
        DataManager dataManager = DALLocator.getDataManager();
503
        dataManager.getDataServerExplorerPool().add(id, params);
504
    }
505
    
506
    private void doAnalizeXML() {
507
        Xml2dbManager manager = Xml2dbLocator.getXml2dbManager();
508
        File xmlfile = this.pickerXMLFile.get();
509
        if( xmlfile == null || !xmlfile.exists() ) {
510
            return;
511
        }
512
        IProjection proj = this.pickerProjection.get();
513
        Charset charset = this.pickerCharset.get();
514
        Locale locale = this.pickerLocale.get();
515
        
516
        String tablesPrefix = StringUtils.defaultIfBlank(this.txtPrefixesForTables.getText(), null);
517
        
518
        I18nManager i18n = ToolsLocator.getI18nManager();
519

    
520
        this.lastTask = new Task(                
521
                "Xml2db_AnalizeXML", 
522
                i18n.getTranslation("_Analize_xml"), 
523
                this::updateStateComponents, 
524
                taskStatusController
525
            ) {
526
            @Override
527
            protected void task(SimpleTaskStatus taskStatus) throws Throwable{
528
                try {
529
                    XMLInfo xmlinfo = manager.extractStructure(xmlfile, charset, proj, locale, tablesPrefix, taskStatus);
530
                    if( proj==null && xmlinfo.getSrid()!=null ) {
531
                        pickerProjection.set(xmlinfo.getSrid());
532
                    }
533
                    if( xmlinfo.getCharset()!=null && charset==null ) {
534
                        pickerCharset.set(xmlinfo.getCharset());
535
                    }
536
                    setTablesModel(xmlinfo);
537
                } catch(Throwable ex) {
538
                    LOGGER.warn("Can't analize xml",ex);
539
                    setTablesModel(null);
540
                    I18nManager i18n = ToolsLocator.getI18nManager();
541
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
542
                    dialogs.messageDialog(
543
                            i18n.getTranslation("_Problems_processing_XML_file")
544
                                    +"\n\n"
545
                                    + ex.getLocalizedMessage(), 
546
                            i18n.getTranslation("_Xml2db_Create_database_from_xml"), 
547
                            JOptionPane.WARNING_MESSAGE
548
                    );
549
                    throw ex;
550
                }
551
            }
552
        };
553
        this.lastTask.start();
554
    }
555
    
556
    private void setTablesModel(XMLInfo xmlinfo) {
557
        if( !SwingUtilities.isEventDispatchThread() ) {
558
            SwingUtilities.invokeLater(() -> {this.setTablesModel(xmlinfo);});
559
            return;
560
        }
561
        this.xmlinfo = xmlinfo;
562
        if( xmlinfo == null ) {
563
            lstTables.setModel(new XMLInfoListModel()); 
564
            return;
565
        }
566
        lstTables.setModel(new XMLInfoListModel(xmlinfo)); 
567
    }
568
    
569
    private void doViewTableStructure() {
570
        LabeledValue<XMLTableInfo> x = (LabeledValue<XMLTableInfo>)this.lstTables.getSelectedValue();
571
        if( x == null ) {
572
            return;
573
        }
574
//        I18nManager i18n = ToolsLocator.getI18nManager();
575
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
576
        WindowManager_v2 windowManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
577
        
578
        XMLTableInfo tableInfo = x.getValue();
579
        EditableFeatureType featureType = tableInfo.getFeatureType();
580
        
581
        FeatureTypePanel panel = dataSwingManager.createFeatureTypePanel();
582
        panel.setMode(MODE_EDIT_ALL);
583
//        panel.setRepository(xmlinfo.getRepository());
584
        panel.put(featureType);
585
        Dialog theDialog = windowManager.createDialog(
586
                panel.asJComponent(),
587
                ToolsSwingUtils.makeTitle("_Xml2db_Column_manager", tableInfo.getName(), featureType.getLabel()),
588
                null, 
589
                WindowManager_v2.BUTTONS_OK_CANCEL
590
        );
591
        theDialog.addActionListener((ActionEvent e) -> {
592
            if( theDialog.getAction()==WindowManager_v2.BUTTON_OK) {
593
                panel.fetch(x.getValue().getFeatureType());
594
            }
595
        });
596
        theDialog.show(
597
                WindowManager.MODE.WINDOW,
598
                Collections.singletonMap("align", GridBagConstraints.CENTER)
599
        );
600
    }
601
    
602
    private void doChangeXMLfile() {
603
        File xmlfile = this.pickerXMLFile.get();
604
        if( xmlfile != null ) {
605
            File dbfile = this.pickerDbfile.get();
606
            if( dbfile == null ) {
607
                dbfile = new File(FilenameUtils.removeExtension(xmlfile.getAbsolutePath()));
608
                this.pickerDbfile.set(dbfile);
609
                this.txtRepositoryName.setText(FilenameUtils.getBaseName(xmlfile.getName()));
610
            }
611
        }
612
        updateStateComponents();
613
    }
614
    
615
    private void doChangeDBfile() {
616
        File dbfile = this.pickerDbfile.get();
617
        if( dbfile != null ) {
618
            String repoName = this.txtRepositoryName.getText();
619
            if( StringUtils.isBlank(repoName) ) {
620
                this.txtRepositoryName.setText(FilenameUtils.getBaseName(dbfile.getName()));
621
            }
622
        }
623
        updateStateComponents();
624
    }
625
    
626
    private void message(String msg) {
627
        message(msg,JOptionPane.INFORMATION_MESSAGE);
628
    }
629
    
630
    private void message(String msg, int type) {
631
        if( StringUtils.isBlank(msg) ) {
632
            this.lblStatusMsg.setText("");
633
            return;
634
        }
635
        if( type == JOptionPane.WARNING_MESSAGE ) {
636
            msg = Xml2dbSwingCommons.getHTMLColorTag(Color.RED.darker(), msg);
637
        }        
638
        this.lblStatusMsg.setText(msg);
639
        this.lblStatusMsg.setVisible(true);
640
    }
641
    
642
    private int getMode() {
643
        LabeledValue<Integer> item = (LabeledValue) this.cboMode.getSelectedItem();
644
        if (item == null){
645
            return MODE_NEW;
646
        }
647
        return item.getValue();
648
    }
649
    
650
}