Project

General

Profile

Download (9.47 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.taxeditor.editor.workingSet;
10

    
11
import java.util.Collection;
12
import java.util.HashSet;
13
import java.util.List;
14
import java.util.Map;
15
import java.util.Set;
16
import java.util.UUID;
17

    
18
import javax.annotation.PostConstruct;
19
import javax.annotation.PreDestroy;
20
import javax.inject.Inject;
21
import javax.inject.Named;
22

    
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
25
import org.eclipse.e4.core.contexts.IEclipseContext;
26
import org.eclipse.e4.ui.di.Focus;
27
import org.eclipse.e4.ui.di.Persist;
28
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
29
import org.eclipse.e4.ui.services.IServiceConstants;
30
import org.eclipse.jface.util.LocalSelectionTransfer;
31
import org.eclipse.jface.viewers.Viewer;
32
import org.eclipse.swt.SWT;
33
import org.eclipse.swt.dnd.DND;
34
import org.eclipse.swt.dnd.Transfer;
35
import org.eclipse.swt.events.ModifyEvent;
36
import org.eclipse.swt.events.ModifyListener;
37
import org.eclipse.swt.widgets.Composite;
38
import org.eclipse.swt.widgets.Display;
39
import org.eclipse.swt.widgets.Shell;
40

    
41
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
42
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
43
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
44
import eu.etaxonomy.cdm.api.service.IWorkingSetService;
45
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
46
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
47
import eu.etaxonomy.cdm.model.description.FeatureTree;
48
import eu.etaxonomy.cdm.model.description.SpecimenDescription;
49
import eu.etaxonomy.cdm.model.description.WorkingSet;
50
import eu.etaxonomy.cdm.model.location.NamedArea;
51
import eu.etaxonomy.cdm.model.name.Rank;
52
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
53
import eu.etaxonomy.cdm.model.taxon.ITaxonTreeNode;
54
import eu.etaxonomy.cdm.model.taxon.Taxon;
55
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
56
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
57
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
58
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
59
import eu.etaxonomy.taxeditor.store.CdmStore;
60
import eu.etaxonomy.taxeditor.ui.dialog.selection.NamedAreaSelectionDialog;
61
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
62
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
63

    
64
/**
65
 * @author pplitzner
66
 * @since Nov 21, 2017
67
 *
68
 */
69
public class WorkingSetEditor implements IE4SavablePart, IConversationEnabled, ICdmEntitySessionEnabled{
70

    
71
    private WorkingSetComposite composite;
72

    
73
    private ConversationHolder conversation;
74

    
75
    private ICdmEntitySession cdmEntitySession;
76

    
77
    private WorkingSet workingSet;
78

    
79
    private final int dndOperations = DND.DROP_MOVE;
80

    
81
    @Inject
82
    private MDirtyable dirty;
83

    
84
    private ModifyListener labelModifyListener;
85

    
86
    @PostConstruct
87
    public void create(Composite parent, IEclipseContext context, @Named(IServiceConstants.ACTIVE_SHELL)Shell shell){
88
        if (CdmStore.isActive()){
89
            if(conversation == null){
90
                conversation = CdmStore.createConversation();
91
            }
92
            if(cdmEntitySession == null){
93
                cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
94
            }
95
        }
96
        else{
97
            return;
98
        }
99
        CdmFormFactory cdmFormFactory = new CdmFormFactory(Display.getCurrent());
100
        ContextInjectionFactory.inject(cdmFormFactory, context);
101

    
102
        composite = new WorkingSetComposite(parent, SWT.NONE);
103

    
104
        labelModifyListener = new ModifyListener() {
105
            @Override
106
            public void modifyText(ModifyEvent e) {
107
                dirty.setDirty(true);
108
            }
109
        };
110
        composite.getRankMin().addSelectionChangedListener(event->dirty.setDirty(true));
111
        composite.getRankMax().addSelectionChangedListener(event->dirty.setDirty(true));
112

    
113
        composite.getTextAreaText().addListener(SWT.MouseDown, event-> {
114
            NamedArea area = NamedAreaSelectionDialog.select(shell, null, null);
115
            if(area!=null){
116
                composite.setArea(area);
117
            }
118
            dirty.setDirty(true);
119
        });
120

    
121
        composite.getFeatureTreeEditorComposite().init(null, null, null, null);
122

    
123
        //add drag'n'drop support
124
        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer()};
125
        composite.getTaxonNodeTree().addDropSupport(dndOperations, transfers, new TaxonNodeDropAdapter(this));
126

    
127
    }
128

    
129
    public void init(UUID workingSetUuid) {
130
        this.workingSet = CdmStore.getService(IWorkingSetService.class).load(workingSetUuid);
131
        if(workingSet.getTitleCache()!=null){
132
            composite.getTxt_label().setText(workingSet.getTitleCache());
133
        }
134
        if(workingSet.getDescriptiveSystem()!=null){
135
            composite.setCharacters(workingSet.getDescriptiveSystem());
136
        }
137
        Rank maxRank = workingSet.getMaxRank();
138
        if(maxRank!=null){
139
            composite.setRankMax(maxRank);
140
        }
141
        Rank minRank = workingSet.getMinRank();
142
        if(minRank!=null){
143
            composite.setRankMin(minRank);
144
        }
145
        Set<NamedArea> geoFilter = workingSet.getGeoFilter();
146
        if(geoFilter!=null && !geoFilter.isEmpty()){
147
            composite.setArea(geoFilter.iterator().next());
148
        }
149
        Set<TaxonNode> taxonSubtreeFilter = workingSet.getTaxonSubtreeFilter();
150
        if(taxonSubtreeFilter!=null){
151
            composite.getTaxonNodeTree().setInput(taxonSubtreeFilter);
152
        }
153

    
154
        composite.getTxt_label().addModifyListener(labelModifyListener);
155
    }
156

    
157
    /**
158
     * {@inheritDoc}
159
     */
160
    @Persist
161
    @Override
162
    public void save(IProgressMonitor monitor) {
163
        NamedArea area = composite.getArea();
164
        Set<NamedArea> areas = new HashSet<>();
165
        if(area!=null){
166
            areas.add(area);
167
        }
168
        Object input = composite.getTaxonNodeTree().getInput();
169
        if(input!=null){
170
            Collection<ITaxonTreeNode> taxonNodes = (Collection<ITaxonTreeNode>) input;
171
            for (ITaxonTreeNode taxonTreeNode : taxonNodes) {
172
                if(taxonTreeNode instanceof TaxonNode){
173
                    TaxonNode taxonNode = (TaxonNode)taxonTreeNode;
174
                    workingSet.addTaxonSubtree(taxonNode);
175
                    Set<NamedArea> descriptions;
176
                    if(taxonNode!=null && taxonNode.getTaxon()!=null){
177
                        Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class);
178
                        Collection<SpecimenOrObservationBase> specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null);
179
                        for (SpecimenOrObservationBase specimen : specimens) {
180
                            Set<SpecimenDescription> specimenDescriptions = specimen.getSpecimenDescriptions();
181
                            for (SpecimenDescription specimenDescription : specimenDescriptions) {
182
                                workingSet.addDescription(specimenDescription);
183
                            }
184
                        }
185
                    }
186
                }
187
            }
188
        }
