Project

General

Profile

Download (10.9 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.e4.ui.workbench.modeling.ESelectionService;
33
import org.eclipse.jface.util.LocalSelectionTransfer;
34
import org.eclipse.jface.viewers.IStructuredSelection;
35
import org.eclipse.jface.viewers.Viewer;
36
import org.eclipse.swt.SWT;
37
import org.eclipse.swt.dnd.DND;
38
import org.eclipse.swt.dnd.Transfer;
39
import org.eclipse.swt.events.KeyAdapter;
40
import org.eclipse.swt.events.KeyEvent;
41
import org.eclipse.swt.events.ModifyEvent;
42
import org.eclipse.swt.events.ModifyListener;
43
import org.eclipse.swt.widgets.Composite;
44
import org.eclipse.swt.widgets.Display;
45
import org.eclipse.swt.widgets.Shell;
46

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

    
68
/**
69
 * @author pplitzner
70
 * @since Nov 21, 2017
71
 *
72
 */
73
public class WorkingSetEditor implements IE4SavablePart, IConversationEnabled, ICdmEntitySessionEnabled,
74
IPartContentHasDetails, IDirtyMarkable {
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
    @Inject
90
    private ESelectionService selectionService;
91

    
92
    private ModifyListener labelModifyListener;
93

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

    
110
        composite = new WorkingSetComposite(parent, SWT.NONE);
111

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

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

    
129
        composite.getFeatureTreeEditorComposite().init(null, null, e->selectionService.setSelection(e.getSelection()), null);
130

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

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

    
149
    }
150

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

    
176
        composite.getTxt_label().addModifyListener(labelModifyListener);
177
    }
178

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

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

    
204
    /**
205
     * {@inheritDoc}
206
     */
207
    @Persist
208
    @Override
209
    public void save(IProgressMonitor monitor) {
210
        NamedArea area = composite.getArea();
211
        Set<NamedArea> areas = new HashSet<>();
212
        if(area!=null){
213
            areas.add(area);
214
        }
215
        Object input = composite.getTaxonNodeTree().getInput();
216
        if(input!=null){
217
            workingSet.setTaxonSubtreeFilter(new HashSet<>());//clear existing filter
218
            Collection<ITaxonTreeNode> taxonNodes = (Collection<ITaxonTreeNode>) input;
219
            for (ITaxonTreeNode taxonTreeNode : taxonNodes) {
220
                if(taxonTreeNode instanceof TaxonNode){
221
                    TaxonNode taxonNode = (TaxonNode)taxonTreeNode;
222
                    workingSet.addTaxonSubtree(taxonNode);
223
                }
224
            }
225
        }
226
        FeatureTree characters = composite.getCharacters();
227
        if(characters!=null){
228
            //save characters because they can be modified in this editor
229
            characters.getDistinctFeatures().forEach(character->CdmStore.getService(ITermService.class).merge(character,true));
230
        }
231

    
232

    
233
        DefinedTermBase rankMaxSelection = composite.getRankMax().getSelection();
234
        Rank rankMax = null;
235
        if(rankMaxSelection instanceof Rank){
236
            rankMax = (Rank) rankMaxSelection;
237
        }
238
        DefinedTermBase rankMinSelection = composite.getRankMin().getSelection();
239
        Rank rankMin = null;
240
        if(rankMinSelection instanceof Rank){
241
            rankMin = (Rank) rankMinSelection;
242
        }
243

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

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

    
252
        dirty.setDirty(false);
253
    }
254

    
255
    /** {@inheritDoc} */
256
    @PreDestroy
257
    public void dispose() {
258
        if (conversation != null) {
259
            conversation.close();
260
            conversation = null;
261
        }
262
        if(cdmEntitySession != null) {
263
            cdmEntitySession.dispose();
264
            cdmEntitySession = null;
265
        }
266
        dirty.setDirty(false);
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
    /**
324
     * {@inheritDoc}
325
     */
326
    @Override
327
    public void changed(Object element) {
328
        dirty.setDirty(true);
329
    }
330

    
331
    /**
332
     * {@inheritDoc}
333
     */
334
    @Override
335
    public void forceDirty() {
336
        dirty.setDirty(true);
337
    }
338

    
339
}
(3-3/4)