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 / app / extension / updatetable / UpdateTablePanelImpl.java @ 47490

History | View | Annotate | Download (29.6 KB)

1
/*
2
 * To change this license header, choose License Headers in Project Properties.
3
 * To change this template file, choose Tools | Templates
4
 * and open the template in the editor.
5
 */
6
package org.gvsig.app.extension.updatetable;
7

    
8
import java.awt.Component;
9
import java.awt.Dimension;
10
import java.awt.event.ActionEvent;
11
import java.awt.event.ActionListener;
12
import java.util.ArrayList;
13
import java.util.Iterator;
14
import java.util.List;
15
import java.util.Objects;
16
import javax.swing.AbstractCellEditor;
17
import javax.swing.ImageIcon;
18
import javax.swing.JComboBox;
19
import javax.swing.JLabel;
20
import javax.swing.JOptionPane;
21
import javax.swing.JTable;
22
import javax.swing.ListSelectionModel;
23
import javax.swing.SwingUtilities;
24
import javax.swing.event.ChangeEvent;
25
import javax.swing.event.TreeSelectionEvent;
26
import javax.swing.table.AbstractTableModel;
27
import javax.swing.table.DefaultTableColumnModel;
28
import javax.swing.table.TableCellEditor;
29
import javax.swing.table.TableColumn;
30
import org.apache.commons.io.FilenameUtils;
31
import org.apache.commons.lang.StringUtils;
32
import org.gvsig.app.ApplicationLocator;
33
import static org.gvsig.app.extension.updatetable.UpdateTableProcessParameters.BATCHUPDATE_PROCESS_ALL;
34
import static org.gvsig.app.extension.updatetable.UpdateTableProcessParameters.BATCHUPDATE_PROCESS_EDITEDS;
35
import static org.gvsig.app.extension.updatetable.UpdateTableProcessParameters.BATCHUPDATE_PROCESS_SELECTION;
36
import org.gvsig.app.extension.updatetable.UpdateTableProcessParameters.ProcessFieldParameters;
37
import org.gvsig.configurableactions.ConfigurableActionsMamager;
38
import org.gvsig.expressionevaluator.Expression;
39
import org.gvsig.expressionevaluator.ExpressionUtils;
40
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
41
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
42
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
43
import org.gvsig.expressionevaluator.swing.JExpressionPicker;
44
import org.gvsig.fmap.dal.DataStoreProviderFactory;
45
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
46
import org.gvsig.fmap.dal.feature.FeatureStore;
47
import org.gvsig.fmap.dal.feature.FeatureStoreProviderFactory;
48
import org.gvsig.fmap.dal.feature.FeatureType;
49
import org.gvsig.fmap.dal.swing.DALSwingLocator;
50
import org.gvsig.fmap.dal.swing.DataSwingManager;
51
import org.gvsig.fmap.dal.swing.featuretable.SimpleFeaturesTableModel;
52
import org.gvsig.fmap.dal.swing.featuretype.AttributeDescriptorPickerController;
53
import org.gvsig.fmap.dal.swing.featuretype.FeatureAttributesSelectionPanel;
54
import org.gvsig.fmap.dal.swing.storesrepository.StoresRepositoryController;
55
import org.gvsig.tools.ToolsLocator;
56
import org.gvsig.tools.bookmarksandhistory.Bookmarks;
57
import org.gvsig.tools.bookmarksandhistory.History;
58
import org.gvsig.tools.future.FutureUtils;
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.bookmarkshistory.ActionEventWithCurrentValue;
64
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_GETVALUE;
65
import static org.gvsig.tools.swing.api.bookmarkshistory.ActionEventWithCurrentValue.ID_SETVALUE;
66
import org.gvsig.tools.swing.api.bookmarkshistory.BookmarksController;
67
import org.gvsig.tools.swing.api.bookmarkshistory.HistoryController;
68
import org.gvsig.tools.swing.api.documentfilters.IntegerDocumentFilter;
69
import org.gvsig.tools.swing.api.task.TaskStatusController;
70
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
71
import org.gvsig.tools.swing.api.windowmanager.Dialog;
72
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
73
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
74
import org.gvsig.tools.swing.icontheme.IconTheme;
75
import org.gvsig.tools.task.SimpleTaskStatus;
76
import org.gvsig.tools.util.ToolsUtilLocator;
77

    
78
/**
79
 *
80
 * @author jjdelcerro
81
 */
