ref #8450 Use cached display data for matrix cells
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / descriptiveDataSet / matrix / SpecimenColumnPropertyAccessor.java
1 /**
2 * Copyright (C) 2017 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.taxeditor.editor.descriptiveDataSet.matrix;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.List;
14 import java.util.UUID;
15 import java.util.stream.Collectors;
16
17 import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
18
19 import eu.etaxonomy.cdm.api.service.ITermService;
20 import eu.etaxonomy.cdm.api.service.dto.RowWrapperDTO;
21 import eu.etaxonomy.cdm.api.service.dto.SpecimenRowWrapperDTO;
22 import eu.etaxonomy.cdm.api.service.dto.TaxonRowWrapperDTO;
23 import eu.etaxonomy.cdm.model.description.Feature;
24 import eu.etaxonomy.cdm.model.description.State;
25 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
26 import eu.etaxonomy.cdm.persistence.dto.TermDto;
27 import eu.etaxonomy.taxeditor.store.CdmStore;
28
29 /**
30 * Property accessor class which maps setting and getting data for
31 * each row in the character matrix
32 * @author pplitzner
33 * @since Nov 26, 2017
34 *
35 */
36 public class SpecimenColumnPropertyAccessor implements IColumnPropertyAccessor<Object>{
37
38 private CharacterMatrix matrix;
39
40 public SpecimenColumnPropertyAccessor(CharacterMatrix matrix) {
41 this.matrix = matrix;
42 }
43
44 @Override
45 public Object getDataValue(Object rowObject, int columnIndex) {
46 if(rowObject instanceof SpecimenRowWrapperDTO){
47 SpecimenRowWrapperDTO rowWrapper = (SpecimenRowWrapperDTO) rowObject;
48 switch (columnIndex) {
49 case 0:
50 if(matrix.isTreeView()){
51 return "#"+rowWrapper.getSpecimen().getId();
52 }
53 else{
54 return rowWrapper.getTaxonNode();
55 }
56 case 1:
57 return rowWrapper.getFieldUnit();
58 case 2:
59 return rowWrapper.getIdentifier();
60 case 3:
61 return rowWrapper.getCountry();
62
63 default:
64 break;
65 }
66 Feature feature = matrix.getIndexToFeatureMap().get(columnIndex);
67 return rowWrapper.getDisplayDataForFeature(feature);
68 }
69 else if(rowObject instanceof TaxonRowWrapperDTO){
70 TaxonRowWrapperDTO taxonWrapper = (TaxonRowWrapperDTO)rowObject;
71 if(columnIndex==0){
72 return taxonWrapper.getDescription();
73 }
74 Feature feature = matrix.getIndexToFeatureMap().get(columnIndex);
75 return taxonWrapper.getDisplayDataForFeature(feature);
76
77 }
78 else if (columnIndex == 0) {
79 return rowObject;
80 }
81 return null;
82 }
83
84 @Override
85 public void setDataValue(Object rowObject, int columnIndex, Object newValue) {
86 if(rowObject instanceof RowWrapperDTO){
87 RowWrapperDTO rowWrapper = (RowWrapperDTO)rowObject;
88 Feature feature = matrix.getIndexToFeatureMap().get(columnIndex);
89 if(newValue instanceof Collection && ((Collection) newValue).stream().allMatch(o->o instanceof TermDto)){
90 List<TermDto> dtos = (List<TermDto>)newValue;
91 List<UUID> termUuids = dtos.stream().map(dto->dto.getUuid()).collect(Collectors.toList());
92 List<DefinedTermBase> terms = CdmStore.getService(ITermService.class).load(termUuids, null);
93 List<State> states = new ArrayList<>();
94 for (DefinedTermBase definedTermBase : terms) {
95 if(definedTermBase instanceof State){
96 states.add((State) definedTermBase);
97 }
98 }
99 rowWrapper.setDataValueForFeature(feature, states);
100 }
101 }
102 }
103
104 @Override
105 public int getColumnCount() {
106 return matrix.getPropertyToLabelMap().size();
107 }
108
109 @Override
110 public String getColumnProperty(int columnIndex) {
111 return matrix.getPropertyToLabelMap().get(columnIndex);
112 }
113
114 @Override
115 public int getColumnIndex(String propertyName){
116 return matrix.getPropertyToLabelMap().indexOf(propertyName);
117 }
118
119 }