Project

General

Profile

« Previous | Next » 

Revision c264cd92

Added by Patrick Plitzner over 4 years ago

fix #8485 Add column groups to character matrix

View differences:

eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/descriptiveDataSet/matrix/CharacterMatrix.java
12 12
import java.util.ArrayList;
13 13
import java.util.Collection;
14 14
import java.util.HashMap;
15
import java.util.LinkedList;
15 16
import java.util.List;
16 17
import java.util.Map;
18
import java.util.Map.Entry;
17 19
import java.util.Properties;
18 20
import java.util.Set;
21
import java.util.TreeSet;
19 22
import java.util.UUID;
20 23
import java.util.stream.Collectors;
21 24

  
......
62 65
import org.eclipse.nebula.widgets.nattable.grid.layer.CornerLayer;
63 66
import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultRowHeaderDataLayer;
64 67
import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer;
68
import org.eclipse.nebula.widgets.nattable.group.ColumnGroupGroupHeaderLayer;
69
import org.eclipse.nebula.widgets.nattable.group.ColumnGroupHeaderLayer;
70
import org.eclipse.nebula.widgets.nattable.group.ColumnGroupModel;
65 71
import org.eclipse.nebula.widgets.nattable.layer.AbstractLayer;
66 72
import org.eclipse.nebula.widgets.nattable.layer.CompositeLayer;
67 73
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
68 74
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
69 75
import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnOverrideLabelAccumulator;
70
import org.eclipse.nebula.widgets.nattable.layer.stack.DefaultBodyLayerStack;
71 76
import org.eclipse.nebula.widgets.nattable.persistence.gui.PersistenceDialog;
72 77
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
73 78
import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer;
......
180 185

  
181 186
    private ConfigRegistry configRegistry;
182 187

  
183
    private DefaultBodyLayerStack bodyLayer;
188
    private MatrixBodyLayerStack bodyLayer;
184 189

  
185 190
    private boolean isTreeView = true;
186 191

  
......
264 269

  
265 270

  
266 271
        //add tooltip to table
267
        new CategoricalChartTooltip(this);
268
        new QuantitativeChartTooltip(this);
272
//        new CategoricalChartTooltip(this);
273
//        new QuantitativeChartTooltip(this);
269 274

  
270 275

  
271 276
        this.layout();
......
386 391
        GlazedListTreeData treeData = new GlazedListTreeData<>(treeList);
387 392
        ITreeRowModel treeRowModel = new GlazedListTreeRowModel<>(treeData);
388 393

  
389
        bodyLayer = new DefaultBodyLayerStack(eventLayer);
394
        // assemble the column groups
395
        LinkedList<ColumnGroupWrapper> columnGroups = new LinkedList<>();
396
        List<TermNode<Feature>> rootChildren = descriptiveDataSet.getDescriptiveSystem().getRootChildren();
397
        buildHeader(rootChildren, columnGroups);
398

  
399
        bodyLayer = new MatrixBodyLayerStack(eventLayer, columnGroups);
390 400
        final SelectionLayer selectionLayer = bodyLayer.getSelectionLayer();
391 401
        freezeLayer = new FreezeLayer(selectionLayer);
392 402
        final CompositeFreezeLayer compositeFreezeLayer = new CompositeFreezeLayer(
......
422 432
        DataLayer columnHeaderDataLayer = new DataLayer(columnHeaderDataProvider);
423 433
        ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, topMostLayer, selectionLayer);
424 434

  
435
        ILayer topHeaderLayer = columnHeaderLayer;