82
public class UpdateTablePanelImpl extends UpdateTablePanelView {
83

    
84
    private static final String BOOKMARKSANDHISTORY_NAME = "UpdateTablePanel";
85
    private static final String CONFIGURABLE_PANEL_ID = "UpdateTablePanel";
86
    
87
    private FeatureStore table;
88
    private ExpressionPickerController pickerTableFilter;
89
    private DefaultTableColumnModel fieldsColumnModel;
90
    private SimpleTaskStatus taskStatus;
91
    private TaskStatusController status;
92
    private List<String> previewColumns;
93
    private final Bookmarks bookmarks;
94
    private final History history;
95
    private BookmarksController bookmarksController;
96
    private HistoryController historyController;
97
    private StoresRepositoryController treeTableController;
98

    
99
    private class FeatureAttributeCellEditor extends AbstractCellEditor implements TableCellEditor {
100

    
101
        private final AttributeDescriptorPickerController picker;
102
        private final JComboBox combo;
103
        
104
        public FeatureAttributeCellEditor() {
105
            DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
106
            this.combo = new JComboBox();
107
            this.picker = dataSwingManager.createAttributeDescriptorPickerController(this.combo);
108
        }
109

    
110
        @Override
111
        public Component getTableCellEditorComponent(JTable jtable, Object value, boolean isSelected, int row, int column) {
112
            if( value == null ) {
113
                this.picker.clean();
114
                return this.combo;
115
            }
116
            this.picker.setFeatureType(table.getDefaultFeatureTypeQuietly());
117
            this.picker.setAllowNull(true);
118
            this.picker.set(Objects.toString(value,"")); 
119
            return this.combo;
120
        }
121

    
122
        @Override
123
        public Object getCellEditorValue() {
124
            return this.picker.getName();
125
        }        
126
    }
127
    
128
    private class ExpressionCellEditor extends AbstractCellEditor implements TableCellEditor {
129

    
130
        private final JExpressionPicker picker;
131

    
132
        public ExpressionCellEditor() {
133
            ExpressionEvaluatorSwingManager manager = ExpressionEvaluatorSwingLocator.getManager();
134
            this.picker = manager.createJExpressionPicker();
135
            this.picker.removeBorder();
136
        }
137

    
138
        @Override
139
        public Component getTableCellEditorComponent(JTable jtable, Object value, boolean isSelected, int row, int column) {
140
            try {
141
                DataSwingManager manager = DALSwingLocator.getDataSwingManager();
142
                manager.configureExpressionBuilder(picker.getConfig(), table);
143
                if( value == null ) {
144
                    this.picker.setExpression(null);
145
                } else {
146
                    this.picker.setExpression(ExpressionUtils.createExpression((String) value));
147
                }
148
                return this.picker.asJComponent();
149
            } catch(Exception ex) {
150
                return new JLabel();
151
            }
152
        }
153

    
154
        @Override
155
        public Object getCellEditorValue() {
156
            Expression exp = this.picker.getExpression();
157
            if( exp==null ) {
158
                return null;
159
            }
160
            return exp.getPhrase();
161
        }        
162
    }
163
    
164
    private class MyTableModel extends AbstractTableModel implements Iterable<MyTableModel.Row>{
165

    
166
        private final List<Row> rows;
167
        private final String[] columnNames;
168
        private final Class[] columnClass;
169
        private final FeatureType tableType;
170
        
171
        private class Row {
172
            String attrname;
173
            String expression;
174
            boolean update;
175
            
176
            public Object get(int index) {
177
                switch(index) {
178
                    case 0:
179
                        return update;
180
                    case 1:
181
                        return attrname;
182
                    case 2:
183
                        return expression;
184
                    default:
185
                        return null;
186
                }
187
            }
188
            
189
            public void set(int index, Object value) {
190
                switch(index) {
191
                    case 0:
192
                        this.update = (boolean) value;
193
                        break;
194
                    case 1:
195
                        this.attrname = (String) value;
196
                        break;
197
                    case 2:
198
                        this.expression = (String) value;
199
                        break;
200
                    default:
201
                        break;
202
                }
203
            }
204
        }
205
        
206
        public MyTableModel() {
207
            this.rows = new ArrayList<>();
208
            this.tableType = table.getDefaultFeatureTypeQuietly();
209
            for (FeatureAttributeDescriptor targetAttr : tableType) {
210
                Row row = new Row();
211
                row.attrname = targetAttr.getName();
212
                row.expression = null;
213
                if( targetAttr.isAutomatic() || targetAttr.isReadOnly() || targetAttr.isPrimaryKey() ) {
214
                    row.update = false;
215
                } else {
216
                    row.update = true;
217
                }
218
                this.rows.add(row);
219
            }
220
            this.columnNames = new String[] {
221
                "Actualizarxxxxx",
222
                "Campo",
223
                "Expresion"
224
            };
225
            this.columnClass = new Class[] {
226
                Boolean.class,
227
                String.class,
228
                String.class
229
            };
230
        }
231

    
232
        @Override
233
        public String getColumnName(int column) {
234
            return this.columnNames[column];
235
        }
236

    
237
        @Override
238
        public Class<?> getColumnClass(int columnIndex) {
239
            return this.columnClass[columnIndex];
240
        }
241
        
242
        @Override
243
        public int getRowCount() {
244
            return this.rows.size();
245
        }
246

    
247
        @Override
248
        public int getColumnCount() {
249
            return 3;
250
        }
251

    
252
        @Override
253
        public Object getValueAt(int rowIndex, int columnIndex) {
254
            return this.rows.get(rowIndex).get(columnIndex);
255
        }
256

    
257
        @Override
258
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
259
            this.rows.get(rowIndex).set(columnIndex, aValue);
260
        }
261
        
262
        @Override
263
        public boolean isCellEditable(int rowIndex, int columnIndex) {
264
            FeatureAttributeDescriptor attrdesc = this.tableType.getAttributeDescriptor(rowIndex);
265
            if( attrdesc == null ) {
266
                return false;
267
            }
268
            if( attrdesc.isAutomatic() || attrdesc.isReadOnly() || attrdesc.isPrimaryKey() ) {
269
                return false;
270
            }
271
            switch(columnIndex) {
272
                case 0:
273
                case 1:
274
                case 2:
275
                default:
276
                    return true;
277
            }
278
        }
279

    
280
        @Override
281
        public Iterator<Row> iterator() {
282
            return this.rows.iterator();
283
        }
284
    }
