fix #7353 SpecimenTypedesignationsWorkingsetEditor: adapting to changes in DerivedUni...
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / cdm / vaadin / view / name / SpecimenTypeDesignationDTORow.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.cdm.vaadin.view.name;
10
11 import java.util.Arrays;
12 import java.util.List;
13
14 import com.vaadin.server.Sizeable.Unit;
15 import com.vaadin.ui.Component;
16 import com.vaadin.ui.ListSelect;
17 import com.vaadin.ui.TextField;
18
19 import eu.etaxonomy.cdm.model.common.DefinedTerm;
20 import eu.etaxonomy.cdm.model.reference.Reference;
21 import eu.etaxonomy.cdm.vaadin.component.CollectionRow;
22 import eu.etaxonomy.cdm.vaadin.component.CollectionRowItemCollection;
23 import eu.etaxonomy.cdm.vaadin.component.CollectionRowRepresentative;
24 import eu.etaxonomy.cdm.vaadin.component.TextFieldNFix;
25 import eu.etaxonomy.cdm.vaadin.model.registration.KindOfUnitTerms;
26 import eu.etaxonomy.cdm.vaadin.util.converter.UriConverter;
27 import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox;
28
29 /**
30 * CollectionRow for {@link SpecimenTypeDesignationDTO}
31 * SpecimenTypeDesignationDTORow needs to be instantiated by a EditorInstantiator which can only be provided by the presenter
32 * {@link SpecimenTypeDesignationWorkingsetEditorPresenter#handleViewEntered()}
33 *
34 * @author a.kohlbecker
35 * @since Jun 22, 2017
36 *
37 */
38 public class SpecimenTypeDesignationDTORow extends CollectionRowItemCollection implements CollectionRow {
39
40 /* CONVENTION!
41 *
42 * The fieldname must match the properties of the SpecimenTypeDesignationDTO
43 */
44 TextField associatedTypeDesignationCount = new TextField();
45 RowListSelect kindOfUnit = new RowListSelect(); // position is IMPORTANT, see rowListSelectColumn()
46 ListSelect typeStatus = new ListSelect();
47 ToOneRelatedEntityCombobox<eu.etaxonomy.cdm.model.occurrence.Collection> collection =
48 new ToOneRelatedEntityCombobox<eu.etaxonomy.cdm.model.occurrence.Collection>(null, eu.etaxonomy.cdm.model.occurrence.Collection.class);
49 TextField accessionNumber = new TextFieldNFix();
50 TextField preferredStableUri = new TextFieldNFix();
51 TextField mediaUri = new TextFieldNFix();
52 ToOneRelatedEntityCombobox<Reference> mediaSpecimenReference =
53 new ToOneRelatedEntityCombobox<Reference>(null, Reference.class);
54 TextField mediaSpecimenReferenceDetail = new TextFieldNFix(); //"Image reference detail");
55
56 public SpecimenTypeDesignationDTORow(){
57 kindOfUnit.setRows(1);
58 kindOfUnit.setRequired(true);
59 kindOfUnit.setRow(this);
60 typeStatus.setRows(1);
61 typeStatus.setRequired(true);
62
63 accessionNumber.setWidth(100, Unit.PIXELS);
64 preferredStableUri.setWidth(150, Unit.PIXELS);
65 preferredStableUri.setConverter(new UriConverter());
66 collection.setWidth(200, Unit.PIXELS);
67 mediaUri.setWidth(150, Unit.PIXELS);
68 mediaUri.setConverter(new UriConverter());
69 mediaSpecimenReference.setWidth(200, Unit.PIXELS);
70 mediaSpecimenReferenceDetail.setWidth(200, Unit.PIXELS);
71
72 kindOfUnit.addValueChangeListener(e ->
73 updateRowItemsEnablement()
74 );
75
76 }
77
78 /**
79 * @return
80 */
81 public Component[] components() {
82 Component[] components = new Component[]{
83 associatedTypeDesignationCount,
84 kindOfUnit, typeStatus,
85 collection, accessionNumber,
86 preferredStableUri,
87 mediaUri, mediaSpecimenReference,
88 mediaSpecimenReferenceDetail
89 };
90 addAll(Arrays.asList(components));
91 return components;
92 }
93
94 public static List<String> visibleFields() {
95 List<String> visibleFields = Arrays.asList(new String[]{
96 "kindOfUnit", "typeStatus",
97 "collection", "accessionNumber",
98 "preferredStableUri",
99 "mediaUri", "mediaSpecimenReference",
100 "mediaSpecimenReferenceDetail"
101 });
102 return visibleFields;
103 }
104
105 @Override
106 public void updateRowItemsEnablement() {
107
108 DefinedTerm kindOfUnitTerm = (DefinedTerm)kindOfUnit.getValue();
109
110 boolean publishedImageType = kindOfUnitTerm != null && kindOfUnitTerm.equals(KindOfUnitTerms.PUBLISHED_IMAGE());
111 boolean unPublishedImageType = kindOfUnitTerm != null && kindOfUnitTerm.equals(KindOfUnitTerms.UNPUBLISHED_IMAGE());
112
113 boolean kindOfUnitLocked = !associatedTypeDesignationCount.getValue().isEmpty() && Integer.valueOf(associatedTypeDesignationCount.getValue()) > 1;
114 kindOfUnit.setEnabled(!kindOfUnitLocked);
115 kindOfUnit.setDescription(kindOfUnitLocked ?
116 "Can not be changed since the type specimen is associated with multiple type designations" : "");
117 mediaSpecimenReference.setEnabled(publishedImageType || unPublishedImageType);
118 mediaSpecimenReferenceDetail.setEnabled(publishedImageType || unPublishedImageType);
119 mediaUri.setEnabled(publishedImageType || unPublishedImageType);
120
121 }
122
123 /**
124 *
125 * @return the 0-based position index of the <code>kindOfUnit</code> field in this class
126 * which are visible according to {@link #visibleFields())
127 */
128 public static int rowListSelectColumn(){
129 return 0;
130 }
131
132 class RowListSelect extends ListSelect implements CollectionRowRepresentative {
133
134 private static final long serialVersionUID = 3235653923633494213L;
135
136 CollectionRow row;
137
138 protected void setRow(CollectionRow row){
139 this.row = row;
140 }
141
142 @Override
143 public void updateRowItemsEnabledStates() {
144 row.updateRowItemsEnablement();
145
146 }
147
148 }
149
150 }