8949898d79629cff51e6323b1c776b9957586812
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / view / derivate / DerivateView.java
1 package eu.etaxonomy.taxeditor.editor.view.derivate;
2
3 import java.util.Collection;
4 import java.util.HashSet;
5 import java.util.Map.Entry;
6 import java.util.Set;
7
8 import org.eclipse.core.runtime.IProgressMonitor;
9 import org.eclipse.jface.action.MenuManager;
10 import org.eclipse.jface.util.LocalSelectionTransfer;
11 import org.eclipse.jface.viewers.AbstractTreeViewer;
12 import org.eclipse.jface.viewers.StructuredSelection;
13 import org.eclipse.jface.viewers.TreeNode;
14 import org.eclipse.jface.viewers.TreeViewer;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.dnd.DND;
17 import org.eclipse.swt.dnd.Transfer;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.swt.widgets.Control;
20 import org.eclipse.swt.widgets.Menu;
21 import org.eclipse.swt.widgets.Tree;
22 import org.eclipse.ui.IEditorInput;
23 import org.eclipse.ui.IEditorPart;
24 import org.eclipse.ui.IEditorSite;
25 import org.eclipse.ui.IMemento;
26 import org.eclipse.ui.PartInitException;
27 import org.eclipse.ui.part.EditorPart;
28
29 import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
30 import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
31 import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
32 import eu.etaxonomy.cdm.model.molecular.Sequence;
33 import eu.etaxonomy.cdm.model.molecular.SingleRead;
34 import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
35 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
36 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
37 import eu.etaxonomy.taxeditor.model.IContextListener;
38 import eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider;
39 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
40 import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
41 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
42 import eu.etaxonomy.taxeditor.store.CdmStore;
43 import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
44
45 /**
46 * Displays the derivate hierarchy of all derivates having one single {@link FieldUnit} as root.
47 *
48 */
49 public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider,
50 IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IContextListener {
51
52 /**
53 * Key used for storing a single DerivateView in a memento
54 */
55 private static final String DERIVATE_VIEW_MEMENTO_KEY = "derivateView";
56
57 /**
58 * Key to to group mementos for every single DerivateView
59 */
60 private static final String DERIVATE_VIEWS_MEMENTO_KEY = "derivateViews";
61
62 public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
63
64 private ConversationHolder conversation;
65
66 private TreeViewer viewer;
67
68 private boolean isDirty;
69
70 private final int dndOperations = DND.DROP_MOVE;
71
72 private DerivateLabelProvider labelProvider;
73
74 private Set<SingleRead> multiLinkSingleReads;
75
76 /**
77 * Default constructor
78 */
79 public DerivateView() {
80 CdmStore.getContextManager().addContextListener(this);
81 }
82
83 /* (non-Javadoc)
84 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
85 */
86 @Override
87 public void createPartControl(Composite parent) {
88 viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
89 viewer.setContentProvider(new DerivateContentProvider());
90 labelProvider = new DerivateLabelProvider();
91 labelProvider.setConversation(conversation);
92 viewer.setLabelProvider(labelProvider);
93 viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
94 // Propagate selection from viewer
95 getSite().setSelectionProvider(viewer);
96
97 //create context menu
98 MenuManager menuManager = new MenuManager();
99 getSite().registerContextMenu(menuManager, viewer);
100 Control control = viewer.getControl();
101 Menu menu = menuManager.createContextMenu(control);
102 control.setMenu(menu);
103
104 generateMultiLinkSingleReads();
105 labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
106 IEditorInput editorInput = getEditorInput();
107 viewer.setInput(editorInput);
108 if(editorInput instanceof DerivateViewEditorInput){
109 SpecimenOrObservationBase<?> specimen = ((DerivateViewEditorInput) editorInput).getDerivate();
110 SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
111 setPartName(labelProvider.getDerivateText(rootElement));
112 viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
113 }
114
115 //add drag'n'drop support
116 Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),};
117 viewer.addDragSupport(dndOperations, transfers, new DerivateDragListener(this));
118 viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this));
119 }
120
121 /* (non-Javadoc)
122 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
123 */
124 @Override
125 public void doSave(IProgressMonitor monitor) {
126 monitor.beginTask("Saving Derivates", 3);
127 if (!conversation.isBound()) {
128 conversation.bind();
129 }
130 monitor.worked(1);
131
132 // commit the conversation and start a new transaction immediately
133 conversation.commit(true);
134 monitor.worked(1);
135
136 this.setDirty(false);
137 monitor.worked(1);
138 monitor.done();
139 firePropertyChange(PROP_DIRTY);
140 refreshTree();
141 }
142
143 /* (non-Javadoc)
144 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
145 */
146 @Override
147 public void doSaveAs() {
148 }
149
150 /* (non-Javadoc)
151 * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
152 */
153 @Override
154 public String getTitleToolTip() {
155 return "Derivate View";
156 }
157
158 /* (non-Javadoc)
159 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
160 */
161 @Override
162 public void init(IEditorSite site, IEditorInput input) throws PartInitException {
163 setSite(site);
164 setInput(input);
165 if(input instanceof DerivateViewEditorInput){
166 conversation = ((DerivateViewEditorInput) input).getConversationHolder();
167 }
168 }
169
170 /* (non-Javadoc)
171 * @see org.eclipse.ui.part.EditorPart#isDirty()
172 */
173 @Override
174 public boolean isDirty() {
175 return isDirty;
176 }
177
178 /**
179 * @param isDirty the isDirty to set
180 */
181 public void setDirty(boolean isDirty) {
182 this.isDirty = isDirty;
183 }
184
185 /* (non-Javadoc)
186 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
187 */
188 @Override
189 public boolean isSaveAsAllowed() {
190 return false;
191 }
192
193
194 /* (non-Javadoc)
195 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
196 */
197 @Override
198 public void setFocus() {
199 viewer.getControl().setFocus();
200 //make sure to bind again if maybe in another view the conversation was unbound
201 if(!conversation.isBound()){
202 conversation.bind();
203 }
204 }
205
206 /* (non-Javadoc)
207 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
208 */
209 @Override
210 public void update(CdmDataChangeMap changeEvents) {
211 }
212
213 /* (non-Javadoc)
214 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
215 */
216 @Override
217 public ConversationHolder getConversationHolder() {
218 return conversation;
219 }
220
221 /**
222 * @return the viewer
223 */
224 public TreeViewer getViewer() {
225 return viewer;
226 }
227
228 /* (non-Javadoc)
229 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
230 */
231 @Override
232 public void changed(Object element) {
233 setDirty(true);
234 firePropertyChange(IEditorPart.PROP_DIRTY);
235 viewer.refresh();
236 }
237
238 /**
239 * Refreshes the derivate hierarchy tree
240 */
241 public void refreshTree(){
242 generateMultiLinkSingleReads();
243 labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
244 viewer.refresh();
245 }
246
247 private void generateMultiLinkSingleReads() {
248 Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
249 for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
250 if(entry.getValue().size()>1){
251 multiLinkSingleReads.add(entry.getKey());
252 }
253 }
254 this.multiLinkSingleReads = multiLinkSingleReads;
255 }
256
257 /**
258 * @return a set of {@link SingleRead}s that have multiple parents
259 */
260 public Set<SingleRead> getMultiLinkSingleReads() {
261 return this.multiLinkSingleReads;
262 }
263
264 /* (non-Javadoc)
265 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
266 */
267 @Override
268 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
269 }
270
271 /* (non-Javadoc)
272 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
273 */
274 @Override
275 public void contextStop(IMemento memento, IProgressMonitor monitor) {
276 }
277
278 /* (non-Javadoc)
279 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
280 */
281 @Override
282 public void contextStart(IMemento memento, IProgressMonitor monitor) {
283 // if(memento == null){
284 // return;
285 // }
286 // IMemento editorMementos = memento.getChild(DERIVATE_VIEW_MEMENTO_KEY);
287 // DerivateViewEditorInput input = new DerivateViewEditorInput(UUID.fromString(editorInput.getString(DerivateViewEditorInput.UUID_MEMENTO_KEY)));
288 // try {
289 // EditorUtil.open(input);
290 // } catch (PartInitException e) {
291 // AbstractUtility.error(getClass(), "Error opening an editor window", e);
292 // }
293 }
294
295 /* (non-Javadoc)
296 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
297 */
298 @Override
299 public void contextRefresh(IProgressMonitor monitor) {
300 }
301
302 /* (non-Javadoc)
303 * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
304 */
305 @Override
306 public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
307 // if (!conversation.isBound()) {
308 // conversation.bind();
309 // }
310 // conversation.close();
311 // if(memento == null){
312 // return;
313 // }
314 //
315 // IEditorInput input = getEditorInput();
316 // if(input instanceof IPersistable){
317 // memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
318 // ((IPersistable) input).saveState(memento);
319 // }
320 }
321
322 }