285
    
286
    public UpdateTablePanelImpl() {
287
        this.bookmarks = ToolsLocator.getBookmarksAndHistoryManager().getBookmarksGroup(BOOKMARKSANDHISTORY_NAME);
288
        this.history = ToolsLocator.getBookmarksAndHistoryManager().getHistoryGroup(BOOKMARKSANDHISTORY_NAME);
289

    
290
        this.initComponents();
291
    }
292

    
293
    private void initComponents() {
294
//        DataManager dataManager = DALLocator.getDataManager();
295
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
296
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
297
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
298
        
299
        ConfigurableActionsMamager cfgActionsManager = ToolsUtilLocator.getConfigurableActionsMamager();
300
        cfgActionsManager.addConfigurableActions(CONFIGURABLE_PANEL_ID, this, btnConfigurableActions);
301

    
302
        this.bookmarksController = ToolsSwingLocator.getToolsSwingManager().createBookmarksController(this.bookmarks, btnBookmarks);
303
        this.historyController = ToolsSwingLocator.getToolsSwingManager().createHistoryController(this.history, btnHistory);
304

    
305
        this.historyController.setFilter(null);
306

    
307
        ActionListener bookmarksAndHistoryListener = (ActionEvent e) -> {
308
                ActionEventWithCurrentValue<UpdateTableProcessParameters> event = (ActionEventWithCurrentValue<UpdateTableProcessParameters>) e;
309
                switch (event.getID()) {
310
                        case ID_GETVALUE:
311
                                event.setCurrentValue(fetch(null));
312
                                break;
313
                        case ID_SETVALUE:
314
                                put(event.getCurrentValue());
315
                                break;
316
                }
317
        };
318
        this.historyController.addActionListener(bookmarksAndHistoryListener);
319
        this.bookmarksController.addActionListener(bookmarksAndHistoryListener);
320
        
321
        this.rdoOptionsFulledit.setSelected(true);
322
        this.rdoOptionsFulledit.addActionListener((ActionEvent e) -> { doChangeSelectedEditMode(); });
323

    
324
        this.rdoOptionsPassthrought.setSelected(false);
325
        this.rdoOptionsPassthrought.addActionListener((ActionEvent e) -> { doChangeSelectedEditMode(); });
326
        
327
        this.rdoRecordsAll.setSelected(true);
328
        this.rdoRecordsEditeds.setSelected(false);
329
        this.rdoRecordsSelecteds.setSelected(false);
330
        
331
        this.status = ToolsSwingLocator.getTaskStatusSwingManager().createTaskStatusController(
332
                null,
333
                this.lblStatusLabel, 
334
                this.lblStatusMessage, 
335
                this.pbStatus,
336
                this.btnCancelStatus,
337
                null
338
        );
339
        this.treeTableController = dataSwingManager.createStoresRepositoryController(this.treeTable);
340
        this.treeTable.addTreeSelectionListener((TreeSelectionEvent e) -> {
341
            doChangeTable();
342
        });
343

    
344
        
345
        this.pickerTableFilter = expressionSwingManager.createExpressionPickerController(
346
                this.txtRecordFilter, 
347
                this.btnRecordFilter, 
348
                this.btnRecordFilterBookmarks, 
349
                this.btnRecordFilterHistory
350
        );
351
        this.pickerTableFilter.addChangeListener((ChangeEvent e) -> {
352
            doUpdatePreviewTable();
353
        });
354

    
355
        this.tableFields.setAutoCreateColumnsFromModel(false);
356
        this.tableFields.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
357
        this.fieldsColumnModel = new DefaultTableColumnModel();
358
            
359
        TableColumn column;
360
        
361
        column = new TableColumn();
362
        column.setHeaderValue("Actualizar");
363
        column.setCellRenderer(null);
364
        column.setResizable(true);
365
        column.setModelIndex(0);
366
        this.fieldsColumnModel.addColumn(column);
367

    
368
        column = new TableColumn();
369
        column.setHeaderValue("Campo");
370
        column.setCellRenderer(null);
371
        column.setCellEditor(null);//new FeatureAttributeCellEditor());
372
        column.setResizable(true);
373
        column.setModelIndex(1);
374
        this.fieldsColumnModel.addColumn(column);
375

    
376
        column = new TableColumn();
377
        column.setHeaderValue("Expresion");
378
        column.setCellRenderer(null);
379
        column.setCellEditor(new ExpressionCellEditor());
380
        column.setResizable(true);
381
        column.setModelIndex(2);
382
        this.fieldsColumnModel.addColumn(column);
383

    
384
        
385
        this.tableFields.setColumnModel(this.fieldsColumnModel);
386

    
387
        this.btnRecordsUpdatePreview.addActionListener((ActionEvent e) -> {
388
            doUpdatePreviewTable();
389
        });
390

    
391
        this.btnRecordsConfigurePreviewColumns.addActionListener((ActionEvent e) -> {
392
            doConfigurePreviewColumns();
393
        });
394
        this.btnRecordsUpdatePreview.setEnabled(false);
395
        this.btnRecordsConfigurePreviewColumns.setVisible(false);
396
        this.tblRecordsPreview.setVisible(false);
397

    
398
        this.btnFieldsDeselectAll.addActionListener((ActionEvent e) -> {
399
            MyTableModel model = (MyTableModel) tableFields.getModel();
400
            for (MyTableModel.Row row : model) {
401
                row.update = false;    
402
            }
403
            model.fireTableDataChanged();
404
        });
405
        this.btnFieldsSelectAll.addActionListener((ActionEvent e) -> {
406
            MyTableModel model = (MyTableModel) tableFields.getModel();
407
            for (MyTableModel.Row row : model) {
408
                row.update = true;    
409
            }
410
            model.fireTableDataChanged();
411
        });
412
        IntegerDocumentFilter.install(this.txtOptionsFinishAndRestarEditEach);
413
        
414
        toolsSwingManager.removeBorder(this.tblRecordsPreview);
415

    
416
        this.rdoRecordsAll.addActionListener((ActionEvent e) -> { doUpdateRecordsPreview(); });
417
        this.rdoRecordsEditeds.addActionListener((ActionEvent e) -> { doUpdateRecordsPreview(); });
418
        this.rdoRecordsSelecteds.addActionListener((ActionEvent e) -> { doUpdateRecordsPreview(); });
419

    
420
        SwingUtilities.invokeLater(() -> {
421
            this.lblStatusLabel.setText("");
422
            this.lblStatusMessage.setText("");
423
            this.status.setVisible(false);
424
        });
425
        
426
        Dimension screensize = ApplicationLocator.getApplicationManager().getUIManager().getInternalSize();
427
        ToolsSwingUtils.ensureHeightWitdh(
428
                this, 
429
                Math.max(3*(screensize.height/4), ToolsSwingUtils.rows2px(80)),
430
                Math.max(2*(screensize.width/4), ToolsSwingUtils.cols2px(35)), 
431
                7*(screensize.height/8), 
432
                3*(screensize.width/4)
433
        );            
434
//        ToolsSwingUtils.ensureRowsCols(this, 20, 80, 24, 100);
435
    }