189
        FeatureTree characters = composite.getCharacters();
190
        DefinedTermBase rankMaxSelection = composite.getRankMax().getSelection();
191
        Rank rankMax = null;
192
        if(rankMaxSelection instanceof Rank){
193
            rankMax = (Rank) rankMaxSelection;
194
        }
195
        DefinedTermBase rankMinSelection = composite.getRankMin().getSelection();
196
        Rank rankMin = null;
197
        if(rankMinSelection instanceof Rank){
198
            rankMin = (Rank) rankMinSelection;
199
        }
200

    
201
        workingSet.setMaxRank(rankMax);
202
        workingSet.setMinRank(rankMin);
203
        workingSet.setDescriptiveSystem(characters);
204
        workingSet.setGeoFilter(areas);
205

    
206
        conversation.commit();
207
        CdmStore.getService(IWorkingSetService.class).merge(workingSet, true);
208

    
209
        dirty.setDirty(false);
210
    }
211

    
212
    /** {@inheritDoc} */
213
    @PreDestroy
214
    public void dispose() {
215
        if (conversation != null) {
216
            conversation.close();
217
            conversation = null;
218
        }
219
        if(cdmEntitySession != null) {
220
            cdmEntitySession.dispose();
221
            cdmEntitySession = null;
222
        }
223
    }
224

    
225
    /** {@inheritDoc} */
226
    @Focus
227
    public void setFocus() {
228
        if (getConversationHolder() != null) {
229
            getConversationHolder().bind();
230
        }
231
        if(cdmEntitySession != null) {
232
            cdmEntitySession.bind();
233
        }
234
    }
235

    
236
    public Viewer getTaxonTreeViewer() {
237
        return composite.getTaxonNodeTree();
238
    }
239

    
240
    public void setDirty() {
241
        dirty.setDirty(true);
242
    }
243

    
244
    /**
245
     * {@inheritDoc}
246
     */
247
    @Override
248
    public void update(CdmDataChangeMap arg0) {
249
    }
250

    
251
    /**
252
     * {@inheritDoc}
253
     */
254
    @Override
255
    public ICdmEntitySession getCdmEntitySession() {
256
        return cdmEntitySession;
257
    }
258

    
259
    /**
260
     * {@inheritDoc}
261
     */
262
    @Override
263
    public Collection<WorkingSet> getRootEntities() {
264
        return null;
265
    }
266

    
267
    /**
268
     * {@inheritDoc}
269
     */
270
    @Override
271
    public Map<Object, List<String>> getPropertyPathsMap() {
272
        return null;
273
    }
274

    
275
    /**
276
     * {@inheritDoc}
277
     */
278
    @Override
279
    public ConversationHolder getConversationHolder() {
280
        return conversation;
281
    }
282

    
283
}
(3-3/4)