Revision 9512 org.gvsig.online/trunk/org.gvsig.online/org.gvsig.online.swing/org.gvsig.online.swing.impl/src/main/java/org/gvsig/online/swing/impl/changes/RemoteChangesController.java

View differences:

RemoteChangesController.java
28 28
import java.awt.event.KeyAdapter;
29 29
import java.awt.event.KeyEvent;
30 30
import java.util.ArrayList;
31
import java.util.Iterator;
32 31
import java.util.List;
33 32
import javax.swing.JButton;
34 33
import javax.swing.JLabel;
......
36 35
import javax.swing.JTable;
37 36
import javax.swing.ListSelectionModel;
38 37
import javax.swing.SwingUtilities;
39
import javax.swing.event.ChangeEvent;
40 38
import javax.swing.event.ListSelectionEvent;
39
import javax.swing.event.TableModelEvent;
40
import javax.swing.event.TableModelListener;
41 41
import javax.swing.table.DefaultTableCellRenderer;
42
import javax.swing.table.DefaultTableModel;
42
import javax.swing.table.TableModel;
43 43
import org.apache.commons.collections.CollectionUtils;
44 44
import org.apache.commons.lang3.mutable.MutableLong;
45 45
import org.apache.commons.lang3.mutable.MutableObject;
......
47 47
import org.gvsig.fmap.dal.feature.Feature;
48 48
import org.gvsig.fmap.dal.feature.FeatureStore;
49 49
import org.gvsig.fmap.dal.feature.FeatureType;
50
import org.gvsig.fmap.dal.feature.exception.ConcurrentDataModificationException;
50 51
import org.gvsig.fmap.dal.swing.DALSwingLocator;
51 52
import org.gvsig.fmap.dal.swing.DataSwingManager;
52 53
import org.gvsig.fmap.geom.Geometry;
53 54
import org.gvsig.fmap.geom.GeometryLocator;
54 55
import org.gvsig.fmap.geom.GeometryUtils;
55 56
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
57
import org.gvsig.fmap.geom.primitive.Envelope;
56 58
import org.gvsig.json.Json;
57 59
import static org.gvsig.online.lib.api.OnlineManager.ERR_OK;
58 60
import static org.gvsig.online.lib.api.OnlineManager.OP_DELETE;
59 61
import org.gvsig.online.lib.api.OnlineRuntimeException;
60
import org.gvsig.online.lib.api.workingcopy.OnlineChange;
61 62
import org.gvsig.online.lib.api.workingcopy.OnlineEntity;
62 63
import org.gvsig.online.lib.api.workingcopy.OnlineRemoteChange;
63 64
import org.gvsig.online.lib.api.workingcopy.OnlineWorkingcopy;
64
import org.gvsig.online.lib.api.workingcopy.OnlineWorkingcopyChanges;
65
import org.gvsig.online.swing.api.OnlineEntitySelectorController;
66 65
import org.gvsig.online.swing.api.OnlineSwingLocator;
67 66
import org.gvsig.online.swing.api.OnlineSwingManager;
68 67
import org.gvsig.online.swing.api.OnlineSwingServices;
......
70 69
import static org.gvsig.online.swing.api.OnlineSwingServices.HIGHLIGHT_WORKSPACE;
71 70
import org.gvsig.online.swing.impl.OnlineSwingCommons;
72 71
import static org.gvsig.online.swing.impl.OnlineSwingCommons.cleanHighligthed;
72
import static org.gvsig.online.swing.impl.OnlineSwingCommons.getHTMLFontColorTag;
73 73
import static org.gvsig.online.swing.impl.OnlineSwingCommons.notInSwingThreadInvokeLater;
74 74
import static org.gvsig.online.swing.impl.OnlineSwingCommons.refreshDocument;
75 75
import static org.gvsig.online.swing.impl.OnlineSwingCommons.showAuthenticationErrors;
......
91 91
import org.gvsig.tools.task.UserCancelTaskException;
92 92
import org.slf4j.Logger;
93 93
import org.slf4j.LoggerFactory;
94
import org.gvsig.online.lib.api.workingcopy.OnlineChanges;
94 95

  
95 96
/**
96 97
 *
......
100 101
public class RemoteChangesController extends AbstractDisposable {
101 102

  
102 103
    private static final Logger LOGGER = LoggerFactory.getLogger(RemoteChangesController.class);
104
    private static final int MAX_SELECTED_ROWS_TO_SHOW_GEOMETRIES = 200;
103 105

  
104 106
    private final PickerController<OnlineWorkingcopy> workspacePicker;
105 107
    private final JTable tblRemoteChanges;
......
109 111
    private final JButton btnRemoteReloadChanges;
110 112
    private final JButton btnRemoteCheckAll;
111 113
    private final JButton btnRemoteUnCheckAll;
112
//    private final JButton btnRemoteExpandAllEntities;
113
//    private final JButton btnRemoteCollapseAllEntities;
114
//    private final JTree treeRepositoryTables;
115
//    private final JTextComponent txtRepositoryTablesFilter;
116
//    private final JButton btnRepositoryTablesFilter;
117 114

  
118
    private OnlineWorkingcopyChanges<OnlineRemoteChange> changes;
115
//    private OnlineChanges<OnlineRemoteChange> changes;
119 116

  
120
//    private final JButton btnRemoteTablesReload;
121 117
    private final JButton btnRemoteCleanChanges;
122 118
    private final OnlineJChangesImpl context;
123 119
    
......
125 121
    private final JButton btnRemoteZoom;
126 122
    private final JButton btnRemoteCenter;
127 123
    private final JButton btnRemoteHighlight;
128
//    private final JButton btnRemoteCheckout;
129
//    private final JButton btnRemoteCheckoutOverwrite;
130 124
    private final JButton btnRemoteCleanHighligthed;
131 125

  
132 126
    private final JLabel lblRemoteChangesCount;
133
//    private OnlineEntitySelectorController entitySelector;
134
//    private final JButton btnRemoteCheckRecomendedEntities;
135
//    private final JButton btnRemoteUnCheckAllEntities;
136 127

  
137 128
    public RemoteChangesController(
138 129
            OnlineJChangesImpl context,
139 130
            PickerController<OnlineWorkingcopy> workspacePicker,
140
//            JTree treeRepositoryTables,
141
//            JTextComponent txtRepositoryTablesFilter,
142
//            JButton btnRepositoryTablesFilter,
143
//            JButton btnRemoteTablesReload,
144 131
            JTable tblRemoteChanges,
145 132
            JButton btnRemoteCheckAll,
146 133
            JButton btnRemoteUnCheckAll,
147
//            JButton btnRemoteExpandAllEntities,
148
//            JButton btnRemoteCollapseAllEntities,
149 134
            JButton btnRemoteReloadChanges,
150 135
            JButton btnRemoteCleanChanges,
151 136
            JButton btnRemoteUpdate,
......
155 140
            JButton btnRemoteCenter,
156 141
            JButton btnRemoteHighlight,
157 142
            JButton btnRemoteCleanHighligthed,
158
            JLabel lblRemoteChangesCount//,
159
//            JButton btnRemoteCheckRecomendedEntities,
160
//            JButton btnRemoteUnCheckAllEntities
143
            JLabel lblRemoteChangesCount
161 144
    ) {
162 145
        this.context = context;
163 146

  
164 147
        this.workspacePicker = workspacePicker;
165 148

  
166
//        this.treeRepositoryTables = treeRepositoryTables;
167
//        this.txtRepositoryTablesFilter = txtRepositoryTablesFilter;
168
//        this.btnRepositoryTablesFilter = btnRepositoryTablesFilter;
169
        
170
//        this.btnRemoteTablesReload = btnRemoteTablesReload;
171

  
172 149
        this.tblRemoteChanges = tblRemoteChanges;
173 150
        this.btnRemoteCheckAll = btnRemoteCheckAll;
174 151
        this.btnRemoteUnCheckAll = btnRemoteUnCheckAll;
175 152
        
176
//        this.btnRemoteExpandAllEntities = btnRemoteExpandAllEntities;
177
//        this.btnRemoteCollapseAllEntities = btnRemoteCollapseAllEntities;
178
        
179 153
        this.btnRemoteCleanChanges = btnRemoteCleanChanges;
180 154
        this.btnRemoteReloadChanges = btnRemoteReloadChanges;
181 155

  
......
191 165

  
192 166
        this.lblRemoteChangesCount= lblRemoteChangesCount;
193 167
        
194
//        this.btnRemoteCheckRecomendedEntities = btnRemoteCheckRecomendedEntities;
195
//        this.btnRemoteUnCheckAllEntities = btnRemoteUnCheckAllEntities;
196
        
197 168
        initComponents();
198 169
    }
199 170

  
......
213 184
        this.btnRemoteMerge.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
214 185
        this.btnRemoteReloadChanges.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
215 186
        this.btnRemoteShowForm.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
216
//        this.btnRemoteTablesReload.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
217 187
        this.btnRemoteUnCheckAll.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
218 188
        this.btnRemoteUpdate.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
219 189
        this.btnRemoteZoom.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
......
223 193

  
224 194
        translate();
225 195

  
226
//        this.entitySelector = OnlineSwingLocator.getOnlineSwingManager().createEntitySelectorController(
227
//                this.treeRepositoryTables, 
228
//                this.txtRepositoryTablesFilter, 
229
//                this.btnRepositoryTablesFilter
230
//        );
231
//        this.entitySelector.setViewFilter(OnlineEntitySelectorController.ALL_ENTITIES);
232
//        this.entitySelector.setFilter(OnlineEntitySelectorController.ALL_ENTITIES);
233
//        this.entitySelector.setChecksEnabled(true);
234
//        this.entitySelector.addChangeListener((ChangeEvent e) -> {
235
//            doReloadChanges();
236
//        });
237
//        this.entitySelector.addActionListener((ActionEvent e) -> {
238
//            switch(e.getID()) {
239
//                case OnlineEntitySelectorController.ACTION_SELECT_ID:
240
//                    doUpdateComponents();
241
//                    break;
242
//                case OnlineEntitySelectorController.ACTION_CHECK_ID:
243
//                    doReloadChanges();
244
//                    doUpdateComponents();
245
//                    break;
246
//                case OnlineEntitySelectorController.ACTION_RELOAD_ID:
247
//                    doReloadChanges();
248
//                    doUpdateComponents();
249
//                    break;
250
//            }
251
//        });
252
        
253
        
254
//        lstRemoteTables.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
255
//
256
//        lstRemoteTables.setCellRenderer(new DefaultListCellRenderer() {
257
//            @Override
258
//            public java.awt.Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
259
//                JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
260
//                LabeledValue lvalue = (LabeledValue) value;
261
//                OnlineEntity entity = (OnlineEntity) lvalue.getValue();
262
//                String entityCode = entity.getEntityCode();
263
//                OnlineEntity lentity = getUndisposableWorkspace().getWorkspaceEntity(entityCode);
264
//                String s = OnlineSwingCommons.getHTMLColorTag(
265
//                        lentity == null ? OnlineManager.STATE_REPOSITORY_NEW : lentity.getState(),
266
//                        lvalue.getLabel()
267
//                );
268
//                label.setText(s);
269
//                return label;
270
//            }
271
//        });
272
//
273
//        this.lstRemoteTables.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
274
//            doReloadChanges();
275
//        });
276

  
277
//        this.btnRemoteTablesReload.addActionListener((ActionEvent e) -> {
278
//            doReloadTables();
279
//            doReloadChanges();
280
//        });
281

  
282 196
        this.tblRemoteChanges.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
283 197

  
284 198
        this.tblRemoteChanges.addKeyListener(new KeyAdapter() {
......
292 206

  
293 207
        this.tblRemoteChanges.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
294 208
            context.doUpdateComponents();
209
            doUpdateChangesCount();
295 210
        });
296

  
211
        
297 212
        this.btnRemoteCheckAll.addActionListener((ActionEvent e) -> {
298
            if (changes != null) {
299
                doCheckAll();
300
                doReloadChanges();
301
            }
213
            doCheckAll();
302 214
        });
303 215

  
304 216
        this.btnRemoteUnCheckAll.addActionListener((ActionEvent e) -> {
305
            if (changes != null) {
306
                doUnCheckAll();
307
                doReloadChanges();
308
            }
217
            doUnCheckAll();
309 218
        });
310 219

  
311
//        this.btnRemoteCollapseAllEntities.addActionListener((ActionEvent e) -> {
312
//            this.entitySelector.collapseAll();
313
//        });
314
//        this.btnRemoteExpandAllEntities.addActionListener((ActionEvent e) -> {
315
//            this.entitySelector.expandAll();
316
//        });
317
        
318 220
        this.btnRemoteReloadChanges.addActionListener((ActionEvent e) -> {
319
//            doDownloadChangesOfSelectedTable();
320
//            doReloadTables();
221
            doReloadChanges();
321 222
        });
322 223

  
323 224
        this.btnRemoteCleanChanges.addActionListener((ActionEvent e) -> {
324 225
            doCleanChanges();
325
            doReloadChanges();
326 226
        });
327 227

  
328 228
        this.btnRemoteUpdate.addActionListener((ActionEvent e) -> {
......
353 253
            cleanHighligthed();
354 254
        });
355 255

  
356
//        this.btnRemoteCheckRecomendedEntities.addActionListener((ActionEvent e) -> {
357
//            doCheckRecomendedEntities();
358
//        });
359
//        this.btnRemoteUnCheckAllEntities.addActionListener((ActionEvent e) -> {
360
//            this.entitySelector.clearChecks();
361
//        });
362

  
363

  
364 256
        context.doUpdateComponents();
365 257

  
366 258
        SwingUtilities.invokeLater(() -> {
259
            doReloadChanges();
367 260
            message(i18n.getTranslation("_Ready"));
368 261
            this.lblRemoteChangesCount.setText("");
369 262
        });
370 263

  
371 264
    }
372 265
    
373
//    private boolean askUserOverwriteSelectedTables() {
374
//        I18nManager i18n = ToolsLocator.getI18nManager();
375
//        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
376
//        int n = dialogs.confirmDialog(
377
//                i18n.getTranslation("_Are_you_sure_you_want_to_overwrite_the_selected_tables"),
378
//                i18n.getTranslation("_Online_Checkout_overwrite"),
379
//                JOptionPane.YES_NO_OPTION, 
380
//                JOptionPane.QUESTION_MESSAGE
381
//        );
382
//        return n == JOptionPane.YES_OPTION;
383
//    }
384
    
385
//    public void doChangeWorkspace() {
386
//        OnlineWorkingcopy ws = this.context.getWorkspace();
387
//        this.entitySelector.setWorkspace(ws);
388
//        if( ws!=null ) {
389
//            for (String tableName : this.context.getDefaultTablesSelection()) {
390
//                OnlineEntity entity = ws.getWorkspaceEntity(tableName);
391
//                if( entity!=null ) {
392
//                    this.entitySelector.check(entity);
393
//                }
394
//            }
395
//        }
396
//        doReloadChanges();
397
//    }
398
    
399 266
    public void translate() {
400 267
        ToolsSwingManager swingManager = ToolsSwingLocator.getToolsSwingManager();
401 268

  
......
410 277
        swingManager.translate(this.btnRemoteHighlight);
411 278
        swingManager.translate(this.btnRemoteZoom);
412 279
        swingManager.translate(this.btnRemoteCleanHighligthed);
413
        
414
//        swingManager.translate(this.btnRemoteCheckRecomendedEntities);
415
//        swingManager.translate(this.btnRemoteUnCheckAllEntities);
416
//
417
//        swingManager.translate(this.btnRemoteCollapseAllEntities);
418
//        swingManager.translate(this.btnRemoteExpandAllEntities);
419 280
    }
420 281

  
421 282
    private OnlineWorkingcopy getUndisposableWorkspace() {
......
432 293
            return;
433 294
        }
434 295
        OnlineWorkingcopy ws;
435
        try {
436
            this.context.setVisibleStatus(context.processing);
437
            this.context.btnClose.setEnabled(!context.processing);
438
            ws = this.getUndisposableWorkspace();
439
            List<OnlineEntity> checkedEntities = context.getEntitySelector().getCheckedEntities();
296
        for (int i = 0; i < 10; i++) {
440 297

  
441
            boolean hasLocalTables = false;
442
//            boolean hasRemoteTables = false;
443
//            for (OnlineEntity checkedEntity : checkedEntities) {
444
//                if( ws.getWorkspaceEntityByName(checkedEntity.getEntityName())!=null ) {
445
//                    hasLocalTables = true;
446
//                } else {
447
//                    hasRemoteTables = true;
448
//                }
449
//            }
450
            
451
            this.btnRemoteCheckAll.setEnabled(!context.processing && changes != null);
452
            this.btnRemoteUnCheckAll.setEnabled(!context.processing && changes != null);
298
            try {
299
                RemoteChangesTableModel tableModel = (RemoteChangesTableModel) this.tblRemoteChanges.getModel();
300
                this.context.setVisibleStatus(context.processing);
301
                this.context.btnClose.setEnabled(!context.processing);
302
                ws = this.getUndisposableWorkspace();
303
                List<OnlineEntity> checkedEntities = context.getEntitySelector().getCheckedEntities();
453 304

  
454
            this.btnRemoteReloadChanges.setEnabled(!context.processing && ws != null && hasLocalTables);
455
            this.btnRemoteCleanChanges.setEnabled(!context.processing && ws != null && hasLocalTables);
456
                        
457
//            this.btnRemoteTablesReload.setEnabled(!context.processing);
458
//
459
//            this.btnRemoteTablesReload.setEnabled(!context.processing && ws != null);
305
                this.btnRemoteCheckAll.setEnabled(!context.processing && !tableModel.isEmpty());
306
                this.btnRemoteUnCheckAll.setEnabled(!context.processing && !tableModel.isEmpty());
460 307

  
461
            //Show form
462
            boolean enableShowForm = false;
463
            int row = this.tblRemoteChanges.getSelectedRow();
464
            if (row >= 0) {
465
                OnlineRemoteChange change = this.changes.get64(row);
466
//                if (change.getOperation() != OP_ADD_ENTITY) {
467
//                    enableShowForm = true;
468
//                }
469
            }
470
            this.btnRemoteShowForm.setEnabled(!context.processing && enableShowForm);
308
                this.btnRemoteReloadChanges.setEnabled(!context.processing && ws != null);
309
                this.btnRemoteCleanChanges.setEnabled(!context.processing && ws != null);
471 310

  
472
            context.getEntitySelector().setEnabled(!context.processing);
473
            this.tblRemoteChanges.setEnabled(!context.processing);
474
            this.workspacePicker.setEnabled(!context.processing);
475

  
476
            if ( CollectionUtils.isEmpty(checkedEntities) ) {
477
                this.btnRemoteMerge.setEnabled(false);
478
                this.btnRemoteUpdate.setEnabled(false);
479
            } else {
480
                MutableObject<String> msg = new MutableObject<>();
481
                for (OnlineEntity checkedEntity : checkedEntities) {
482
                    if( !ws.canUpdate(msg,checkedEntity.getEntityName())) {
483
                        break;
484
                    }
311
                //Show form
312
                boolean enableShowForm = false;
313
                int row = this.tblRemoteChanges.getSelectedRow();
314
                if (row >= 0) {
315
                    enableShowForm = true;
485 316
                }
486
                if( msg.getValue()!=null ) {
317
                this.btnRemoteShowForm.setEnabled(!context.processing && enableShowForm);
318

  
319
                context.getEntitySelector().setEnabled(!context.processing);
320
                this.tblRemoteChanges.setEnabled(!context.processing);
321
                this.workspacePicker.setEnabled(!context.processing);
322

  
323
                if (CollectionUtils.isEmpty(checkedEntities)) {
487 324
                    this.btnRemoteMerge.setEnabled(false);
488 325
                    this.btnRemoteUpdate.setEnabled(false);
489
                    this.alert(msg.getValue());
490 326
                } else {
491
                    if( checkedEntities.size()==1 ) {
492
                        OnlineEntity checkedEntity = checkedEntities.get(0);
493
                        if ( ws.updateNeedMerge(checkedEntity.getEntityName())) {
494
                            this.btnRemoteMerge.setEnabled(!context.processing);
495
                            this.btnRemoteUpdate.setEnabled(false);
496
                        } else {
497
                            this.btnRemoteMerge.setEnabled(false);
498
                            this.btnRemoteUpdate.setEnabled(!context.processing && changes != null && !this.changes.isSelectionEmpty());
327
                    MutableObject<String> msg = new MutableObject<>();
328
                    for (OnlineEntity checkedEntity : checkedEntities) {
329
                        if (!ws.canUpdate(msg, checkedEntity.getEntityName())) {
330
                            break;
499 331
                        }
500
                    } else {
332
                    }
333
                    if (msg.getValue() != null) {
501 334
                        this.btnRemoteMerge.setEnabled(false);
502
                        this.btnRemoteUpdate.setEnabled(!context.processing && changes != null && !this.changes.isSelectionEmpty());
503
                        for (OnlineEntity checkedEntity : checkedEntities) {
504
                            if( ws.updateNeedMerge(checkedEntity.getEntityName())) {
335
                        this.btnRemoteUpdate.setEnabled(false);
336
                        this.alert(msg.getValue());
337
                    } else {
338
                        if (checkedEntities.size() == 1) {
339
                            OnlineEntity checkedEntity = checkedEntities.get(0);
340
                            if (ws.updateNeedMerge(checkedEntity.getEntityName())) {
505 341
                                this.btnRemoteMerge.setEnabled(!context.processing);
506 342
                                this.btnRemoteUpdate.setEnabled(false);
507
                                break;
343
                            } else {
344
                                this.btnRemoteMerge.setEnabled(false);
345
                                this.btnRemoteUpdate.setEnabled(!context.processing && !tableModel.isSelectionEmpty());
508 346
                            }
347
                        } else {
348
                            this.btnRemoteMerge.setEnabled(false);
349
                            this.btnRemoteUpdate.setEnabled(!context.processing && !tableModel.isSelectionEmpty());
350
                            for (OnlineEntity checkedEntity : checkedEntities) {
351
                                if (ws.updateNeedMerge(checkedEntity.getEntityName())) {
352
                                    this.btnRemoteMerge.setEnabled(!context.processing);
353
                                    this.btnRemoteUpdate.setEnabled(false);
354
                                    break;
355
                                }
356
                            }
509 357
                        }
510 358
                    }
511 359
                }
512
            }
513 360

  
514
            Geometry repoGeom = getRepositoryGeometryOfSelectedChange();
515
            Geometry wsGeom = getWorkspaceGeometryOfSelectedChange();
516
            Geometry bbox = OnlineSwingCommons.createBBox(repoGeom, wsGeom);
517
            this.btnRemoteZoom.setEnabled(!context.processing && bbox != null);
518
            this.btnRemoteCenter.setEnabled(!context.processing && bbox != null);
519
            this.btnRemoteHighlight.setEnabled(!context.processing && bbox != null);
520
            this.btnRemoteCleanHighligthed.setEnabled(!context.processing);
521
        } catch (OnlineRuntimeException e1) {
522
            LOGGER.warn("Can't updating components.", e1);
523
            if (showAuthenticationErrors("_Online_Changes", e1)) {
524
                this.workspacePicker.set(null);
361
                Geometry repoGeom = getRepositoryGeometryOfSelectedChange();
362
                Geometry wsGeom = getWorkspaceGeometryOfSelectedChange();
363
                Geometry bbox = OnlineSwingCommons.createBBox(repoGeom, wsGeom);
364
                this.btnRemoteZoom.setEnabled(!context.processing); // && bbox != null);
365
                this.btnRemoteCenter.setEnabled(!context.processing); // && bbox != null);
366
                this.btnRemoteHighlight.setEnabled(!context.processing && bbox != null);
367
                this.btnRemoteCleanHighligthed.setEnabled(!context.processing);
368
            } catch (ConcurrentDataModificationException e3) {
369
                try {
370
                    Thread.sleep(1000);
371
                } catch (InterruptedException ex) {
372
                    //Do nothing
373
                }
374
                LOGGER.info("Retrying doUpdateComponents "+i);
375
                continue;
376
            } catch (OnlineRuntimeException e1) {
377
                LOGGER.warn("Can't updating components.", e1);
378
                if (showAuthenticationErrors("_Online_Changes", e1)) {
379
                    this.workspacePicker.set(null);
525 380
//                doChangeWorkspace();
381
                }
382
            } catch (Exception e2) {
383
                LOGGER.warn("Can't updating components.", e2);
526 384
            }
527
        } catch (Exception e2) {
528
            LOGGER.warn("Can't updating components.", e2);
385
            break;
529 386
        }
530 387

  
531 388
    }
......
535 392
            try {
536 393
                context.processing = true;
537 394
                context.doUpdateComponents();
538
                Iterator<Long> rows = getChangesSelectionIterator();
539

  
540
                this.changes.process(rows, (OnlineRemoteChange change) -> {
541
                    change.setSelected(!change.isSelected());
542
                    return true;
543
                });
395
                ListSelectionModel selectionModel = this.tblRemoteChanges.getSelectionModel();
396
                RemoteChangesTableModel model = (RemoteChangesTableModel) this.tblRemoteChanges.getModel();
397
                model.toggleSelection(selectionModel);
544 398
            } finally {
545 399
                context.processing = false;
546 400
                context.doUpdateComponents();
......
549 403
        task.start();
550 404
    }
551 405

  
552
    private Iterator<Long> getChangesSelectionIterator() {
553
        ListSelectionModel selection = this.tblRemoteChanges.getSelectionModel();
554
        return new Iterator<Long>() {
555
            long n = selection.getMinSelectionIndex();
406
//    private Iterator<Long> getChangesSelectionIterator() {
407
//        ListSelectionModel selection = this.tblRemoteChanges.getSelectionModel();
408
//        return new Iterator<Long>() {
409
//            long n = selection.getMinSelectionIndex();
410
//
411
//            @Override
412
//            public boolean hasNext() {
413
//                while (n <= selection.getMaxSelectionIndex()) {
414
//                    if (selection.isSelectedIndex((int) n)) {
415
//                        return true;
416
//                    }
417
//                    n++;
418
//                }
419
//                return false;
420
//            }
421
//
422
//            @Override
423
//            public Long next() {
424
//                if (n > selection.getMaxSelectionIndex()) {
425
//                    throw new IllegalStateException();
426
//                }
427
//                return n++;
428
//            }
429
//        };
430
//    }
431
//
432
//    private Iterator<Long> getRowsIterator() {
433
//        long size = changes.size64();
434
//        return new Iterator<Long>() {
435
//            long n = 0;
436
//
437
//            @Override
438
//            public boolean hasNext() {
439
//                return (n < size);
440
//            }
441
//
442
//            @Override
443
//            public Long next() {
444
//                return n++;
445
//            }
446
//        };
447
//    }
556 448

  
557
            @Override
558
            public boolean hasNext() {
559
                while (n <= selection.getMaxSelectionIndex()) {
560
                    if (selection.isSelectedIndex((int) n)) {
561
                        return true;
562
                    }
563
                    n++;
564
                }
565
                return false;
566
            }
567

  
568
            @Override
569
            public Long next() {
570
                if (n > selection.getMaxSelectionIndex()) {
571
                    throw new IllegalStateException();
572
                }
573
                return n++;
574
            }
575
        };
576
    }
577

  
578
    private Iterator<Long> getRowsIterator() {
579
        long size = changes.size64();
580
        return new Iterator<Long>() {
581
            long n = 0;
582

  
583
            @Override
584
            public boolean hasNext() {
585
                return (n < size);
586
            }
587

  
588
            @Override
589
            public Long next() {
590
                return n++;
591
            }
592
        };
593
    }
594

  
595 449
    private void doCheckAll() {
596 450
        Thread task = new Thread(() -> {
597 451
            try {
598 452
                context.processing = true;
599 453
                context.doUpdateComponents();
600
                Iterator<Long> rows = getRowsIterator();
601

  
602
                this.changes.process(rows, (OnlineRemoteChange change) -> {
603
                    change.setSelected(true);
604
                    return true;
605
                });
454
                RemoteChangesTableModel model = (RemoteChangesTableModel) this.tblRemoteChanges.getModel();
455
                model.selectAll();
606 456
            } finally {
607 457
                context.processing = false;
608 458
                context.doUpdateComponents();
......
616 466
            try {
617 467
                context.processing = true;
618 468
                context.doUpdateComponents();
619
                Iterator<Long> rows = getRowsIterator();
620

  
621
                this.changes.process(rows, (OnlineRemoteChange change) -> {
622
                    change.setSelected(false);
623
                    return true;
624
                });
469
                RemoteChangesTableModel model = (RemoteChangesTableModel) this.tblRemoteChanges.getModel();
470
                model.deselectAll();
625 471
            } finally {
626 472
                context.processing = false;
627 473
                context.doUpdateComponents();
......
640 486
            return;
641 487
        }
642 488

  
643
        this.tblRemoteChanges.setModel(new RemoteChangesTableModel(ws));
489
        this.tblRemoteChanges.setModel(createEmptyTableModel());
644 490

  
645 491
        SimpleTaskStatus taskStatus = ToolsLocator.getTaskStatusManager().createDefaultSimpleTaskStatus("_Download_changes");
646 492
        Thread task = new Thread(() -> {
......
719 565
//        OnlineEntity entity = checkedEntities.get(0);
720 566
//        String tableName = entity.getEntityName();
721 567

  
722
        this.tblRemoteChanges.setModel(new RemoteChangesTableModel(ws));
568
        this.tblRemoteChanges.setModel(createEmptyTableModel());
723 569

  
724 570
        Thread task = new Thread(() -> {
725 571
            try {
......
790 636
    }
791 637

  
792 638
    private void doShowForm() {
793
        if (this.changes == null) {
639
        RemoteChangesTableModel model = (RemoteChangesTableModel)this.tblRemoteChanges.getModel();
640
        int row = this.tblRemoteChanges.getSelectedRow();
641
        OnlineRemoteChange change = model.getRow(row);
642
        if(change == null) {
794 643
            return;
795 644
        }
796
        int row = this.tblRemoteChanges.getSelectedRow();
797
        OnlineRemoteChange change = this.changes.get64(row);
798 645
        if (change.getOperation() == OP_DELETE) {
799 646
            return;
800 647
        }
......
842 689
        if (ws == null) {
843 690
            return;
844 691
        }
845
        if (this.changes != null) {
846
            this.changes.removeAllChangeListener();
847
        }
848
        List<OnlineEntity> checkedEntities = context.getEntitySelector().getCheckedEntities();
849
        if ( CollectionUtils.isEmpty(checkedEntities) ) {
850
            this.changes = null;
851
            this.tblRemoteChanges.setModel(new DefaultTableModel());
852
            this.lblRemoteChangesCount.setText("0");
853
            return;
854
        }
855 692
        I18nManager i18n = ToolsLocator.getI18nManager();
856
        message("Reloading list of remote changes...");
857
        this.changes = ws.getRemoteChangesByEntity(
858
                checkedEntities.stream()
859
                    .map((t) -> {return t.getEntityName();})
860
                    .toArray((n) -> { return new String[n];})
861
        );
862
        this.changes.addChangeListener((ChangeEvent e) -> {
863
            context.doUpdateComponents();
864
        });
865
        RemoteChangesTableModel changesModel = new RemoteChangesTableModel(changes, ws);
693
        RemoteChangesTableModel changesModel = createTableModel();
866 694
        this.tblRemoteChanges.setModel(changesModel);
867

  
868 695
        int columns = this.tblRemoteChanges.getColumnModel().getColumnCount();
869 696
        for (int i = 1; i < columns; i++) {
870 697
            this.tblRemoteChanges.getColumnModel().getColumn(i).setCellRenderer(new DefaultTableCellRenderer() {
871 698
                @Override
872 699
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
873 700
                    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
874
                    OnlineChange changeRow = changes.get64(row);
875
                    OnlineSwingCommons.setColorCompoment(c, changeRow.getStatus());
701
                    OnlineRemoteChange changeRow = null;
702
                    try {
703
                        changeRow = changesModel.getRow(row);
704
                    } catch (IndexOutOfBoundsException ex) {
705
                        //Do nothing
706
                    }
707
                    if(changeRow != null){
708
                        OnlineSwingCommons.setColorCompoment(c, changeRow.getStatus());
709
                    }
876 710
                    return c;
877 711
                }
878 712
            });
879 713
        }
880 714

  
881 715
        context.doUpdateComponents();
716
        doUpdateChangesCount();
882 717
        context.message(i18n.getTranslation(
883 718
                "_Repository_changes_list_updated", 
884
                new String[] { String.valueOf(changes.size64()) }
719
                new String[] { String.valueOf(changesModel.getRowCount()) }
885 720
            )
886 721
        );
887
        this.lblRemoteChangesCount.setText(String.valueOf(changes.size64()));
888 722
    }
723
    
724
    private void doUpdateChangesCount() {
725
        TableModel model = tblRemoteChanges.getModel();
726
        int selectedCounts = tblRemoteChanges.getSelectedRowCount();
727
        if(selectedCounts<1){
728
            this.lblRemoteChangesCount.setText(String.valueOf(model.getRowCount()));
729
        } else if (selectedCounts < MAX_SELECTED_ROWS_TO_SHOW_GEOMETRIES) {
730
            this.lblRemoteChangesCount.setText("<html>"+getHTMLFontColorTag(java.awt.Color.GREEN.darker(),true, false, String.valueOf(selectedCounts))+"/"+model.getRowCount()+"</html>");
731
        } else {
732
            this.lblRemoteChangesCount.setText(selectedCounts+"/"+model.getRowCount());
733
        }
734
        
735
    }
889 736

  
737
    protected RemoteChangesTableModel createEmptyTableModel() {
738
        OnlineWorkingcopy ws = this.getUndisposableWorkspace();
739
        if (ws == null) {
740
            return null;
741
        }
742
        RemoteChangesTableModel changesModel = new RemoteChangesTableModel(ws);
743
        return changesModel;
744
    }
745
    
746
    protected RemoteChangesTableModel createTableModel() {
747
        OnlineWorkingcopy ws = this.getUndisposableWorkspace();
748
        if (ws == null) {
749
            return null;
750
        }
751
        List<OnlineEntity> checkedEntities = context.getEntitySelector().getCheckedEntities();
752
        if ( CollectionUtils.isEmpty(checkedEntities) ) {
753
            return new RemoteChangesTableModel(ws);
754
        }
755
        
756
        message("Reloading list of remote changes...");
757
        OnlineChanges<OnlineRemoteChange> theChanges = ws.getRemoteChangesByEntity(
758
            checkedEntities.stream()
759
                .map((t) -> {return t.getEntityName();})
760
                .toArray((n) -> { return new String[n];})
761
        );
762
        RemoteChangesTableModel changesModel = new RemoteChangesTableModel(theChanges, ws);
763
        changesModel.addTableModelListener(new TableModelListener() {
764
            @Override
765
            public void tableChanged(TableModelEvent e) {
766
                context.doUpdateComponents();
767
            }
768
        });
769
        return changesModel;
770
    }
771

  
890 772
    private List<OnlineEntity>  getWorkspaceCheckedEntities() {
891 773
        OnlineWorkingcopy ws = this.getUndisposableWorkspace();
892 774
        if (ws == null) {
......
940 822
        }
941 823
        Thread task = new Thread(() -> {
942 824
            try {
825
                RemoteChangesTableModel model = (RemoteChangesTableModel) tblRemoteChanges.getModel();
943 826
                context.processing = true;
944 827
                context.doUpdateComponents();
945 828
                for (OnlineEntity checkedEntity : entitiesToCleanChanges) {
946 829
                    message("Removing list of remote changes from selected tables" + checkedEntity.getEntityName() + "...");
947
                    ws.updateClean(checkedEntity.getEntityName());
830
//                    ws.removeRemoteChanges(checkedEntity.getEntityName());
831
                    model.removeRemoteChanges(checkedEntity.getEntityName());
948 832
                }
833
//                doReloadChanges();
834
                context.doReloadTables();
949 835
                message("Ready.");
950 836
            } finally {
951 837
                context.processing = false;
......
972 858
    private Geometry getRepositoryGeometryOfSelectedChange() {
973 859
        Geometry geom = null;
974 860
        try {
975
            if( this.tblRemoteChanges.getSelectedRowCount()>1 && this.tblRemoteChanges.getSelectedRowCount()<200 ) {
861
            RemoteChangesTableModel model = (RemoteChangesTableModel) tblRemoteChanges.getModel();
862
            if( this.tblRemoteChanges.getSelectedRowCount()>1 && this.tblRemoteChanges.getSelectedRowCount()<MAX_SELECTED_ROWS_TO_SHOW_GEOMETRIES ) {
976 863
                for (int selectedRow : this.tblRemoteChanges.getSelectedRows()) {
977
                    OnlineRemoteChange change = changes.get64(selectedRow);
864
                    OnlineRemoteChange change = model.getRow(selectedRow);
978 865
                    Geometry currentGeom = change.getGeometry();
979 866
                    if( currentGeom!=null ) {
980 867
                        if( geom == null ) {
......
995 882
            } else {
996 883
                int selected = this.tblRemoteChanges.getSelectedRow();
997 884
                if(selected >= 0){
998
                    OnlineRemoteChange change = changes.get64(selected);
885
                    OnlineRemoteChange change = model.getRow(selected);
999 886
                    geom = change.getGeometry();
1000 887
                }
1001 888
            }
......
1004 891
            return geom;
1005 892
        }
1006 893
    }
894

  
895
    private Envelope getEnvelopeOfAllRepositoryChanges() {
896
        Envelope env = GeometryUtils.createEnvelope(Geometry.SUBTYPES.GEOM2D);
897
        try {
898
            RemoteChangesTableModel model = (RemoteChangesTableModel) tblRemoteChanges.getModel();
899
            OnlineChanges<OnlineRemoteChange> changes = model.getChanges();
900
            for (int i = 0; i < changes.size64(); i++) {
901
                OnlineRemoteChange change = changes.get64(i);
902
                Geometry currentGeom = change.getGeometry();
903
                env.add(currentGeom);
904
            }
905
            return env;
906
        } catch (Exception ex) {
907
            return env;
908
        }
909
    }
1007 910
    
1008 911
    private Geometry getWorkspaceGeometryOfSelectedChange() {
1009 912
        Geometry geom = null;
1010 913
        try {
1011 914
            OnlineWorkingcopy ws = getUndisposableWorkspace();
1012
            if( this.tblRemoteChanges.getSelectedRowCount()>1 && this.tblRemoteChanges.getSelectedRowCount()<200 ) {
915
            RemoteChangesTableModel model = (RemoteChangesTableModel) tblRemoteChanges.getModel();
916
            if( this.tblRemoteChanges.getSelectedRowCount()>1 && this.tblRemoteChanges.getSelectedRowCount()<MAX_SELECTED_ROWS_TO_SHOW_GEOMETRIES ) {
1013 917
                for (int selectedRow : this.tblRemoteChanges.getSelectedRows()) {
1014
                    OnlineRemoteChange change = changes.get64(selectedRow);
918
                    OnlineRemoteChange change = model.getRow(selectedRow);
1015 919
                    Feature f = ws.getRelatedFeature(change);
1016 920
                    if(f!= null){
1017 921
                        Geometry currentGeom = f.getDefaultGeometry();
......
1035 939
            } else {
1036 940
                int selected = this.tblRemoteChanges.getSelectedRow();
1037 941
                if(selected >= 0){
1038
                    OnlineRemoteChange change = changes.get64(selected);
942
                    OnlineRemoteChange change = model.getRow(selected);
1039 943
                    Feature f = ws.getRelatedFeature(change);
1040 944
                    if(f!= null){
1041 945
                        geom = f.getDefaultGeometry();
......
1051 955
    private FeatureStore getWorkspaceStoreOfSelectedChange() {
1052 956
        FeatureStore store = null;
1053 957
        int selected = this.tblRemoteChanges.getSelectedRow();
958
        RemoteChangesTableModel model = (RemoteChangesTableModel) tblRemoteChanges.getModel();
959
        
1054 960
        if(selected >= 0){
1055
            OnlineRemoteChange change = changes.get64(selected);
961
            OnlineRemoteChange change = model.getRow(selected);
1056 962
            
1057 963
            OnlineWorkingcopy ws = getUndisposableWorkspace();
1058 964
            OnlineEntity entity = ws.getWorkspaceEntityByCode(change.getEntityCode());
......
1060 966
        }
1061 967
        return store;
1062 968
    }
969

  
1063 970
    
1064 971
    private void doZoomToSelectedChange() {
1065 972
        cleanHighligthed();
1066 973
        OnlineSwingManager swingManager = OnlineSwingLocator.getOnlineSwingManager();
1067 974
        OnlineSwingServices services = swingManager.getDefaultServices();
975
        if(tblRemoteChanges.getSelectionModel().isSelectionEmpty()) {
976
            FeatureStore store = this.context.getWorkspaceStoreOfSelectedEntity();
977
            if(store == null){
978
                return;
979
            }
980
            Envelope env = getEnvelopeOfAllRepositoryChanges();
981
            services.zoomViewsHavingAStoreToGeometry(store, env.getBox2D());
982
            return;
983
        }
1068 984
        FeatureStore store = getWorkspaceStoreOfSelectedChange();
1069 985
        Geometry repoGeom = getRepositoryGeometryOfSelectedChange();
1070 986
        Geometry geom = getWorkspaceGeometryOfSelectedChange();
......
1081 997
        cleanHighligthed();
1082 998
        OnlineSwingManager swingManager = OnlineSwingLocator.getOnlineSwingManager();
1083 999
        OnlineSwingServices services = swingManager.getDefaultServices();
1000
        if(tblRemoteChanges.getSelectionModel().isSelectionEmpty()) {
1001
            FeatureStore store = this.context.getWorkspaceStoreOfSelectedEntity();
1002
            if(store == null){
1003
                return;
1004
            }
1005
            Envelope env = getEnvelopeOfAllRepositoryChanges();
1006
            services.centerViewsHavingAStoreToGeometry(store, env.getBox2D());
1007
            return;
1008
        }
1084 1009
        FeatureStore store = getWorkspaceStoreOfSelectedChange();
1085 1010
        Geometry repoGeom = getRepositoryGeometryOfSelectedChange();
1086 1011
        Geometry geom = getWorkspaceGeometryOfSelectedChange();
......
1115 1040
//        DisposeUtils.disposeQuietly(entitySelector);
1116 1041
    }
1117 1042

  
1118
//    private void doCheckRecomendedEntities() {
1119
//        final OnlineWorkingcopy workspace = this.getUndisposableWorkspace();
1120
//        if( workspace==null ) {
1121
//            return;
1122
//        }
1123
//        Set<String> updateEntities = new HashSet<>();
1124
//        Collection<OnlineEntity> entities = this.entitySelector.getEntities();
1125
//        for (OnlineEntity entity : entities) {
1126
//            if (workspace.existsInWorkspace(entity)) {
1127
//                OnlineEntity lentity = workspace.getWorkspaceEntityByCode(entity.getEntityCode());
1128
//                switch (lentity.getState()) {
1129
//                    case OnlineManager.STATE_LOCAL_MODIFIED:
1130
//                    case OnlineManager.STATE_LOCAL_NEW:
1131
//                    case OnlineManager.STATE_LOCAL_UNMODIFIED:
1132
//                    case OnlineManager.STATE_REMOTE_NEW:
1133
//                    default:
1134
//                        break;
1135
//                    case OnlineManager.STATE_CONFLICT:
1136
//                    case OnlineManager.STATE_LOCAL_OUTDATED:
1137
//                    case OnlineManager.STATE_LOCAL_OUTDATED_AND_MODIFIED:
1138
//                        updateEntities.add(entity.getEntityCode());
1139
//                        break;
1140
//                }
1141
//            }
1142
//        }
1143
//        this.entitySelector.setCheck(updateEntities, true);
1144
//    }
1145

  
1146 1043
}

Also available in: Unified diff