436
    
437
    private void doUpdateRecordsPreview() {
438
        if( this.table == null ) {
439
            this.tblRecordsPreview.setVisible(false);
440
            this.btnRecordsConfigurePreviewColumns.setVisible(false);
441
            this.btnRecordsUpdatePreview.setVisible(false);
442
            return;
443
        }
444
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
445
        SimpleFeaturesTableModel model;
446
        if( this.rdoRecordsAll.isSelected() ) {
447
            model = dataSwingManager.createSimpleFeaturesTableModel(table, this.pickerTableFilter.get());
448
        } else if( this.rdoRecordsEditeds.isSelected() ) {
449
            model = dataSwingManager.createSimpleEditedFeaturesTableModel(table, this.pickerTableFilter.get());
450
        } else if( this.rdoRecordsSelecteds.isSelected() ) {
451
            model = dataSwingManager.createSimpleSelectedFeaturesTableModel(table, this.pickerTableFilter.get());
452
        } else {
453
            // FIXME
454
            model = dataSwingManager.createSimpleFeaturesTableModel(table, this.pickerTableFilter.get());
455
        }
456
        model.setCellRenderers(tblRecordsPreview);
457
        this.tblRecordsPreview.setModel(model);
458
        this.tblRecordsPreview.setVisible(true);
459
        this.btnRecordsConfigurePreviewColumns.setVisible(false);
460
        this.btnRecordsUpdatePreview.setVisible(false);
461
        this.btnRecordsUpdatePreview.setEnabled(true);
462
    }
