fix #8661 "New DataSet" should ask for label and then open the dataset
[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.core.di.annotations.Optional;
22 import org.eclipse.e4.ui.di.Focus;
23 import org.eclipse.e4.ui.di.UIEventTopic;
24 import org.eclipse.e4.ui.model.application.MApplication;
25 import org.eclipse.e4.ui.services.EMenuService;
26 import org.eclipse.e4.ui.workbench.modeling.EModelService;
27 import org.eclipse.e4.ui.workbench.modeling.EPartService;
28 import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
29 import org.eclipse.jface.viewers.ArrayContentProvider;
30 import org.eclipse.jface.viewers.DoubleClickEvent;
31 import org.eclipse.jface.viewers.IDoubleClickListener;
32 import org.eclipse.jface.viewers.ISelection;
33 import org.eclipse.jface.viewers.ISelectionChangedListener;
34 import org.eclipse.jface.viewers.IStructuredSelection;
35 import org.eclipse.jface.viewers.LabelProvider;
36 import org.eclipse.jface.viewers.ListViewer;
37 import org.eclipse.swt.widgets.Composite;
38 import org.eclipse.ui.IMemento;
39
40 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
41 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
42 import eu.etaxonomy.cdm.api.service.IDescriptiveDataSetService;
43 import eu.etaxonomy.cdm.model.common.CdmBase;
44 import eu.etaxonomy.cdm.model.description.DescriptiveDataSet;
45 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
46 import eu.etaxonomy.taxeditor.editor.EditorUtil;
47 import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
48 import eu.etaxonomy.taxeditor.model.IContextListener;
49 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
50 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
51 import eu.etaxonomy.taxeditor.store.CdmStore;
52
53 /**
54 * @author pplitzner
55 * @date 12.12.2017
56 *
57 */
58 public class DescriptiveDataSetNavigator implements IConversationEnabled, ICdmEntitySessionEnabled, IContextListener{
59
60 private ListViewer viewer;
61
62 @Inject
63 private ESelectionService selService;
64
65 private ISelectionChangedListener selectionChangedListener;
66
67 private ConversationHolder conversation;
68
69 private ICdmEntitySession cdmEntitySession;
70
71 private List<DescriptiveDataSet> descriptiveDataSets;
72
73 public DescriptiveDataSetNavigator() {
74 CdmStore.getContextManager().addContextListener(this);
75 }
76
77 @PostConstruct
78 public void create(Composite parent, EPartService partService, EModelService modelService, MApplication application,
79 EMenuService menuService){
80 viewer = new ListViewer(parent);
81 viewer.setContentProvider(new ArrayContentProvider());
82 viewer.setLabelProvider(new LabelProvider(){
83 /**
84 * {@inheritDoc}
85 */
86 @Override
87 public String getText(Object element) {
88 if(element instanceof DescriptiveDataSet){
89 return ((DescriptiveDataSet) element).getLabel();
90 }
91 return super.getText(element);
92 }
93 });
94
95 viewer.addDoubleClickListener(new IDoubleClickListener() {
96
97 @Override
98 public void doubleClick(DoubleClickEvent event) {
99 ISelection selection = event.getSelection();
100 if(selection instanceof IStructuredSelection){
101 DescriptiveDataSet descriptiveDataSetUuid = (DescriptiveDataSet) ((IStructuredSelection) selection).getFirstElement();
102 if(descriptiveDataSetUuid!=null){
103 EditorUtil.openDescriptiveDataSetEditor(descriptiveDataSetUuid.getUuid(), modelService, partService, application);
104 }
105 }
106 }
107 });
108
109 //propagate selection
110 selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
111 viewer.addSelectionChangedListener(selectionChangedListener);
112
113 //create context menu
114 menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.editor.popupmenu.descriptiveDataSetNavigator"); //$NON-NLS-1$
115
116 init();
117 }
118
119 public void init(){
120 if (CdmStore.isActive()){
121 if(conversation == null) {
122 conversation = CdmStore.createConversation();
123 }
124 if(cdmEntitySession == null){
125 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
126 }
127 descriptiveDataSets = CdmStore.getService(IDescriptiveDataSetService.class).list(DescriptiveDataSet.class, null, null, null, null);
128 viewer.setInput(descriptiveDataSets);
129 }
130 }
131
132 public void addDescriptiveDataSet(DescriptiveDataSet descriptiveDataSetSet){
133 descriptiveDataSets.add(descriptiveDataSetSet);
134 refresh();
135 }
136
137 public void removeDescriptiveDataSet(DescriptiveDataSet descriptiveDataSetSet){
138 descriptiveDataSets.remove(descriptiveDataSetSet);
139 refresh();
140 }
141
142 public void refresh(){
143 refresh(false);
144 }
145
146 public void refresh(boolean reloadDescriptiveDataSets){
147 if(reloadDescriptiveDataSets){
148 cdmEntitySession.dispose();
149 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
150 IDescriptiveDataSetService service = CdmStore.getService(IDescriptiveDataSetService.class);
151 descriptiveDataSets = service.list(DescriptiveDataSet.class, null, null, null, null);
152 }
153 viewer.setInput(descriptiveDataSets);
154 viewer.refresh();
155 }
156
157 @Inject
158 @Optional
159 private void updateView(@UIEventTopic(WorkbenchEventConstants.REFRESH_DATASET_NAVIGATOR) DescriptiveDataSet dataSet) {
160 DescriptiveDataSet load = cdmEntitySession.load(dataSet, true);
161 viewer.update(load, null);
162 refresh();
163 }
164
165 /**
166 * {@inheritDoc}
167 */
168 @Override
169 public void update(CdmDataChangeMap arg0) {
170 }
171
172 /**
173 * {@inheritDoc}
174 */
175 @Override
176 public ICdmEntitySession getCdmEntitySession() {
177 return cdmEntitySession;
178 }
179
180 /**
181 * {@inheritDoc}
182 */
183 @Override
184 public <T extends CdmBase> Collection<T> getRootEntities() {
185 return null;
186 }
187
188 /**
189 * {@inheritDoc}
190 */
191 @Override
192 public Map<Object, List<String>> getPropertyPathsMap() {
193 return null;
194 }
195
196 /**
197 * {@inheritDoc}
198 */
199 @Override
200 public ConversationHolder getConversationHolder() {
201 return conversation;
202 }
203
204 /** {@inheritDoc} */
205 @PreDestroy
206 public void dispose() {
207 if (conversation != null) {
208 conversation.close();
209 conversation = null;
210 }
211 if(cdmEntitySession != null) {
212 cdmEntitySession.dispose();
213 cdmEntitySession = null;
214 }
215 }
216
217 /** {@inheritDoc} */
218 @Focus
219 public void setFocus() {
220 if (getConversationHolder() != null) {
221 getConversationHolder().bind();
222 }
223 if(cdmEntitySession != null) {
224 cdmEntitySession.bind();
225 }
226 }
227
228 /**
229 * {@inheritDoc}
230 */
231 @Override
232 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
233 // TODO Auto-generated method stub
234
235 }
236
237 /**
238 * {@inheritDoc}
239 */
240 @Override
241 public void contextStop(IMemento memento, IProgressMonitor monitor) {
242 }
243
244 /**
245 * {@inheritDoc}
246 */
247 @Override
248 public void contextStart(IMemento memento, IProgressMonitor monitor) {
249 if(viewer!=null && viewer.getControl()!=null && !viewer.getControl().isDisposed()){
250 init();
251 }
252 }
253
254 /**
255 * {@inheritDoc}
256 */
257 @Override
258 public void contextRefresh(IProgressMonitor monitor) {
259 }
260
261 /**
262 * {@inheritDoc}
263 */
264 @Override
265 public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
266 }
267
268 }