Revision c264cd92
Added by Patrick Plitzner over 4 years ago
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
fix #8485 Add column groups to character matrix