463
    
464
    private void doChangeTable() {
465
        this.table = this.treeTableController.getSelectedFeatureStore();
466
        if( this.table==null ) {
467
            return;
468
        }
469
        DataSwingManager dataSwingManager = DALSwingLocator.getSwingManager();
470
        dataSwingManager.configureExpressionBuilder(pickerTableFilter.getConfig(), table);
471
        this.tableFields.setModel(new MyTableModel());
472
        doUpdateRecordsPreview();
473
        
474
        FeatureStoreProviderFactory providerFactory = (FeatureStoreProviderFactory) this.getTable().getProviderFactory();
475
        switch( providerFactory.supportPassthroughMode() ) {
476
            case DataStoreProviderFactory.NO:
477
                this.rdoOptionsPassthrought.setSelected(false);
478
                this.rdoOptionsFulledit.setSelected(true);
479
                break;
480
            case DataStoreProviderFactory.YES:
481
            case DataStoreProviderFactory.UNKNOWN:
482
                if( !this.rdoOptionsPassthrought.isSelected() ) {
483
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
484
                    int n = dialogs.confirmDialog(
485
                            "La tabla seleccionada soporta el modo de paso-a-traves que es mas optimo que el actualmente seleccionado." +
486
                                    "\n" +
487
                                    "? Desea pasar a usar el modo de paso-a-traves ?",
488
                            "Update table",
489
                            JOptionPane.YES_NO_OPTION,
490
                            JOptionPane.QUESTION_MESSAGE,
491
                            "Desea pasar a usar el modo de paso-a-traves"
492
                    );
493
                    if( n==JOptionPane.YES_OPTION ) {
494
                        this.rdoOptionsPassthrought.setSelected(true);
495
                        this.rdoOptionsFulledit.setSelected(false);
496
                        this.doChangeSelectedEditMode();
497
                    }
498
                }
499
                break;
500
        }
501
    }
