Project

General

Profile

Download (11.2 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.events.SelectionAdapter;
44
import org.eclipse.swt.widgets.Composite;
45
import org.eclipse.swt.widgets.Display;
46
import org.eclipse.swt.widgets.Shell;
47

    
48
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
49
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
50
import eu.etaxonomy.cdm.api.service.ITermService;
51
import eu.etaxonomy.cdm.api.service.IWorkingSetService;
52
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
53
import eu.etaxonomy.cdm.model.description.FeatureTree;
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.taxon.ITaxonTreeNode;
58
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
59
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
60
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
61
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
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
 * Editor for configuring WorkingSets
71
 * @author pplitzner
72
 * @since Nov 21, 2017
73
 *
74
 */
75
public class WorkingSetEditor implements IE4SavablePart, IConversationEnabled, ICdmEntitySessionEnabled,
76
IPartContentHasDetails, IDirtyMarkable {
77

    
78
    private WorkingSetComposite composite;
79

    
80
    private ConversationHolder conversation;
81

    
82
    private ICdmEntitySession cdmEntitySession;
83

    
84
    private WorkingSet workingSet;
85

    
86
    private final int dndOperations = DND.DROP_MOVE;
87

    
88
    @Inject
89
    private MDirtyable dirty;
90

    
91
    @Inject
92
    private ESelectionService selectionService;
93

    
94
    private ModifyListener labelModifyListener;
95

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

    
112
        composite = new WorkingSetComposite(parent, SWT.NONE);
113

    
114
        labelModifyListener = new ModifyListener() {
115
            @Override
116
            public void modifyText(ModifyEvent e) {
117
                workingSet.setLabel(composite.getTxt_label().getText());
118
                dirty.setDirty(true);
119
            }
120
        };
121
        composite.getRankMin().addSelectionChangedListener(event->dirty.setDirty(true));
122
        composite.getRankMax().addSelectionChangedListener(event->dirty.setDirty(true));
123

    
124
        composite.getBtnChooseArea().addSelectionListener(new SelectionAdapter() {
125

    
126
            @Override
127
            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
128
                NamedArea area = NamedAreaSelectionDialog.select(shell, null, null);
129
                if(area!=null){
130
                    composite.setArea(area);
131
                }
132
                dirty.setDirty(true);
133
            }
134
        });
135
        composite.getBtnRemoveArea().addSelectionListener(new SelectionAdapter() {
136

    
137
            @Override
138
            public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
139
                composite.removeArea();
140
                dirty.setDirty(true);
141
            }
142
        });
143

    
144
        composite.getFeatureTreeEditorComposite().init(null, null, e->selectionService.setSelection(e.getSelection()), null, null);
145

    
146
        //add drag'n'drop support
147
        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer()};
148
        composite.getTaxonNodeTree().addDropSupport(dndOperations, transfers, new TaxonNodeDropAdapter(this));
149

    
150
        composite.getTaxonNodeTree().getTree().addKeyListener(new KeyAdapter() {
151
            @Override
152
            public void keyPressed(KeyEvent e) {
153
                if(e.character==SWT.DEL){
154
                    IStructuredSelection selection = (IStructuredSelection) composite.getTaxonNodeTree().getSelection();
155
                    Iterator<TaxonNode> iterator = selection.iterator();
156
                    while(iterator.hasNext()){
157
                        TaxonNode taxonNode = iterator.next();
158
                        removeTaxonNode(taxonNode);
159
                    }
160
                }
161
            }
162
        });
163

    
164
    }
165

    
166
    public void init(UUID workingSetUuid) {
167
        this.workingSet = CdmStore.getService(IWorkingSetService.class).load(workingSetUuid);
168
        if(workingSet.getLabel()!=null){
169
            composite.getTxt_label().setText(workingSet.getLabel());
170
        }
171
        if(workingSet.getDescriptiveSystem()!=null){
172
            composite.setCharacters(workingSet.getDescriptiveSystem());
173
        }
174
        Rank maxRank = workingSet.getMaxRank();
175
        if(maxRank!=null){
176
            composite.setRankMax(maxRank);
177
        }
178
        Rank minRank = workingSet.getMinRank();
179
        if(minRank!=null){
180
            composite.setRankMin(minRank);
181
        }
182
        Set<NamedArea> geoFilter = workingSet.getGeoFilter();
183
        if(geoFilter!=null && !geoFilter.isEmpty()){
184
            composite.setArea(geoFilter.iterator().next());
185
        }
186
        Set<TaxonNode> taxonSubtreeFilter = workingSet.getTaxonSubtreeFilter();
187
        if(taxonSubtreeFilter!=null){
188
            composite.getTaxonNodeTree().setInput(taxonSubtreeFilter);
189
        }
190

    
191
        composite.getTxt_label().addModifyListener(labelModifyListener);
192
    }