436

  
437
        if(!columnGroups.isEmpty()){
438
            // first group level
439
            ColumnGroupWrapper groupLevel1 = columnGroups.get(0);
440
            ColumnGroupHeaderLayer groupLayerLevel1 = null;
441
            ColumnGroupGroupHeaderLayer groupLayerLevel2 = null;
442
            groupLayerLevel1 = new ColumnGroupHeaderLayer(columnHeaderLayer, selectionLayer, groupLevel1.getModel());
443
            for (Entry<TermNode<Feature>, TreeSet<Integer>> entry: groupLevel1.getColumnGroupToIndexMap().entrySet()) {
444
                TermNode<Feature> group = entry.getKey();
445
                TreeSet<Integer> indexList = entry.getValue();
446
                int[] intArray = indexList.stream().mapToInt(Integer::intValue).toArray();
447
                groupLayerLevel1.addColumnsIndexesToGroup(group.getTerm().getTitleCache(), intArray);
448
                groupLayerLevel1.setGroupUnbreakable(indexList.iterator().next());
449
            }
450
            topHeaderLayer = groupLayerLevel1;
451

  
452
            // second group level
453
            if(columnGroups.size()>1){
454
                ColumnGroupWrapper groupLevel2 = columnGroups.get(1);
455
                groupLayerLevel2 = new ColumnGroupGroupHeaderLayer(groupLayerLevel1, selectionLayer, groupLevel2.getModel());
456
                for (Entry<TermNode<Feature>, TreeSet<Integer>> entry: groupLevel2.getColumnGroupToIndexMap().entrySet()) {
457
                    TermNode<Feature> group = entry.getKey();
458
                    TreeSet<Integer> indexList = entry.getValue();
459
                    int[] intArray = indexList.stream().mapToInt(Integer::intValue).toArray();
460
                    groupLayerLevel2.addColumnsIndexesToGroup(group.getTerm().getTitleCache(), intArray);
461
                    groupLayerLevel2.setGroupUnbreakable(indexList.iterator().next());
462
                }
463
                topHeaderLayer = groupLayerLevel2;
464
            }
465
        }
466

  
425 467
        // add the SortHeaderLayer to the column header layer stack
426 468
        // as we use GlazedLists, we use the GlazedListsSortModel which
427 469
        // delegates the sorting to the SortedList
428 470
        final SortHeaderLayer<DescriptionBase> sortHeaderLayer = new SortHeaderLayer<>(
429
                columnHeaderLayer,
471
                topHeaderLayer,
430 472
                new GlazedListsSortModel<>(
431 473
                        sortedList,
432 474
                        columnPropertyAccessor,
......
434 476
                        columnHeaderDataLayer));
435 477

  
436 478

  
479

  
437 480
        /**
438 481
         * row header layer
439 482
         */
......
461 504

  
462 505
    }
463 506

  
507
    private TreeSet<Integer> recurseChildIndexes(TermNode<Feature> node){
508
        TreeSet<Integer> childIndexes = new TreeSet<>();
509
        if(node.getChildCount()>0){
510
            List<TermNode<Feature>> childNodes = node.getChildNodes();
511
            for (TermNode<Feature> childNode: childNodes) {
512
                childIndexes.addAll(recurseChildIndexes(childNode));
513
            }
514
        }
515
        childIndexes.add(features.indexOf(node.getTerm())+LEADING_COLUMN_COUNT);
516
        return childIndexes;
517
    }
518

  
519
    private void buildHeader(List<TermNode<Feature>> nodes, LinkedList<ColumnGroupWrapper> columnGroups){
520
        Map<TermNode<Feature>, TreeSet<Integer>> columnGroupToIndexMap = new HashMap<>();
521
        List<TermNode<Feature>> childNodes = new ArrayList<>();
522
        for (TermNode<Feature> node : nodes) {
523
            TreeSet<Integer> childIndexes = recurseChildIndexes(node);
524
            if(childIndexes.size()>1){
525
                // filter out groups that only have one member
526
                columnGroupToIndexMap.put(node, childIndexes);
527
            }
528
            childNodes.addAll(node.getChildNodes());
529
        }
530
        if(!columnGroupToIndexMap.isEmpty()){
531
            columnGroups.addFirst(new ColumnGroupWrapper(new ColumnGroupModel(), columnGroupToIndexMap));
532
        }
533
        if(!childNodes.isEmpty()){
534
            buildHeader(childNodes, columnGroups);
535
        }
536
    }
537

  
464 538
    private void registerHandlersAndListeners() {
465 539
        natTable.registerCommandHandler(new ExportCommandHandler(natTable));
466 540

  
......
710 784
        return bodyDataProvider;
711 785
    }
712 786

  
713
    DefaultBodyLayerStack getBodyLayer() {
787
    MatrixBodyLayerStack getBodyLayer() {
714 788
        return bodyLayer;
715 789
    }
716 790

  

Also available in: Unified diff