502

    
503
    private void doUpdatePreviewTable() {
504
        DataSwingManager manager = DALSwingLocator.getDataSwingManager();
505
        FeatureType ftype = this.table.getDefaultFeatureTypeQuietly();
506
        SimpleFeaturesTableModel model = manager.createSimpleFeaturesTableModel(
507
            ftype, 
508
            this.previewColumns, 
509
            this.table.getFeatures(this.pickerTableFilter.get())
510
        );
511
        this.tblRecordsPreview.setModel(model);
512
        this.btnRecordsConfigurePreviewColumns.setVisible(true);
513
        this.tblRecordsPreview.setVisible(true);
514
        if( this.previewColumns==null ) {
515
            this.previewColumns = model.getColumnNames();
516
        }
517
    }
518
    
519
    private void doConfigurePreviewColumns() {
520
        WindowManager_v2 winmanager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
521
        I18nManager i18n = ToolsLocator.getI18nManager();
522
        
523
        FeatureType ftype = this.table.getDefaultFeatureTypeQuietly();
524

    
525
        FeatureAttributesSelectionPanel panelSelectColumns = DALSwingLocator.getManager().createFeatureAttributeSelectionPanel();
526
        panelSelectColumns.allowCalculatedAttributes(false);
527
        panelSelectColumns.setFeatureType(ftype);
528
        panelSelectColumns.setSelectedNames(this.previewColumns);
529
        final Dialog dialog = winmanager.createDialog(
530
                panelSelectColumns.asJComponent(),
531
                i18n.getTranslation("_Select_the_columns_to_display"),
532
                null,
533
                WindowManager_v2.BUTTONS_OK_CANCEL
534
        );
535
        dialog.addActionListener((ActionEvent e) -> {
536
                if (dialog.getAction() == WindowManager_v2.BUTTONS_OK) {
537
                    this.previewColumns = panelSelectColumns.getSelectedNames();
538
                    doUpdatePreviewTable();
539
                }
540
        });
541
        dialog.show(WindowManager.MODE.DIALOG);
542
    }
543
    
544
    public FeatureStore getTable() {
545
        return this.table;
546
    }
547

    
548
    public Expression getTableFilter() {
549
        return this.pickerTableFilter.get();
550
    }
