Project

General

Profile

Download (11.1 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.ArrayList;
12
import java.util.Collection;
13
import java.util.HashSet;
14
import java.util.Iterator;
15
import java.util.List;
16
import java.util.Map;
17
import java.util.Set;
18
import java.util.UUID;
19

    
20
import javax.annotation.PostConstruct;
21
import javax.annotation.PreDestroy;
22
import javax.inject.Inject;
23
import javax.inject.Named;
24

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

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

    
69
/**
70
 * @author pplitzner
71
 * @since Nov 21, 2017
72
 *
73
 */
74
public class WorkingSetEditor implements IE4SavablePart, IConversationEnabled, ICdmEntitySessionEnabled{
75

    
76
    private WorkingSetComposite composite;
77

    
78
    private ConversationHolder conversation;
79

    
80
    private ICdmEntitySession cdmEntitySession;
81

    
82
    private WorkingSet workingSet;
83

    
84
    private final int dndOperations = DND.DROP_MOVE;
85

    
86
    @Inject
87
    private MDirtyable dirty;
88

    
89
    private ModifyListener labelModifyListener;
90

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

    
107
        composite = new WorkingSetComposite(parent, SWT.NONE);
108

    
109
        labelModifyListener = new ModifyListener() {
110
            @Override
111
            public void modifyText(ModifyEvent e) {
112
                dirty.setDirty(true);
113
            }
114
        };
115
        composite.getRankMin().addSelectionChangedListener(event->dirty.setDirty(true));
116
        composite.getRankMax().addSelectionChangedListener(event->dirty.setDirty(true));
117

    
118
        composite.getTextAreaText().addListener(SWT.MouseDown, event-> {
119
            NamedArea area = NamedAreaSelectionDialog.select(shell, null, null);
120
            if(area!=null){
121
                composite.setArea(area);
122
            }
123
            dirty.setDirty(true);
124
        });
125

    
126
        composite.getFeatureTreeEditorComposite().init(null, null, null, null);
127

    
128
        //add drag'n'drop support
129
        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer()};
130
        composite.getTaxonNodeTree().addDropSupport(dndOperations, transfers, new TaxonNodeDropAdapter(this));
131

    
132
        composite.getTaxonNodeTree().getTree().addKeyListener(new KeyAdapter() {
133
            @Override
134
            public void keyPressed(KeyEvent e) {
135
                if(e.character==SWT.DEL){
136
                    IStructuredSelection selection = (IStructuredSelection) composite.getTaxonNodeTree().getSelection();
137
                    Iterator<TaxonNode> iterator = selection.iterator();
138
                    while(iterator.hasNext()){
139
                        TaxonNode taxonNode = iterator.next();
140
                        removeTaxonNode(taxonNode);
141
                    }
142
                }
143
            }
144
        });
145

    
146
    }
147

    
148
    public void init(UUID workingSetUuid) {
149
        this.workingSet = CdmStore.getService(IWorkingSetService.class).load(workingSetUuid);
150
        if(workingSet.getTitleCache()!=null){
151
            composite.getTxt_label().setText(workingSet.getTitleCache());
152
        }
153
        if(workingSet.getDescriptiveSystem()!=null){
154
            composite.setCharacters(workingSet.getDescriptiveSystem());
155
        }
156
        Rank maxRank = workingSet.getMaxRank();
157
        if(maxRank!=null){
158
            composite.setRankMax(maxRank);
159
        }
160
        Rank minRank = workingSet.getMinRank();
161
        if(minRank!=null){
162
            composite.setRankMin(minRank);
163
        }
164
        Set<NamedArea> geoFilter = workingSet.getGeoFilter();
165
        if(geoFilter!=null && !geoFilter.isEmpty()){
166
            composite.setArea(geoFilter.iterator().next());
167
        }
168
        Set<TaxonNode> taxonSubtreeFilter = workingSet.getTaxonSubtreeFilter();
169
        if(taxonSubtreeFilter!=null){
170
            composite.getTaxonNodeTree().setInput(taxonSubtreeFilter);
171
        }
172

    
173
        composite.getTxt_label().addModifyListener(labelModifyListener);
174
    }
175

    
176
    public void addTaxonNode(TaxonNode taxonNode){
177
        //load into WS editor session
178
        taxonNode = getCdmEntitySession().load(taxonNode, false);
179
        Viewer taxonTreeViewer = getTaxonTreeViewer();
180
        Object input = taxonTreeViewer.getInput();
181
        Collection<TaxonNode> treeNodes;
182
        if(input==null){
183
            treeNodes = new ArrayList<>();
184
        }
185
        else{
186
            treeNodes = (Collection<TaxonNode>) input;
187
        }
188
        treeNodes.add(taxonNode);
189
        taxonTreeViewer.setInput(treeNodes);
190
        dirty.setDirty(true);
191
    }
