Project

General

Profile

« Previous | Next » 

Revision 414d166a

Added by Andreas Kohlbecker almost 6 years ago

CustomComponentFields using NestedButtonStateUpdaters for consistent button states

View differences:

src/main/java/eu/etaxonomy/cdm/vaadin/event/NestedButtonStateUpdater.java
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.event;
10

  
11
import com.vaadin.data.Property.ValueChangeListener;
12

  
13
/**
14
 * @author a.kohlbecker
15
 * @since Jun 6, 2018
16
 *
17
 */
18
public interface NestedButtonStateUpdater extends ValueChangeListener{
19

  
20
}
src/main/java/eu/etaxonomy/cdm/vaadin/event/ToOneRelatedEntityButtonUpdater.java
9 9
package eu.etaxonomy.cdm.vaadin.event;
10 10

  
11 11
import com.vaadin.data.Property.ValueChangeEvent;
12
import com.vaadin.data.Property.ValueChangeListener;
13 12

  
14 13
import eu.etaxonomy.cdm.model.common.CdmBase;
15 14
import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
......
21 20
 * @since 19.10.2017
22 21
 *
23 22
 */
24
public class ToOneRelatedEntityButtonUpdater<CDM extends CdmBase> implements ValueChangeListener {
23
public class ToOneRelatedEntityButtonUpdater<CDM extends CdmBase> implements NestedButtonStateUpdater {
25 24

  
26 25
    private static final long serialVersionUID = 4472031263172275012L;
27 26

  
......
33 32
    public ToOneRelatedEntityButtonUpdater(ToOneRelatedEntityField<CDM> toOneRelatedEntityField){
34 33
        this.toOneRelatedEntityField = toOneRelatedEntityField;
35 34
        this.type = toOneRelatedEntityField.getType();
35
        toOneRelatedEntityField.setEditButtonEnabled(false);
36 36
    }
37 37

  
38 38
    /**
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/SpecimenTypeDesignationDTORow.java
17 17
import com.vaadin.ui.TextField;
18 18

  
19 19
import eu.etaxonomy.cdm.model.common.DefinedTerm;
20
import eu.etaxonomy.cdm.model.occurrence.Collection;
20 21
import eu.etaxonomy.cdm.model.reference.Reference;
21 22
import eu.etaxonomy.cdm.vaadin.component.CollectionRow;
22 23
import eu.etaxonomy.cdm.vaadin.component.CollectionRowItemCollection;
23 24
import eu.etaxonomy.cdm.vaadin.component.CollectionRowRepresentative;
24 25
import eu.etaxonomy.cdm.vaadin.component.TextFieldNFix;
26
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater;
25 27
import eu.etaxonomy.cdm.vaadin.model.registration.KindOfUnitTerms;
26 28
import eu.etaxonomy.cdm.vaadin.util.converter.UriConverter;
27 29
import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox;
......
52 54
    ToOneRelatedEntityCombobox<Reference> mediaSpecimenReference =
53 55
            new ToOneRelatedEntityCombobox<Reference>(null, Reference.class);
54 56
    TextField mediaSpecimenReferenceDetail = new TextFieldNFix(); //"Image reference detail");
57
    private ToOneRelatedEntityButtonUpdater<Reference> mediaSpecimenReferenceUpdater;
58
    private ToOneRelatedEntityButtonUpdater<Collection> collectionFieldUpdater;
55 59

  
56 60
    public SpecimenTypeDesignationDTORow(){
57 61
        kindOfUnit.setRows(1);
......
64 68
        preferredStableUri.setWidth(150, Unit.PIXELS);
65 69
        preferredStableUri.setConverter(new UriConverter());
66 70
        collection.setWidth(200, Unit.PIXELS);
71
        collectionFieldUpdater = new ToOneRelatedEntityButtonUpdater<Collection>(collection);
72
        collection.addValueChangeListener(
73
                collectionFieldUpdater
74
                );
67 75
        mediaUri.setWidth(150, Unit.PIXELS);
68 76
        mediaUri.setConverter(new UriConverter());
69 77
        mediaSpecimenReference.setWidth(200, Unit.PIXELS);
78
        mediaSpecimenReferenceUpdater = new ToOneRelatedEntityButtonUpdater<Reference>(mediaSpecimenReference);
79
        mediaSpecimenReference.addValueChangeListener(
80
                mediaSpecimenReferenceUpdater
81
                );
70 82
        mediaSpecimenReferenceDetail.setWidth(200, Unit.PIXELS);
71 83

  
72 84
        kindOfUnit.addValueChangeListener(e ->
......
114 126
        kindOfUnit.setEnabled(!kindOfUnitLocked);
115 127
        kindOfUnit.setDescription(kindOfUnitLocked ?
116 128
                "Can not be changed since the type specimen is associated with multiple type designations" : "");
129

  
117 130
        mediaSpecimenReference.setEnabled(publishedImageType || unPublishedImageType);
118 131
        mediaSpecimenReferenceDetail.setEnabled(publishedImageType || unPublishedImageType);
119 132
        mediaUri.setEnabled(publishedImageType || unPublishedImageType);
src/main/java/eu/etaxonomy/vaadin/component/CompositeCustomField.java
17 17
import com.vaadin.data.fieldgroup.FieldGroup.CommitEvent;
18 18
import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
19 19
import com.vaadin.data.fieldgroup.FieldGroup.CommitHandler;
20
import com.vaadin.ui.AbstractField;
20 21
import com.vaadin.ui.Button;
21 22
import com.vaadin.ui.Component;
22 23
import com.vaadin.ui.CustomField;
23 24
import com.vaadin.ui.Field;
24 25
import com.vaadin.ui.HasComponents;
25 26

  
27
import eu.etaxonomy.cdm.vaadin.event.NestedButtonStateUpdater;
28

  
26 29
/**
27 30
 * TODO implement height methods for full component size support
28 31
 *
......
232 235

  
233 236
    /**
234 237
     * Sets the readonly state for the component but treats Buttons differently.
235
     * Buttons are also set to disabled to make them inactive.
236

  
238
     * For nested Buttons the readonly state is projected to enabled state to
239
     * make them inactive. Finally NestedButtonStateUpdaters are triggered to
240
     * allow to disable buttons accordingly to user permissions.
241
     *
237 242
     * @param readOnly
238 243
     * @param component
239 244
     */
......
242 247
        if(Button.class.isAssignableFrom(component.getClass())){
243 248
            component.setEnabled(!readOnly);
244 249
        }
250
        triggerNestedButtonStateUpdaters();
251
    }
252

  
253
    /**
254
     *
255
     */
256
    protected void triggerNestedButtonStateUpdaters() {
257
        for(Object l : getListeners(AbstractField.ValueChangeEvent.class)){
258
           if(NestedButtonStateUpdater.class.isAssignableFrom(l.getClass())){
259
               // trigger a fake ValueChangeEvent to let the ToOneRelatedEntityButtonUpdater fix the states
260
               // of nested buttons
261
               ((NestedButtonStateUpdater)l).valueChange(new AbstractField.ValueChangeEvent(this));
262
           }
263
        }
264

  
245 265
    }
246 266

  
247 267
    @Override

Also available in: Unified diff