ref #6806 Correctly initialize WS taxon filter
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / workingSet / WorkingSetEditor.java
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 }