192

    
193
    private void removeTaxonNode(TaxonNode taxonNode){
194
        Viewer taxonTreeViewer = getTaxonTreeViewer();
195
        Collection<TaxonNode> input = (Collection<TaxonNode>) taxonTreeViewer.getInput();
196
        input.remove(taxonNode);
197
        taxonTreeViewer.setInput(input);
198
        dirty.setDirty(true);
199
    }
200

    
201
    /**
202
     * {@inheritDoc}
203
     */
204
    @Persist
205
    @Override
206
    public void save(IProgressMonitor monitor) {
207
        NamedArea area = composite.getArea();
208
        Set<NamedArea> areas = new HashSet<>();
209
        if(area!=null){
210
            areas.add(area);
211
        }
212
        Object input = composite.getTaxonNodeTree().getInput();
213
        if(input!=null){
214
            Collection<ITaxonTreeNode> taxonNodes = (Collection<ITaxonTreeNode>) input;
215
            for (ITaxonTreeNode taxonTreeNode : taxonNodes) {
216
                if(taxonTreeNode instanceof TaxonNode){
217
                    TaxonNode taxonNode = (TaxonNode)taxonTreeNode;
218
                    workingSet.addTaxonSubtree(taxonNode);
219
                    Set<NamedArea> descriptions;
220
                    if(taxonNode!=null && taxonNode.getTaxon()!=null){
221
                        Taxon taxon = HibernateProxyHelper.deproxy(taxonNode.getTaxon(), Taxon.class);
222
                        Collection<SpecimenOrObservationBase> specimens = CdmStore.getService(IOccurrenceService.class).listByAssociatedTaxon(SpecimenOrObservationBase.class, null, taxon, null, null, null, null, null);
223
                        for (SpecimenOrObservationBase specimen : specimens) {
224
                            Set<SpecimenDescription> specimenDescriptions = specimen.getSpecimenDescriptions();
225
                            for (SpecimenDescription specimenDescription : specimenDescriptions) {
226
                                workingSet.addDescription(specimenDescription);
227
                            }
228
                        }
229
                    }
230
                }
231
            }
232
        }
233
        FeatureTree characters = composite.getCharacters();
234
        DefinedTermBase rankMaxSelection = composite.getRankMax().getSelection();
235
        Rank rankMax = null;
236
        if(rankMaxSelection instanceof Rank){
237
            rankMax = (Rank) rankMaxSelection;
238
        }
239
        DefinedTermBase rankMinSelection = composite.getRankMin().getSelection();
240
        Rank rankMin = null;
241
        if(rankMinSelection instanceof Rank){
242
            rankMin = (Rank) rankMinSelection;
243
        }
244

    
245
        workingSet.setMaxRank(rankMax);
246
        workingSet.setMinRank(rankMin);
247
        workingSet.setDescriptiveSystem(characters);
248
        workingSet.setGeoFilter(areas);
249

    
250
        conversation.commit();
251
        CdmStore.getService(IWorkingSetService.class).merge(workingSet, true);
252

    
253
        dirty.setDirty(false);
254
    }
255

    
256
    /** {@inheritDoc} */
257
    @PreDestroy
258
    public void dispose() {
259
        if (conversation != null) {
260
            conversation.close();
261
            conversation = null;
262
        }
263
        if(cdmEntitySession != null) {
264
            cdmEntitySession.dispose();
265
            cdmEntitySession = null;
266
        }
267
    }
268

    
269
    /** {@inheritDoc} */
270
    @Focus
271
    public void setFocus() {
272
        if (getConversationHolder() != null) {
273
            getConversationHolder().bind();
274
        }
275
        if(cdmEntitySession != null) {
276
            cdmEntitySession.bind();
277
        }
278
    }
279

    
280
    public Viewer getTaxonTreeViewer() {
281
        return composite.getTaxonNodeTree();
282
    }
283

    
284
    /**
285
     * {@inheritDoc}
286
     */
287
    @Override
288
    public void update(CdmDataChangeMap arg0) {
289
    }
290

    
291
    /**
292
     * {@inheritDoc}
293
     */
294
    @Override
295
    public ICdmEntitySession getCdmEntitySession() {
296
        return cdmEntitySession;
297
    }
298

    
299
    /**
300
     * {@inheritDoc}
301
     */
302
    @Override
303
    public Collection<WorkingSet> getRootEntities() {
304
        return null;
305
    }
306

    
307
    /**
308
     * {@inheritDoc}
309
     */
310
    @Override
311
    public Map<Object, List<String>> getPropertyPathsMap() {
312
        return null;
313
    }
314

    
315
    /**
316
     * {@inheritDoc}
317
     */
318
    @Override
319
    public ConversationHolder getConversationHolder() {
320
        return conversation;
321
    }
322

    
323
}
(3-3/4)