Project

General

Profile

Download (10.1 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2015 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;
10

    
11
import java.util.Arrays;
12

    
13
import com.vaadin.annotations.AutoGenerated;
14
import com.vaadin.data.Container;
15
import com.vaadin.event.Transferable;
16
import com.vaadin.event.dd.DragAndDropEvent;
17
import com.vaadin.event.dd.DropHandler;
18
import com.vaadin.event.dd.DropTarget;
19
import com.vaadin.event.dd.acceptcriteria.AcceptAll;
20
import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
21
import com.vaadin.navigator.View;
22
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
23
import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails;
24
import com.vaadin.ui.Alignment;
25
import com.vaadin.ui.Component;
26
import com.vaadin.ui.CustomComponent;
27
import com.vaadin.ui.HorizontalLayout;
28
import com.vaadin.ui.TreeTable;
29

    
30
import eu.etaxonomy.cdm.vaadin.component.taxon.ConceptRelationshipComposite;
31
import eu.etaxonomy.cdm.vaadin.component.taxon.EditConceptRelationshipComposite;
32
import eu.etaxonomy.cdm.vaadin.component.taxon.StatusComposite;
33
import eu.etaxonomy.cdm.vaadin.container.IdUuidName;
34
import eu.etaxonomy.cdm.vaadin.container.LeafNodeTaxonContainer;
35
import eu.etaxonomy.cdm.vaadin.jscomponent.D3ConceptRelationshipTree.Direction;
36
import eu.etaxonomy.cdm.vaadin.session.BasicEvent;
37
import eu.etaxonomy.cdm.vaadin.session.CdmChangeEvent;
38
import eu.etaxonomy.cdm.vaadin.session.IBasicEventListener;
39
import eu.etaxonomy.cdm.vaadin.session.SelectionEvent;
40
import eu.etaxonomy.cdm.vaadin.util.CdmVaadinSessionUtilities;
41
import eu.etaxonomy.cdm.vaadin.util.CdmVaadinUtilities;
42

    
43
/**
44
 * @author cmathew
45
 * @since 9 Apr 2015
46
 */
47
public class ConceptRelationshipView extends CustomComponent implements View, IBasicEventListener {
48

    
49
   private static final long serialVersionUID = -2401649382244738589L;
50

    
51
    /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
52

    
53
    @AutoGenerated
54
    private HorizontalLayout mainLayout;
55
    @AutoGenerated
56
    private StatusComposite statusCompositeRight;
57
    @AutoGenerated
58
    private ConceptRelationshipComposite conceptRelationshipComposite;
59
    @AutoGenerated
60
    private StatusComposite statusCompositeLeft;
61
    private StatusComposite primaryStatusComposite, secondaryStatusComposite;
62

    
63
    private Direction direction;
64

    
65
    /**
66
     * The constructor should first build the main layout, set the
67
     * composition root and then do any custom initialization.
68
     *
69
     * The constructor will not be automatically regenerated by the
70
     * visual editor.
71
     */
72
    public ConceptRelationshipView(String oc, String cc) {
73

    
74
        buildMainLayout();
75
        setCompositionRoot(mainLayout);
76

    
77

    
78
        conceptRelationshipComposite.setView(this);
79

    
80
        setPrimaryStatusCompositeUuid(statusCompositeLeft);
81
        direction = Direction.LEFT_RIGHT;
82
        CdmVaadinSessionUtilities.getCurrentBasicEventService().register(this);
83

    
84
        statusCompositeLeft.setClassification(oc);
85
        statusCompositeRight.setClassification(cc);
86

    
87
        initDropHandlers();
88
    }
89

    
90
    /* (non-Javadoc)
91
     * @see com.vaadin.navigator.View#enter(com.vaadin.navigator.ViewChangeListener.ViewChangeEvent)
92
     */
93
    @Override
94
    public void enter(ViewChangeEvent event) {
95

    
96
    }
97

    
98
    public Direction getDirection() {
99
        return direction;
100
    }
101

    
102
    public void initDropHandlers() {
103
        statusCompositeLeft.getTaxaTreeTable().setDropHandler(new ConceptRelationshipDropHandler(statusCompositeRight));
104
        statusCompositeRight.getTaxaTreeTable().setDropHandler(new ConceptRelationshipDropHandler(statusCompositeLeft));
105
    }
106

    
107
    public void setPrimaryStatusCompositeUuid(StatusComposite sc) {
108
        if(sc != null) {
109
            if(sc == statusCompositeLeft) {
110
                primaryStatusComposite = statusCompositeLeft;
111
                secondaryStatusComposite = statusCompositeRight;
112
                direction = Direction.LEFT_RIGHT;
113
            }
114
            if(sc == statusCompositeRight) {
115
                secondaryStatusComposite = statusCompositeLeft;
116
                primaryStatusComposite = statusCompositeRight;
117
                direction = Direction.RIGHT_LEFT;
118
            }
119
            secondaryStatusComposite.clearTaxaTableSelections();
120
        }
121
    }
122

    
123
    /* (non-Javadoc)
124
     * @see eu.etaxonomy.cdm.vaadin.session.IBasicEventListener#onAction(eu.etaxonomy.cdm.vaadin.session.BasicEvent)
125
     */
126
    @Override
127
    public void onAction(BasicEvent event) {
128
        if(ConceptRelationshipComposite.UPDATE_START_ID.equals(event.getEventId())) {
129
            primaryStatusComposite.getTaxaTreeTable().setEnabled(false);
130
            secondaryStatusComposite.getTaxaTreeTable().setSelectable(false);
131
        }
132
        if(ConceptRelationshipComposite.UPDATE_END_ID.equals(event.getEventId())) {
133
            primaryStatusComposite.getTaxaTreeTable().setEnabled(true);
134
            secondaryStatusComposite.getTaxaTreeTable().setSelectable(true);
135
        }
136
    }
137

    
138
    private class ConceptRelationshipDropHandler implements DropHandler {
139

    
140
        private static final long serialVersionUID = -47088400019778466L;
141

    
142
        private StatusComposite sourceSc;
143

    
144
        public ConceptRelationshipDropHandler(StatusComposite sourceSc) {
145
            this.sourceSc = sourceSc;
146
        }
147

    
148
        @Override
149
        public AcceptCriterion getAcceptCriterion() {
150
            return AcceptAll.get();
151
        }
152

    
153
        @Override
154
        public void drop(DragAndDropEvent event) {
155
            // Wrapper for the object that is dragged
156
            Transferable t = event.getTransferable();
157
            Component source = t.getSourceComponent();
158

    
159
            // This is the case where the source of the dd is another
160
            // taxon table not the one in this object
161
            if (source instanceof TreeTable  && source == sourceSc.getTaxaTreeTable()) {
162
                TreeTable sourceTable = (TreeTable)t.getSourceComponent();
163
                LeafNodeTaxonContainer sourceContainer = (LeafNodeTaxonContainer)sourceTable.getContainerDataSource();
164

    
165
                IdUuidName fromTaxonIun, toTaxonIun;
166

    
167
                Object sourceItemId = t.getData("itemId");
168
                String fromName = (String)sourceContainer.getProperty(sourceItemId, LeafNodeTaxonContainer.NAME_ID).getValue();
169

    
170
                AbstractSelectTargetDetails dropData = ((AbstractSelectTargetDetails) event.getTargetDetails());
171
                DropTarget target = dropData.getTarget();
172
                if(target instanceof TreeTable) {
173
                    TreeTable targetTable = (TreeTable)target;
174
                    Container container = targetTable.getContainerDataSource();
175
                    if(container instanceof LeafNodeTaxonContainer) {
176
                        LeafNodeTaxonContainer targetContainer = (LeafNodeTaxonContainer)container;
177
                        Object targetItemId = dropData.getItemIdOver();
178
                        String toName = (String)targetContainer.getProperty(targetItemId, LeafNodeTaxonContainer.NAME_ID).getValue();
179

    
180
                        fromTaxonIun = new IdUuidName(sourceItemId,
181
                                sourceContainer.getUuid(sourceItemId),
182
                                fromName);
183
                        toTaxonIun = new IdUuidName(targetItemId,
184
                                targetContainer.getUuid(targetItemId),
185
                                toName);
186
                        if(!CdmVaadinUtilities.isSelected(sourceTable, sourceItemId)) {
187
                            CdmVaadinSessionUtilities.getCurrentSelectionService()
188
                        .fireSelectionEvent(new SelectionEvent(Arrays.asList(fromTaxonIun, sourceSc.getSelectedClassificationUuid()), StatusComposite.class), false);
189
                        }
190
                        sourceTable.setValue(Arrays.asList(sourceItemId));
191
                        EditConceptRelationshipComposite.showInDialog(ConceptRelationshipComposite.CREATE_NEW_CR_TITLE,
192
                                fromTaxonIun,
193
                                null,
194
                                toTaxonIun,
195
                                CdmChangeEvent.Action.Create,
196
                                direction);
197
                    }
198
                }
199
            }
200
        }
201
    }
202

    
203
    @AutoGenerated
204
    private HorizontalLayout buildMainLayout() {
205
        // common part: create layout
206
        mainLayout = new HorizontalLayout();
207
        mainLayout.setImmediate(false);
208
        mainLayout.setWidth("100%");
209
        mainLayout.setHeight("100%");
210
        mainLayout.setMargin(true);
211

    
212
        // top-level component properties
213
        setWidth("100.0%");
214
        setHeight("100.0%");
215

    
216
        // statusCompositeLeft
217
        statusCompositeLeft = new StatusComposite();
218
        statusCompositeLeft.setImmediate(false);
219
        statusCompositeLeft.setWidth("-1px");
220
        statusCompositeLeft.setHeight("100.0%");
221
        mainLayout.addComponent(statusCompositeLeft);
222
        mainLayout.setExpandRatio(statusCompositeLeft, 1.0f);
223
        mainLayout.setComponentAlignment(statusCompositeLeft, new Alignment(20));
224

    
225
        // conceptRelationshipComposite
226
        conceptRelationshipComposite = new ConceptRelationshipComposite();
227
        conceptRelationshipComposite.setImmediate(false);
228
        conceptRelationshipComposite.setWidth("100.0%");
229
        conceptRelationshipComposite.setHeight("100.0%");
230
        mainLayout.addComponent(conceptRelationshipComposite);
231
        mainLayout.setExpandRatio(conceptRelationshipComposite, 2.3f);
232
        mainLayout.setComponentAlignment(conceptRelationshipComposite, new Alignment(20));
233

    
234
        // statusCompositeRight
235
        statusCompositeRight = new StatusComposite();
236
        statusCompositeRight.setImmediate(false);
237
        statusCompositeRight.setWidth("-1px");
238
        statusCompositeRight.setHeight("100.0%");
239
        mainLayout.addComponent(statusCompositeRight);
240
        mainLayout.setExpandRatio(statusCompositeRight, 1.0f);
241
        mainLayout.setComponentAlignment(statusCompositeRight, new Alignment(20));
242

    
243
        return mainLayout;
244
    }
245
}
(5-5/11)