193

    
194
    public void addTaxonNode(TaxonNode taxonNode){
195
        //load into WS editor session
196
        taxonNode = getCdmEntitySession().load(taxonNode, false);
197
        Viewer taxonTreeViewer = getTaxonTreeViewer();
198
        Object input = taxonTreeViewer.getInput();
199
        Collection<TaxonNode> treeNodes;
200
        if(input==null){
201
            treeNodes = new ArrayList<>();
202
        }
203
        else{
204
            treeNodes = (Collection<TaxonNode>) input;
205
        }
206
        treeNodes.add(taxonNode);
207
        taxonTreeViewer.setInput(treeNodes);
208
        dirty.setDirty(true);
209
    }
210

    
211
    private void removeTaxonNode(TaxonNode taxonNode){
212
        Viewer taxonTreeViewer = getTaxonTreeViewer();
213
        Collection<TaxonNode> input = (Collection<TaxonNode>) taxonTreeViewer.getInput();
214
        input.remove(taxonNode);
215
        workingSet.removeTaxonSubtree(taxonNode);
216
        taxonTreeViewer.setInput(input);
217
        dirty.setDirty(true);
218
    }
219

    
220
    @Persist
221
    @Override
222
    public void save(IProgressMonitor monitor) {
223
        NamedArea area = composite.getArea();
224
        Set<NamedArea> areas = new HashSet<>();
225
        if(area!=null){
226
            areas.add(area);
227
        }
228
        Object input = composite.getTaxonNodeTree().getInput();
229
        if(input!=null){
230
            workingSet.setTaxonSubtreeFilter(new HashSet<>());//clear existing filter
231
            Collection<ITaxonTreeNode> taxonNodes = (Collection<ITaxonTreeNode>) input;
232
            for (ITaxonTreeNode taxonTreeNode : taxonNodes) {
233
                if(taxonTreeNode instanceof TaxonNode){
234
                    TaxonNode taxonNode = (TaxonNode)taxonTreeNode;
235
                    workingSet.addTaxonSubtree(taxonNode);
236
                }
237
            }
238
        }
239
        FeatureTree characters = composite.getCharacters();
240
        if(characters!=null){
241
            //save characters because they can be modified in this editor
242
            characters.getDistinctFeatures().forEach(character->CdmStore.getService(ITermService.class).merge(character,true));
243
        }
244

    
245

    
246
        DefinedTermBase rankMaxSelection = composite.getRankMax().getSelection();
247
        Rank rankMax = null;
248
        if(rankMaxSelection instanceof Rank){
249
            rankMax = (Rank) rankMaxSelection;
250
        }
251
        DefinedTermBase rankMinSelection = composite.getRankMin().getSelection();
252
        Rank rankMin = null;
253
        if(rankMinSelection instanceof Rank){
254
            rankMin = (Rank) rankMinSelection;
255
        }
256

    
257
        workingSet.setMaxRank(rankMax);
258
        workingSet.setMinRank(rankMin);
259
        workingSet.setDescriptiveSystem(characters);
260
        workingSet.setGeoFilter(areas);
261

    
262
        conversation.commit();
263
        CdmStore.getService(IWorkingSetService.class).merge(workingSet, true);
264

    
265
        dirty.setDirty(false);
266
    }
267

    
268
    @PreDestroy
269
    public void dispose() {
270
        if (conversation != null) {
271
            conversation.close();
272
            conversation = null;
273
        }
274
        if(cdmEntitySession != null) {
275
            cdmEntitySession.dispose();
276
            cdmEntitySession = null;
277
        }
278
        dirty.setDirty(false);
279
    }
280

    
281
    @Focus
282
    public void setFocus() {
283
        if (getConversationHolder() != null) {
284
            getConversationHolder().bind();
285
        }
286
        if(cdmEntitySession != null) {
287
            cdmEntitySession.bind();
288
        }
289
    }
290

    
291
    public Viewer getTaxonTreeViewer() {
292
        return composite.getTaxonNodeTree();
293
    }
294

    
295
    public WorkingSet getWorkingSet() {
296
        return workingSet;
297
    }
298

    
299
    @Override
300
    public void update(CdmDataChangeMap arg0) {
301
    }
302

    
303
    @Override
304
    public ICdmEntitySession getCdmEntitySession() {
305
        return cdmEntitySession;
306
    }
307

    
308
    @Override
309
    public Collection<WorkingSet> getRootEntities() {
310
        return null;
311
    }
312

    
313
    @Override
314
    public Map<Object, List<String>> getPropertyPathsMap() {
315
        return null;
316
    }
317

    
318
    @Override
319
    public ConversationHolder getConversationHolder() {
320
        return conversation;
321
    }
322

    
323
    @Override
324
    public void changed(Object element) {
325
        dirty.setDirty(true);
326
    }
327

    
328
    @Override
329
    public void forceDirty() {
330
        dirty.setDirty(true);
331
    }
332

    
333
}
(3-3/4)