Merge branch 'release/5.1.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / descriptiveDataSet / DescriptiveDataSetNavigator.java
1 // $Id$
2 /**
3 * Copyright (C) 2017 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.editor.descriptiveDataSet;
11
12 import java.util.Collection;
13 import java.util.List;
14 import java.util.Map;
15
16 import javax.annotation.PostConstruct;
17 import javax.annotation.PreDestroy;
18 import javax.inject.Inject;
19
20 import org.eclipse.core.runtime.IProgressMonitor;
21 import org.eclipse.e4.ui.di.Focus;
22 import org.eclipse.e4.ui.model.application.MApplication;
23 import org.eclipse.e4.ui.services.EMenuService;
24 import org.eclipse.e4.ui.workbench.modeling.EModelService;
25 import org.eclipse.e4.ui.workbench.modeling.EPartService;
26 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
27 import org.eclipse.jface.viewers.ArrayContentProvider;
28 import org.eclipse.jface.viewers.DoubleClickEvent;
29 import org.eclipse.jface.viewers.IDoubleClickListener;
30 import org.eclipse.jface.viewers.ISelection;
31 import org.eclipse.jface.viewers.ISelectionChangedListener;
32 import org.eclipse.jface.viewers.IStructuredSelection;
33 import org.eclipse.jface.viewers.LabelProvider;
34 import org.eclipse.jface.viewers.ListViewer;
35 import org.eclipse.swt.widgets.Composite;
36 import org.eclipse.ui.IMemento;
37
38 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
39 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
40 import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
41 import eu.etaxonomy.cdm.model.common.CdmBase;
42 import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
43 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
44 import eu.etaxonomy.taxeditor.editor.EditorUtil;
45 import eu.etaxonomy.taxeditor.model.IContextListener;
46 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
47 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
48 import eu.etaxonomy.taxeditor.store.CdmStore;
49
50 /**
51 * @author pplitzner
52 * @date 12.12.2017
53 *
54 */
55 public class DescriptiveDataSetNavigator implements IConversationEnabled, ICdmEntitySessionEnabled, IContextListener{
56
57 private ListViewer viewer;
58
59 @Inject
60 private ESelectionService selService;
61
62 private ISelectionChangedListener selectionChangedListener;
63
64 private ConversationHolder conversation;
65
66 private ICdmEntitySession cdmEntitySession;
67
68 private List<DescriptiveDataSet> descriptiveDataSets;
69
70 public DescriptiveDataSetNavigator() {
71 CdmStore.getContextManager().addContextListener(this);
72 }
73
74 @PostConstruct
75 public void create(Composite parent, EPartService partService, EModelService modelService, MApplication application,
76 EMenuService menuService){
77 viewer = new ListViewer(parent);
78 viewer.setContentProvider(new ArrayContentProvider());
79 viewer.setLabelProvider(new LabelProvider(){
80 /**
81 * {@inheritDoc}
82 */
83 @Override
84 public String getText(Object element) {
85 if(element instanceof DescriptiveDataSet){
86 return ((DescriptiveDataSet) element).getLabel();
87 }
88 return super.getText(element);
89 }
90 });
91
92 viewer.addDoubleClickListener(new IDoubleClickListener() {
93
94 @Override
95 public void doubleClick(DoubleClickEvent event) {
96 ISelection selection = event.getSelection();
97 if(selection instanceof IStructuredSelection){
98 DescriptiveDataSet descriptiveDataSetUuid = (DescriptiveDataSet) ((IStructuredSelection) selection).getFirstElement();
99 EditorUtil.openDescriptiveDataSetEditor(descriptiveDataSetUuid.getUuid(), modelService, partService, application);
100 }
101 }
102 });
103
104 //propagate selection
105 selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
106 viewer.addSelectionChangedListener(selectionChangedListener);
107
108 //create context menu
109 menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.editor.popupmenu.descriptiveDataSetNavigator"); //$NON-NLS-1$
110
111 init();
112 }
113
114 public void init(){
115 if (CdmStore.isActive()){
116 if(conversation == null) {
117 conversation = CdmStore.createConversation();
118 }
119 if(cdmEntitySession == null){
120 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
121 }
122 descriptiveDataSets = CdmStore.getService(IDescriptiveDataSetService.class).list(DescriptiveDataSet.class, null, null, null, null);
123 viewer.setInput(descriptiveDataSets);
124 }
125 }
126
127 public void addDescriptiveDataSet(DescriptiveDataSet descriptiveDataSetSet){
128 descriptiveDataSets.add(descriptiveDataSetSet);
129 refresh();
130 }
131
132 public void removeDescriptiveDataSet(DescriptiveDataSet descriptiveDataSetSet){
133 descriptiveDataSets.remove(descriptiveDataSetSet);
134 refresh();
135 }
136
137 public void refresh(){
138 refresh(false);
139 }
140
141 public void refresh(boolean reloadDescriptiveDataSets){
142 if(reloadDescriptiveDataSets){
143 cdmEntitySession.dispose();
144 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
145 IDescriptiveDataSetService service = CdmStore.getService(IDescriptiveDataSetService.class);
146 descriptiveDataSets = service.list(DescriptiveDataSet.class, null, null, null, null);
147 }
148 viewer.setInput(descriptiveDataSets);
149 viewer.refresh();
150 }
151
152 /**
153 * {@inheritDoc}
154 */
155 @Override
156 public void update(CdmDataChangeMap arg0) {
157 }
158
159 /**
160 * {@inheritDoc}
161 */
162 @Override
163 public ICdmEntitySession getCdmEntitySession() {
164 return cdmEntitySession;
165 }
166
167 /**
168 * {@inheritDoc}
169 */
170 @Override
171 public <T extends CdmBase> Collection<T> getRootEntities() {
172 return null;
173 }
174
175 /**
176 * {@inheritDoc}
177 */
178 @Override
179 public Map<Object, List<String>> getPropertyPathsMap() {
180 return null;
181 }
182
183 /**
184 * {@inheritDoc}
185 */
186 @Override
187 public ConversationHolder getConversationHolder() {
188 return conversation;
189 }
190
191 /** {@inheritDoc} */
192 @PreDestroy
193 public void dispose() {
194 if (conversation != null) {
195 conversation.close();
196 conversation = null;
197 }
198 if(cdmEntitySession != null) {
199 cdmEntitySession.dispose();
200 cdmEntitySession = null;
201 }
202 }
203
204 /** {@inheritDoc} */
205 @Focus
206 public void setFocus() {
207 if (getConversationHolder() != null) {
208 getConversationHolder().bind();
209 }
210 if(cdmEntitySession != null) {
211 cdmEntitySession.bind();
212 }
213 }
214
215 /**
216 * {@inheritDoc}
217 */
218 @Override
219 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
220 // TODO Auto-generated method stub
221
222 }
223
224 /**
225 * {@inheritDoc}
226 */
227 @Override
228 public void contextStop(IMemento memento, IProgressMonitor monitor) {
229 }
230
231 /**
232 * {@inheritDoc}
233 */
234 @Override
235 public void contextStart(IMemento memento, IProgressMonitor monitor) {
236 if(viewer!=null && viewer.getControl()!=null && !viewer.getControl().isDisposed()){
237 init();
238 }
239 }
240
241 /**
242 * {@inheritDoc}
243 */
244 @Override
245 public void contextRefresh(IProgressMonitor monitor) {
246 }
247
248 /**
249 * {@inheritDoc}
250 */
251 @Override
252 public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
253 }
254
255 }