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 org.springframework.context.annotation.Scope;
14

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

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

    
46
/**
47
 * @author cmathew
48
 * @date 9 Apr 2015
49
 *
50
 */
51
@SpringComponent
52
@Scope("prototype")
53
public class ConceptRelationshipView extends CustomComponent implements View, IBasicEventListener {
54

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

    
57
    @AutoGenerated
58
    private HorizontalLayout mainLayout;
59
    @AutoGenerated
60
    private StatusComposite statusCompositeRight;
61
    @AutoGenerated
62
    private ConceptRelationshipComposite conceptRelationshipComposite;
63
    @AutoGenerated
64
    private StatusComposite statusCompositeLeft;
65
    private StatusComposite primaryStatusComposite, secondaryStatusComposite;
66

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

    
77
        buildMainLayout();
78
        setCompositionRoot(mainLayout);
79

    
80

    
81
        conceptRelationshipComposite.setView(this);
82

    
83
        setPrimaryStatusCompositeUuid(statusCompositeLeft);
84
        direction = Direction.LEFT_RIGHT;
85
        CdmVaadinSessionUtilities.getCurrentBasicEventService().register(this);
86

    
87
        statusCompositeLeft.setClassification(oc);
88
        statusCompositeRight.setClassification(cc);
89

    
90
        initDropHandlers();
91
    }
92

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

    
99
    }
100

    
101
    public Direction getDirection() {
102
        return direction;
103
    }
104

    
105
    public void initDropHandlers() {
106
        statusCompositeLeft.getTaxaTreeTable().setDropHandler(new ConceptRelationshipDropHandler(statusCompositeRight));
107
        statusCompositeRight.getTaxaTreeTable().setDropHandler(new ConceptRelationshipDropHandler(statusCompositeLeft));
108
    }
109

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

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

    
141
    private class ConceptRelationshipDropHandler implements DropHandler {
142

    
143
        private StatusComposite sourceSc;
144

    
145

    
146
        public ConceptRelationshipDropHandler(StatusComposite sourceSc) {
147
            this.sourceSc = sourceSc;
148
        }
149

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

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

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

    
167
                IdUuidName fromTaxonIun, toTaxonIun;
168

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

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

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

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

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

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

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

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

    
245
        return mainLayout;
246
    }
247
}
(2-2/7)