Project

General

Profile

Download (10.9 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2018 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 org.springframework.context.annotation.Scope;
12

    
13
import com.vaadin.spring.annotation.SpringComponent;
14
import com.vaadin.ui.Alignment;
15
import com.vaadin.ui.CheckBox;
16
import com.vaadin.ui.GridLayout;
17
import com.vaadin.ui.NativeSelect;
18
import com.vaadin.ui.TextField;
19

    
20
import eu.etaxonomy.cdm.api.utility.RoleProber;
21
import eu.etaxonomy.cdm.model.common.AnnotationType;
22
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
23
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
24
import eu.etaxonomy.cdm.model.name.TaxonName;
25
import eu.etaxonomy.cdm.model.reference.Reference;
26
import eu.etaxonomy.cdm.service.UserHelperAccess;
27
import eu.etaxonomy.cdm.vaadin.component.common.FilterableAnnotationsField;
28
import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction;
29
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
30
import eu.etaxonomy.cdm.vaadin.permission.CdmEditDeletePermissionTester;
31
import eu.etaxonomy.cdm.vaadin.permission.RolesAndPermissions;
32
import eu.etaxonomy.cdm.vaadin.ui.RegistrationUIDefaults;
33
import eu.etaxonomy.cdm.vaadin.util.converter.SetToListConverter;
34
import eu.etaxonomy.vaadin.component.ToManyRelatedEntitiesComboboxSelect;
35
import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox;
36
import eu.etaxonomy.vaadin.event.EditorActionType;
37
import eu.etaxonomy.vaadin.mvp.AbstractCdmPopupEditor;
38

    
39
/**
40
 * @author a.kohlbecker
41
 * @since Jan 26, 2018
42
 */
43
@SpringComponent
44
@Scope("prototype")
45
public class NameTypeDesignationPopupEditor extends AbstractCdmPopupEditor<NameTypeDesignation, NameTypeDesignationPresenter>
46
    implements NameTypeDesignationEditorView {
47

    
48
    private static final long serialVersionUID = 8233876984579344340L;
49

    
50
    private static final int GRID_COLS = 4;
51
    private static final int GRID_ROWS = 7;
52

    
53
    private CheckBox conservedTypeField;
54
    private CheckBox rejectedTypeField;
55
    private CheckBox notDesignatedField;
56

    
57
    private ToOneRelatedEntityCombobox<TaxonName> typeNameField;
58

    
59
    private ToManyRelatedEntitiesComboboxSelect<TaxonName> typifiedNamesComboboxSelect;
60

    
61
    private NativeSelect typeStatusSelect;
62

    
63
    private ToOneRelatedEntityCombobox<Reference> designationReferenceCombobox;
64

    
65
    private TextField designationReferenceDetailField;
66

    
67
    private boolean showTypeFlags = true;
68

    
69

    
70
    private FilterableAnnotationsField annotationsListField;
71

    
72
    private AnnotationType[] editableAnotationTypes = RegistrationUIDefaults.EDITABLE_ANOTATION_TYPES;
73

    
74

    
75
    /**
76
     * @param layout
77
     * @param dtoType
78
     */
79
    public NameTypeDesignationPopupEditor() {
80
        super(new GridLayout(GRID_COLS, GRID_ROWS), NameTypeDesignation.class);
81
    }
82

    
83
    /**
84
     * {@inheritDoc}
85
     */
86
    @Override
87
    public String getWindowCaption() {
88
        return "Name type designation editor";
89
    }
90

    
91
    /**
92
     * {@inheritDoc}
93
     */
94
    @Override
95
    public void focusFirst() {
96
        // none
97
    }
98

    
99
    /**
100
     * {@inheritDoc}
101
     */
102
    @Override
103
    protected String getDefaultComponentStyles() {
104
        return "tiny";
105
    }
106

    
107
    /**
108
     * {@inheritDoc}
109
     */
110
    @Override
111
    protected void initContent() {
112
        /*
113
            conservedType : boolean
114
            rejectedType : boolean
115
            typeName : TaxonName
116

    
117
            typifiedNames
118
            notDesignated : boolean
119
            registrations : Set<Registration>
120
            typeStatus : T
121

    
122
            citation : Reference
123
            citationMicroReference : String
124
            originalNameString : String
125
         */
126

    
127
        GridLayout grid = (GridLayout)getFieldLayout();
128
        // grid.setSizeFull();
129
        grid.setSpacing(true);
130
        grid.setColumnExpandRatio(0, 0.25f);
131
        grid.setColumnExpandRatio(1, 0.25f);
132
        grid.setColumnExpandRatio(2, 0.25f);
133
        grid.setColumnExpandRatio(3, 0.25f);
134

    
135
        int row = 0;
136

    
137
        if(showTypeFlags){
138
            conservedTypeField = addCheckBox("Conserved type", "conservedType", 0, row);
139
            conservedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
140
            rejectedTypeField = addCheckBox("Rejected type", "rejectedType", 1, row);
141
            rejectedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
142
            notDesignatedField = addCheckBox("Not designated", "notDesignated", 2, row);
143
            notDesignatedField.addValueChangeListener(e -> updateDesignationReferenceFields());
144
            row++;
145
        }
146

    
147
        typeStatusSelect = new NativeSelect("Type status");
148
        typeStatusSelect.setNullSelectionAllowed(false);
149
        typeStatusSelect.setWidth(100, Unit.PERCENTAGE);
150
        typeStatusSelect.setRequired(true);
151
        typeStatusSelect.setRequiredError("Either \"Type status\" must be set or any of the \"Conserved type\", \"Rejected type\" or \"Not designated\" flags must be set.");
152
        addField(typeStatusSelect, "typeStatus", 0, row, 1, row);
153
        grid.setComponentAlignment(typeStatusSelect, Alignment.TOP_RIGHT);
154
        typeStatusSelect.addValueChangeListener(e -> {
155
            updateDesignationReferenceFields();
156
        });
157

    
158
        row++;
159
        typeNameField = new ToOneRelatedEntityCombobox<TaxonName>("Type name", TaxonName.class);
160
        addField(typeNameField, "typeName", 0, row, 3, row);
161
        typeNameField.addClickListenerAddEntity(e -> getViewEventBus().publish(this,
162
                new TaxonNameEditorAction(
163
                        EditorActionType.ADD,
164
                        e.getButton(),
165
                        typeNameField,
166
                        this))
167
        );
168
        typeNameField.addClickListenerEditEntity(e -> {
169
            if(typeNameField.getValue() != null){
170
                getViewEventBus().publish(this,
171
                    new TaxonNameEditorAction(
172
                            EditorActionType.EDIT,
173
                            typeNameField.getValue().getUuid(),
174
                            e.getButton(),
175
                            typeNameField,
176
                            this)
177
                );
178
            }
179
        });
180

    
181
        row++;
182
        typifiedNamesComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Typified names");
183
        typifiedNamesComboboxSelect.setConverter(new SetToListConverter<TaxonName>());
184
        typifiedNamesComboboxSelect.setEditPermissionTester(new CdmEditDeletePermissionTester());
185
        addField(typifiedNamesComboboxSelect, "typifiedNames", 0, row, 3, row);
186
        typifiedNamesComboboxSelect.setReadOnly(false); // FIXME this does not help, see #7389
187

    
188
        row++;
189
        designationReferenceCombobox = new ToOneRelatedEntityCombobox<Reference>("Designation reference", Reference.class);
190
        addField(designationReferenceCombobox, "citation", 0, row, 2, row);
191
        designationReferenceCombobox.setWidth(400, Unit.PIXELS);
192
        designationReferenceDetailField = addTextField("Reference detail", "citationMicroReference", 3, row);
193
        designationReferenceCombobox.addClickListenerAddEntity(e -> getViewEventBus().publish(
194
                this,
195
                new ReferenceEditorAction(EditorActionType.ADD, null, designationReferenceCombobox, this)
196
                ));
197
        designationReferenceCombobox.addClickListenerEditEntity(e -> {
198
            if(designationReferenceCombobox.getValue() != null){
199
                getViewEventBus().publish(this,
200
                    new ReferenceEditorAction(
201
                            EditorActionType.EDIT,
202
                            designationReferenceCombobox.getValue().getUuid(),
203
                            e.getButton(),
204
                            designationReferenceCombobox,
205
                            this)
206
                );
207
            }
208
            });
209

    
210
        row++;
211
        annotationsListField = new FilterableAnnotationsField("Editorial notes");
212
        annotationsListField.setWidth(100, Unit.PERCENTAGE);
213
        boolean isCurator = UserHelperAccess.userHelper().userIs(new RoleProber(RolesAndPermissions.ROLE_CURATION));
214
        boolean isAdmin = UserHelperAccess.userHelper().userIsAdmin();
215
        if(isCurator || isAdmin){
216
            annotationsListField.withNewButton(true);
217
        } else {
218
            annotationsListField.setAnnotationTypesVisible(editableAnotationTypes);
219
        }
220
        addField(annotationsListField, "annotations", 0, row, 3, row);
221
    }
222

    
223

    
224

    
225
    @Override
226
    protected void afterItemDataSourceSet() {
227
        super.afterItemDataSourceSet();
228
        updateDesignationReferenceFields();
229
    }
230

    
231
    protected void updateDesignationReferenceFields() {
232
        boolean hasDesignationSource = typeStatusSelect.getValue() != null && ((NameTypeDesignationStatus)typeStatusSelect.getValue()).hasDesignationSource();
233
        designationReferenceDetailField.setVisible(hasDesignationSource);
234
        designationReferenceCombobox.setVisible(hasDesignationSource);
235
        // NOTE: For better usability we only hide these fields here,
236
        // NameTypeDesignationPresenter.preSaveBean(NameTypeDesignation bean) will empty them in needed
237

    
238
        boolean typeStatusRequired = !(conservedTypeField.getValue().booleanValue() || rejectedTypeField.getValue().booleanValue() || notDesignatedField.getValue().booleanValue());
239
        typeStatusSelect.setRequired(typeStatusRequired);
240

    
241
    }
242

    
243
    /**
244
     * @return the typeNameField
245
     */
246
    @Override
247
    public ToOneRelatedEntityCombobox<TaxonName> getTypeNameField() {
248
        return typeNameField;
249
    }
250

    
251
    /**
252
     * @return the typifiedNamesComboboxSelect
253
     */
254
    @Override
255
    public ToManyRelatedEntitiesComboboxSelect<TaxonName> getTypifiedNamesComboboxSelect() {
256
        return typifiedNamesComboboxSelect;
257
    }
258

    
259
    /**
260
     * @return the typeStatusSelect
261
     */
262
    @Override
263
    public NativeSelect getTypeStatusSelect() {
264
        return typeStatusSelect;
265
    }
266

    
267
    /**
268
     * @return the citationCombobox
269
     */
270
    @Override
271
    public ToOneRelatedEntityCombobox<Reference> getDesignationReferenceCombobox() {
272
        return designationReferenceCombobox;
273
    }
274

    
275

    
276
    /**
277
     * @return the showTypeFlags
278
     */
279
    @Override
280
    public boolean isShowTypeFlags() {
281
        return showTypeFlags;
282
    }
283

    
284
    /**
285
     * @param showTypeFlags the showTypeFlags to set
286
     */
287
    @Override
288
    public void setShowTypeFlags(boolean showTypeFlags) {
289
        this.showTypeFlags = showTypeFlags;
290
    }
291

    
292
    /**
293
     * {@inheritDoc}
294
     */
295
    @Override
296
    public AnnotationType[] getEditableAnotationTypes() {
297
        return editableAnotationTypes;
298
    }
299

    
300
    /**
301
     * {@inheritDoc}
302
     */
303
    @Override
304
    public void setEditableAnotationTypes(AnnotationType... editableAnotationTypes) {
305
        this.editableAnotationTypes = editableAnotationTypes;
306
    }
307

    
308
    /**
309
     * {@inheritDoc}
310
     */
311
    @Override
312
    public FilterableAnnotationsField getAnnotationsField() {
313
        return annotationsListField;
314
    }
315
}
(3-3/17)