Project

General

Profile

Download (15.3 KB) Statistics
| Branch: | Tag: | Revision:
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.Collection;
12
import java.util.EnumSet;
13

    
14
import org.springframework.security.core.GrantedAuthority;
15

    
16
import com.vaadin.ui.Alignment;
17
import com.vaadin.ui.CheckBox;
18
import com.vaadin.ui.GridLayout;
19
import com.vaadin.ui.ListSelect;
20
import com.vaadin.ui.TextField;
21

    
22
import eu.etaxonomy.cdm.model.common.CdmBase;
23
import eu.etaxonomy.cdm.model.name.Rank;
24
import eu.etaxonomy.cdm.model.name.TaxonName;
25
import eu.etaxonomy.cdm.model.reference.Reference;
26
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
27
import eu.etaxonomy.cdm.vaadin.component.common.TeamOrPersonField;
28
import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction;
29
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
30
import eu.etaxonomy.cdm.vaadin.security.AccessRestrictedView;
31
import eu.etaxonomy.cdm.vaadin.security.UserHelper;
32
import eu.etaxonomy.cdm.vaadin.util.converter.SetToListConverter;
33
import eu.etaxonomy.vaadin.component.SwitchableTextField;
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
import eu.etaxonomy.vaadin.permission.EditPermissionTester;
39

    
40
/**
41
 * @author a.kohlbecker
42
 * @since May 22, 2017
43
 *
44
 */