551

    
552
    public SimpleTaskStatus getStatus() {
553
        if( this.taskStatus == null ) {
554
            this.taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("Copy table");
555
            this.status.bind(this.taskStatus);
556
        }
557
        this.status.setVisible(true);
558
        return this.taskStatus;
559
    }
560

    
561
    public void put(UpdateTableProcessParameters params) {
562
        this.table = null;
563
        switch(params.getEditMode()) {
564
            case FeatureStore.MODE_FULLEDIT:
565
            default:
566
                this.rdoOptionsFulledit.setSelected(true);
567
                this.rdoOptionsPassthrought.setSelected(false);
568
                break;
569
            case FeatureStore.MODE_PASS_THROUGH:
570
                this.rdoOptionsFulledit.setSelected(false);
571
                this.rdoOptionsPassthrought.setSelected(true);
572
                break;
573
        }
574
        this.chkOptionsBeginEditIfNeed.setSelected(params.isBeginEditIfNeed());
575
        this.chkOptionsFinishAndRestarEditEach.setSelected(params.isFinishAndRestarEdit());
576
        this.chkOptionsNotifyUserIfNeedBeginEditing.setSelected(params.isNotifyUserIfNeedBeginEditing());
577
        this.chkOptionsFinishEditAfterTerminate.setSelected(params.isFinishEditAfterTerminate());
578
        IntegerDocumentFilter.setValue(txtOptionsFinishAndRestarEditEach, params.getFinishAndRestarEditEach());
579
        switch(params.getRowsToProcess()) {
580
            case BATCHUPDATE_PROCESS_SELECTION:
581
                this.rdoRecordsSelecteds.setSelected(true);
582
                this.rdoRecordsEditeds.setSelected(false);
583
                this.rdoRecordsAll.setSelected(false);
584
                break;
585
            case BATCHUPDATE_PROCESS_EDITEDS:
586
                this.rdoRecordsSelecteds.setSelected(false);
587
                this.rdoRecordsEditeds.setSelected(true);
588
                this.rdoRecordsAll.setSelected(false);
589
                break;
590
            case BATCHUPDATE_PROCESS_ALL:
591
                this.rdoRecordsSelecteds.setSelected(false);
592
                this.rdoRecordsEditeds.setSelected(false);
593
                this.rdoRecordsAll.setSelected(true);
594
                break;
595
        }
596
        this.table = params.getStore();
597
        MyTableModel fieldsModel = new MyTableModel();
598
        this.tableFields.setModel(fieldsModel);
599
        for (MyTableModel.Row row : fieldsModel.rows) {
600
            ProcessFieldParameters paramfield = params.get(row.attrname);
601
            row.expression = paramfield.getExpression().getPhrase();
602
            row.update = paramfield.isUpdate();
603
        }
604
        fieldsModel.fireTableDataChanged();
605
    }
606
    
607
    public UpdateTableProcessParameters fetch(UpdateTableProcessParameters params) {
608
        if (this.tableFields.isEditing()) {
609
            this.tableFields.getCellEditor().stopCellEditing();
610
        }
611
        if( params == null ) {
612
            params = new UpdateTableProcessParametersImpl();
613
        }
614
        params.setStore(table);
615
        if( this.rdoRecordsSelecteds.isSelected() ) {
616
            params.setRowsToProcess(BATCHUPDATE_PROCESS_SELECTION);
617
        }
618
        if( this.rdoRecordsEditeds.isSelected() ) {
619
            params.setRowsToProcess(BATCHUPDATE_PROCESS_EDITEDS);
620
        }
621
        if( this.rdoRecordsAll.isSelected() ) {
622
            params.setRowsToProcess(BATCHUPDATE_PROCESS_ALL);
623
        }
624
        MyTableModel model = (MyTableModel) this.tableFields.getModel();
625
        for (MyTableModel.Row row : model) {
626
            Expression exp = null;
627
            if( StringUtils.isNotBlank(row.expression)) {
628
                exp = ExpressionUtils.createExpression(row.expression);
629
            }
630
            params.add(row.attrname, row.update, exp);
631
        }    
632
        if( this.rdoOptionsFulledit.isSelected() ) {
633
            params.setEditMode(FeatureStore.MODE_FULLEDIT);
634
        } else {
635
            params.setEditMode(FeatureStore.MODE_PASS_THROUGH);
636
        }
637
        params.setBeginEditIfNeed(this.chkOptionsBeginEditIfNeed.isSelected());
638
        params.setFinishAndRestarEdit(this.chkOptionsFinishAndRestarEditEach.isSelected());
639
        params.setNotifyUserIfNeedBeginEditing(this.chkOptionsNotifyUserIfNeedBeginEditing.isSelected());
640
        params.setFinishEditAfterTerminate(this.chkOptionsFinishEditAfterTerminate.isSelected());
641
        params.setFinishAndRestarEditEach(IntegerDocumentFilter.getValue(txtOptionsFinishAndRestarEditEach));
642
        params.setFilter(this.pickerTableFilter.get());
643
        this.history.add(params);
644
        return params;
645
    }
