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
        taxonTreeViewer.setInput(input);
216
        dirty.setDirty(true);
217
    }
218

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

    
244

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

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

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

    
264
        dirty.setDirty(false);
265
    }
266

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

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

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

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

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

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

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

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

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

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

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

    
332
}
(3-3/4)