45
public class TaxonNamePopupEditor extends AbstractCdmPopupEditor<TaxonName, TaxonNameEditorPresenter> implements TaxonNamePopupEditorView, AccessRestrictedView {
46

    
47
    private static final long serialVersionUID = -7037436241474466359L;
48

    
49
    private final static int GRID_COLS = 4;
50

    
51
    private final static int GRID_ROWS = 12;
52

    
53
    private static final boolean HAS_BASIONYM_DEFAULT = false;
54

    
55
    private TextField genusOrUninomialField;
56

    
57
    private TextField infraGenericEpithetField;
58

    
59
    private TextField specificEpithetField;
60

    
61
    private TextField infraSpecificEpithetField;
62

    
63
    private SwitchableTextField fullTitleCacheFiled;
64

    
65
    private SwitchableTextField protectedNameCacheField;
66

    
67
    private ToOneRelatedEntityCombobox<Reference> nomReferenceCombobox;
68

    
69
    private TextField nomenclaturalReferenceDetail;
70

    
71
    private TeamOrPersonField exBasionymAuthorshipField;
72

    
73
    private TeamOrPersonField basionymAuthorshipField;
74

    
75
    private ToManyRelatedEntitiesComboboxSelect<TaxonName> basionymsComboboxSelect;
76

    
77
    private CheckBox basionymToggle;
78

    
79
    private ListSelect rankSelect;
80

    
81
    private TeamOrPersonField combinationAuthorshipField;
82

    
83
    private TeamOrPersonField exCombinationAuthorshipField;
84

    
85
    private EnumSet<TaxonNamePopupEditorMode> modesActive = EnumSet.noneOf(TaxonNamePopupEditorMode.class);
86

    
87
    /**
88
     * @param layout
89
     * @param dtoType
90
     */
91
    public TaxonNamePopupEditor() {
92
        super(new GridLayout(GRID_COLS, GRID_ROWS), TaxonName.class);
93
    }
94

    
95
    /**
96
     * {@inheritDoc}
97
     */
98
    @Override
99
    public String getWindowCaption() {
100
        return "Name editor";
101
    }
102

    
103

    
104

    
105
    /**
106
     * {@inheritDoc}
107
     */
108
    @Override
109
    public int getWindowPixelWidth() {
110
        return 700;
111
    }
112

    
113
    /**
114
     * {@inheritDoc}
115
     */
116
    @Override
117
    public void focusFirst() {
118
        // titleField.focus();
119

    
120
    }
121

    
122
    /**
123
     * {@inheritDoc}
124
     */
125
    @Override
126
    protected String getDefaultComponentStyles() {
127
        return "tiny";
128
    }
129

    
130
    /**
131
     * {@inheritDoc}
132
     */
133
    @Override
134
    protected void initContent() {
135

    
136
        GridLayout grid = (GridLayout)getFieldLayout();
137
        grid.setSizeFull();
138
        grid.setSpacing(true);
139
        grid.setColumnExpandRatio(0, 0.3f);
140
        grid.setColumnExpandRatio(1, 0.3f);
141
        grid.setColumnExpandRatio(2, 0.3f);
142
        grid.setColumnExpandRatio(3, 0.0f);
143

    
144
        /*
145
         - nameType: preset, needs to be set in the presenter for new names
146
         - appendedPhrase: -> TODO field
147
         - nomenclaturalMicroReference:  -> TODO field
148
         - nomenclaturalReference ->  field but disabled for REGISTRY
149
         - rank -> SelectField which determines the visiblity of the other fields
150

    
151
         - fullTitleCache + protectedFullTitleCache -> SwitchableTextField : ADVANCED_MODE
152
         - nameCache + protectedNameCache -> SwitchableTextField : ADVANCED_MODE
153

    
154
         - homotypicalGroup -> hidden
155
         - typeDesignations -> hidden
156
         - descriptions -> hidden
157
         - taxonBases -> hidden
158
         - registrations -> hidden
159

    
160
         - relationsFromThisName-> TODO implement later
161
         - relationsToThisName -> TODO implement later
162

    
163
         - genusOrUninomial -> textField
164
         - infraGenericEpithet  -> textField
165
         - specificEpithet  -> textField
166
         - infraSpecificEpithet  -> textField
167

    
168
         - authorshipCache + protectedAuthorshipCache -> SwitchableTextField : only ADVANCED_MODE and disabled for REGISTRY
169
         - basionymAuthorship -> field but disabled for REGISTRY, basionym is set as nameRelationShip
170
         - combinationAuthorship -> field but disabled for REGISTRY author team of the reference
171
         - exCombinationAuthorship -> textField
172
         - exBasionymAuthorship -> textField
173

    
174
         - status -> TODO field
175
         - monomHybrid -> TODO implement hybrids later
176
         - binomHybrid -> TODO implement hybrids later
177
         - trinomHybrid -> TODO implement hybrids later
178

    
179
         - hybridParentRelations -> TODO implement hybrids later
180
         - hybridChildRelations -> TODO implement hybrids later
181
         - hybridFormula -> TODO implement hybrids later
182

    
183
         ** ViralName attributes **
184
         - acronym
185

    
186
         ** BacterialName attributes **
187
         - subGenusAuthorship
188
         - nameApprobation
189
         - breed
190
         - publicationYear
191
         - originalPublicationYear
192
         - cultivarName
193
        */
194

    
195
        int row = 0;
196

    
197
        rankSelect = new ListSelect("Rank");
198
        rankSelect.setNullSelectionAllowed(false);
199
        rankSelect.setRows(1);
200
        rankSelect.setWidth(100, Unit.PERCENTAGE);
201
        rankSelect.addValueChangeListener(e -> updateFieldVisibility((Rank)e.getProperty().getValue()));
202
        addField(rankSelect, "rank", 0, row, 1, row);
203
        grid.setComponentAlignment(rankSelect, Alignment.TOP_RIGHT);
204

    
205
        basionymToggle = new CheckBox("With basionym");
206
        basionymToggle.setValue(HAS_BASIONYM_DEFAULT);
207
        basionymToggle.addValueChangeListener(e -> {
208
                boolean enable = e.getProperty().getValue() != null && (Boolean)e.getProperty().getValue();
209
                enableBasionymFields(enable);
210
            });
211
        basionymToggle.setStyleName(getDefaultComponentStyles());
212
        grid.addComponent(basionymToggle, 2, row, 3, row);
213
        grid.setComponentAlignment(basionymToggle, Alignment.BOTTOM_LEFT);
214
        row++;
215
        // fullTitleCache
216
        fullTitleCacheFiled = addSwitchableTextField("Full title cache", "fullTitleCache", "protectedFullTitleCache", 0, row, GRID_COLS-1, row);
217
        fullTitleCacheFiled.setWidth(100, Unit.PERCENTAGE);
218
        row++;
219
        protectedNameCacheField = addSwitchableTextField("Name cache", "nameCache", "protectedNameCache", 0, row, GRID_COLS-1, row);
220
        protectedNameCacheField.setWidth(100, Unit.PERCENTAGE);
221
        row++;
222
        genusOrUninomialField = addTextField("Genus or uninomial", "genusOrUninomial", 0, row, 1, row);
223
        genusOrUninomialField.setWidth(200, Unit.PIXELS);
224
        infraGenericEpithetField = addTextField("Infrageneric epithet", "infraGenericEpithet", 2, row, 3, row);
225
        infraGenericEpithetField.setWidth(200, Unit.PIXELS);
226
        row++;
227
        specificEpithetField = addTextField("Specific epithet", "specificEpithet", 0, row, 1, row);
228
        specificEpithetField.setWidth(200, Unit.PIXELS);
229
        infraSpecificEpithetField = addTextField("Infraspecific epithet", "infraSpecificEpithet", 2, row, 3, row);
230
        infraSpecificEpithetField.setWidth(200, Unit.PIXELS);
231
        row++;
232
        combinationAuthorshipField = new TeamOrPersonField("combination author(s)");
233
        combinationAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
234
        addField(combinationAuthorshipField, "combinationAuthorship", 0, row, GRID_COLS-1, row);
235
        row++;
236
        exCombinationAuthorshipField = new TeamOrPersonField("Ex-combination author(s)");
237
        exCombinationAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
238
        addField(exCombinationAuthorshipField, "exCombinationAuthorship", 0, row, GRID_COLS-1, row);
239

    
240
        // nomenclaturalReference
241
        row++;
242
        nomReferenceCombobox = new ToOneRelatedEntityCombobox<Reference>("Nomenclatural reference", Reference.class);
243
        nomReferenceCombobox.addClickListenerAddEntity(e -> getEventBus().publishEvent(
244
                new ReferenceEditorAction(EditorActionType.ADD, null, nomReferenceCombobox, this)
245
                ));
246
        nomReferenceCombobox.addClickListenerEditEntity(e -> {
247
            if(nomReferenceCombobox.getValue() != null){
248
                getEventBus().publishEvent(
249
                    new ReferenceEditorAction(
250
                            EditorActionType.EDIT,
251
                            nomReferenceCombobox.getValue().getId(),
252
                            nomReferenceCombobox,
253
                            this)
254
                );
255
            }
256
            });
257
        nomReferenceCombobox.setWidth(300, Unit.PIXELS);
258
        addField(nomReferenceCombobox, "nomenclaturalReference", 0, row, 2, row);
259
        nomenclaturalReferenceDetail = addTextField("Reference detail", "nomenclaturalMicroReference", 3, row, 3, row);
260
        nomenclaturalReferenceDetail.setWidth(100, Unit.PIXELS);
261

    
262

    
263
        // Basionym
264
        row++;
265
        basionymsComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Basionym");
266
        basionymsComboboxSelect.setConverter(new SetToListConverter<TaxonName>());
267
        addField(basionymsComboboxSelect, "basionyms", 0, row, 3, row);
268
        basionymsComboboxSelect.setWidth(100, Unit.PERCENTAGE);
269
        basionymsComboboxSelect.withEditButton(true);
270
        basionymsComboboxSelect.setEditPermissionTester(new EditPermissionTester() {
271

    
272
            @Override
273
            public boolean userHasEditPermission(Object bean) {
274
                return  UserHelper.fromSession().userHasPermission((CdmBase)bean, CRUD.UPDATE, CRUD.DELETE);
275
            }
276
        });
277
        basionymsComboboxSelect.setEditActionListener(e -> {
278

    
279
            Object fieldValue = e.getSource().getValue();
280
            Integer beanId = null;
281
            if(fieldValue != null){
282
                beanId = ((CdmBase)fieldValue).getId();
283

    
284
            }
285
            eventBus.publishEvent(new TaxonNameEditorAction(e.getAction(), beanId, e.getSource(), this));
286
        });
287
        grid.setComponentAlignment(basionymsComboboxSelect, Alignment.TOP_RIGHT);
288
        row++;
289
        basionymAuthorshipField = new TeamOrPersonField("Basionym author(s)");
290
        basionymAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
291
        addField(basionymAuthorshipField, "basionymAuthorship", 0, row, GRID_COLS-1, row);
292
        row++;
293
        exBasionymAuthorshipField = new TeamOrPersonField("Ex-basionym author(s)");
294
        exBasionymAuthorshipField.setWidth(100,  Unit.PERCENTAGE);
295
        addField(exBasionymAuthorshipField, "exBasionymAuthorship", 0, row, GRID_COLS-1, row);
296

    
297

    
298

    
299
        setAdvancedModeEnabled(true);
300
        enableBasionymFields(HAS_BASIONYM_DEFAULT);
301
        registerAdvancedModeComponents(fullTitleCacheFiled, protectedNameCacheField);
302
        registerAdvancedModeComponents(basionymAuthorshipField.getCachFields());
303
        registerAdvancedModeComponents(exBasionymAuthorshipField.getCachFields());
304
        registerAdvancedModeComponents(combinationAuthorshipField.getCachFields());
305
        registerAdvancedModeComponents(exCombinationAuthorshipField.getCachFields());
306
        setAdvancedMode(false);
307

    
308
    }
309

    
310
    /**
311
     * @param value
312
     * @return
313
     */
314
    private void enableBasionymFields(boolean enable) {
315
        basionymAuthorshipField.setVisible(enable);
316
        exBasionymAuthorshipField.setVisible(enable);
317
        basionymsComboboxSelect.setVisible(enable);
318
        if(modesActive.contains(TaxonNamePopupEditorMode.suppressReplacementAuthorshipData)){
319
            TaxonName taxonName = getBean();
320
            basionymAuthorshipField.setVisible(taxonName.getBasionymAuthorship() != null);
321
        }
322
    }
323

    
324
    /**
325
     * @param rank
326
     * @return
327
     */
328
    private void updateFieldVisibility(Rank rank) {
329
        boolean isSpeciesOrBelow = !rank.isHigher(Rank.SPECIES());
330
        // TODO use getField() instead and remove field references
331
        infraSpecificEpithetField.setVisible(rank.isInfraSpecific());
332
        specificEpithetField.setVisible(isSpeciesOrBelow);
333
        infraGenericEpithetField.setVisible(rank.isInfraGenericButNotSpeciesGroup());
334
        genusOrUninomialField.setCaption(isSpeciesOrBelow ? "Genus" : "Uninomial");
335
    }
336

    
337
    @Override
338
    protected void afterItemDataSourceSet() {
339
        TaxonName taxonName = getBean();
340
        boolean showBasionymSection = taxonName.getBasionyms().size() > 0
341
                || taxonName.getBasionymAuthorship() != null
342
                || taxonName.getExBasionymAuthorship() != null;
343
        basionymToggle.setValue(showBasionymSection);
344

    
345
        if(isModeEnabled(TaxonNamePopupEditorMode.suppressReplacementAuthorshipData)){
346
            combinationAuthorshipField.setVisible(taxonName.getCombinationAuthorship() != null);
347
        }
348

    
349
    }
350

    
351
    /**
352
     * {@inheritDoc}
353
     */
354
    @Override
355
    public boolean allowAnonymousAccess() {
356
        return false;
357
    }
358

    
359
    /**
360
     * {@inheritDoc}
361
     */
362
    @Override
363
    public Collection<Collection<GrantedAuthority>> allowedGrantedAuthorities() {
364
        return null;
365
    }
366

    
367
    /**
368
     * {@inheritDoc}
369
     */
370
    @Override
371
    public ToOneRelatedEntityCombobox<Reference> getNomReferenceCombobox() {
372
        return nomReferenceCombobox;
373
    }
374

    
375
    /**
376
     * {@inheritDoc}
377
     */
378
    @Override
379
    public ToManyRelatedEntitiesComboboxSelect<TaxonName> getBasionymComboboxSelect() {
380
        return basionymsComboboxSelect;
381
    }
382

    
383
    /**
384
     * {@inheritDoc}
385
     */
386
    @Override
387
    public ListSelect getRankSelect() {
388
        return rankSelect;
389
    }
390

    
391
    /**
392
     * @return the exBasionymAuthorshipField
393
     */
394
    @Override
395
    public TeamOrPersonField getExBasionymAuthorshipField() {
396
        return exBasionymAuthorshipField;
397
    }
398

    
399
    /**
400
     * @return the basionymAuthorshipField
401
     */
402
    @Override
403
    public TeamOrPersonField getBasionymAuthorshipField() {
404
        return basionymAuthorshipField;
405
    }
406

    
407
    /**
408
     * @return the combinationAuthorshipField
409
     */
410
    @Override
411
    public TeamOrPersonField getCombinationAuthorshipField() {
412
        return combinationAuthorshipField;
413
    }
414

    
415
    /**
416
     * @return the exCombinationAuthorshipField
417
     */
418
    @Override
419
    public TeamOrPersonField getExCombinationAuthorshipField() {
420
        return exCombinationAuthorshipField;
421
    }
422

    
423
    @Override
424
    public void enableMode(TaxonNamePopupEditorMode mode){
425
        modesActive.add(mode);
426
    }
427

    
428
    @Override
429
    public boolean isModeEnabled(TaxonNamePopupEditorMode mode){
430
        return modesActive.contains(mode);
431
    }
432

    
433
    @Override
434
    public void disableMode(TaxonNamePopupEditorMode mode){
435
        modesActive.remove(mode);
436
    }
437

    
438
    @Override
439
    public CheckBox getBasionymToggle() {
440
        return basionymToggle;
441
    }
442

    
443

    
444
}
(7-7/10)