646
    
647
    public void postProcess() {
648
        if( !SwingUtilities.isEventDispatchThread() ) {
649
            SwingUtilities.invokeLater(this::postProcess);
650
            return;
651
        }
652
        // TODO
653
    }
654

    
655
    @Override
656
    public ImageIcon loadImage(String imageName) {
657
        String name = FilenameUtils.getBaseName(imageName);
658
        IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
659
        if (theme.exists(name)) {
660
            return theme.get(name);
661
        }
662
        return null;
663
    }    
664
    
665
    private void doChangeSelectedEditMode() {
666
        if( this.rdoOptionsPassthrought.isSelected() ) {
667
            this.chkOptionsBeginEditIfNeed.setEnabled(false);
668
            this.chkOptionsFinishAndRestarEditEach.setEnabled(false);
669
            this.chkOptionsFinishEditAfterTerminate.setEnabled(false);
670
            this.chkOptionsNotifyUserIfNeedBeginEditing.setEnabled(false);
671
            this.txtOptionsFinishAndRestarEditEach.setEnabled(false);
672

    
673
            this.rdoOptionsFulledit.setSelected(false);
674
        }
675
        
676
        if( this.rdoOptionsFulledit.isSelected() ) {
677
            this.chkOptionsBeginEditIfNeed.setEnabled(true);
678
            this.chkOptionsFinishAndRestarEditEach.setEnabled(true);
679
            this.chkOptionsFinishEditAfterTerminate.setEnabled(true);
680
            this.chkOptionsNotifyUserIfNeedBeginEditing.setEnabled(true);
681
            this.txtOptionsFinishAndRestarEditEach.setEnabled(true);
682
            
683
        }
684
        
685
    }
686
    
687
    public static int confirmUpdateTableParameters(UpdateTableProcessParameters params) {
688
        if( params.isNotifyUserIfNeedBeginEditing() ) {
689
            FeatureStore store = params.getStore();
690
            if( store==null ) {
691
                // Informar al usuario
692
                return JOptionPane.NO_OPTION;
693
            }
694
            if( store.getMode()!=FeatureStore.MODE_QUERY ) {
695
               // Preguntar: "Los cambios a realizar no se podran deshacer. Se encuentra ya en edicion. ? Desea continuar ?"
696
            } else {
697
               // Preguntar: "Los cambios a realizar no se podran deshacer ? Desea continuar ?"
698
               // Recordar respuesta
699
            }
700
        } else {
701
            FeatureStore store = params.getStore();
702
            if( store==null ) {
703
                // Informar al usuario
704
                return JOptionPane.NO_OPTION;
705
            }
706
            if( store.getMode()!=FeatureStore.MODE_QUERY ) {
707
               // Preguntar: "Los cambios a realizar no se podran deshacer ? Desea continuar ?"
708
               // Recordar respuesta
709
            }
710
        }
711
        return JOptionPane.YES_OPTION;
712
    }
713
}