bab27cfed83353fb37aa25949f082ea979737abf
[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 viewer.setLabelProvider(labelProvider);
92 viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
93 // Propagate selection from viewer
94 getSite().setSelectionProvider(viewer);
95
96 //create context menu
97 MenuManager menuManager = new MenuManager();
98 getSite().registerContextMenu(menuManager, viewer);
99 Control control = viewer.getControl();
100 Menu menu = menuManager.createContextMenu(control);
101 control.setMenu(menu);
102
103 generateMultiLinkSingleReads();
104 labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
105 IEditorInput editorInput = getEditorInput();
106 viewer.setInput(editorInput);
107 if(editorInput instanceof DerivateViewEditorInput){
108 SpecimenOrObservationBase<?> specimen = ((DerivateViewEditorInput) editorInput).getDerivate();
109 SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
110 setPartName(DerivateLabelProvider.getDerivateText(rootElement));
111 viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
112 }
113
114 //add drag'n'drop support
115 Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),};
116 viewer.addDragSupport(dndOperations, transfers, new DerivateDragListener(this));
117 viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this));
118 }
119
120 /* (non-Javadoc)
121 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
122 */
123 @Override
124 public void doSave(IProgressMonitor monitor) {
125 monitor.beginTask("Saving Derivates", 3);
126 if (!conversation.isBound()) {
127 conversation.bind();
128 }
129 monitor.worked(1);
130
131 // commit the conversation and start a new transaction immediately
132 conversation.commit(true);
133 monitor.worked(1);
134
135 this.setDirty(false);
136 monitor.worked(1);
137 monitor.done();
138 firePropertyChange(PROP_DIRTY);
139 refreshTree();
140 }
141
142 /* (non-Javadoc)
143 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
144 */
145 @Override
146 public void doSaveAs() {
147 }
148
149 /* (non-Javadoc)
150 * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
151 */
152 @Override
153 public String getTitleToolTip() {
154 return "Derivate View";
155 }
156
157 /* (non-Javadoc)
158 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
159 */
160 @Override
161 public void init(IEditorSite site, IEditorInput input) throws PartInitException {
162 setSite(site);
163 setInput(input);
164 if(input instanceof DerivateViewEditorInput){
165 conversation = ((DerivateViewEditorInput) input).getConversationHolder();
166 }
167 }
168
169 /* (non-Javadoc)
170 * @see org.eclipse.ui.part.EditorPart#isDirty()
171 */
172 @Override
173 public boolean isDirty() {
174 return isDirty;
175 }
176
177 /**
178 * @param isDirty the isDirty to set
179 */
180 public void setDirty(boolean isDirty) {
181 this.isDirty = isDirty;
182 }
183
184 /* (non-Javadoc)
185 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
186 */
187 @Override
188 public boolean isSaveAsAllowed() {
189 return false;
190 }
191
192
193 /* (non-Javadoc)
194 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
195 */
196 @Override
197 public void setFocus() {
198 //make sure to bind again if maybe in another view the conversation was unbound
199 if(!conversation.isBound()){
200 conversation.bind();
201 }
202 }
203
204 /* (non-Javadoc)
205 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
206 */
207 @Override
208 public void update(CdmDataChangeMap changeEvents) {
209 }
210
211 /* (non-Javadoc)
212 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
213 */
214 @Override
215 public ConversationHolder getConversationHolder() {
216 return conversation;
217 }
218
219 /**
220 * @return the viewer
221 */
222 public TreeViewer getViewer() {
223 return viewer;
224 }
225
226 /* (non-Javadoc)
227 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
228 */
229 @Override
230 public void changed(Object element) {
231 setDirty(true);
232 firePropertyChange(IEditorPart.PROP_DIRTY);
233 viewer.refresh();
234 }
235
236 /**
237 * Refreshes the derivate hierarchy tree
238 */
239 public void refreshTree(){
240 generateMultiLinkSingleReads();
241 labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
242 viewer.refresh();
243 }
244
245 private void generateMultiLinkSingleReads() {
246 Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
247 for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
248 if(entry.getValue().size()>1){
249 multiLinkSingleReads.add(entry.getKey());
250 }
251 }
252 this.multiLinkSingleReads = multiLinkSingleReads;
253 }
254
255 /**
256 * @return a set of {@link SingleRead}s that have multiple parents
257 */
258 public Set<SingleRead> getMultiLinkSingleReads() {
259 return this.multiLinkSingleReads;
260 }
261
262 /* (non-Javadoc)
263 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
264 */
265 @Override
266 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
267 }
268
269 /* (non-Javadoc)
270 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
271 */
272 @Override
273 public void contextStop(IMemento memento, IProgressMonitor monitor) {
274 }
275
276 /* (non-Javadoc)
277 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
278 */
279 @Override
280 public void contextStart(IMemento memento, IProgressMonitor monitor) {
281 // if(memento == null){
282 // return;
283 // }
284 // IMemento editorMementos = memento.getChild(DERIVATE_VIEW_MEMENTO_KEY);
285 // DerivateViewEditorInput input = new DerivateViewEditorInput(UUID.fromString(editorInput.getString(DerivateViewEditorInput.UUID_MEMENTO_KEY)));
286 // try {
287 // EditorUtil.open(input);
288 // } catch (PartInitException e) {
289 // AbstractUtility.error(getClass(), "Error opening an editor window", e);
290 // }
291 }
292
293 /* (non-Javadoc)
294 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
295 */
296 @Override
297 public void contextRefresh(IProgressMonitor monitor) {
298 }
299
300 /* (non-Javadoc)
301 * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
302 */
303 @Override
304 public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
305 // if (!conversation.isBound()) {
306 // conversation.bind();
307 // }
308 // conversation.close();
309 // if(memento == null){
310 // return;
311 // }
312 //
313 // IEditorInput input = getEditorInput();
314 // if(input instanceof IPersistable){
315 // memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
316 // ((IPersistable) input).saveState(memento);
317 // }
318 }
319
320 }