added CET to end of build date
[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 viewer.getControl().setFocus();
199 //make sure to bind again if maybe in another view the conversation was unbound
200 if(!conversation.isBound()){
201 conversation.bind();
202 }
203 }
204
205 /* (non-Javadoc)
206 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
207 */
208 @Override
209 public void update(CdmDataChangeMap changeEvents) {
210 }
211
212 /* (non-Javadoc)
213 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
214 */
215 @Override
216 public ConversationHolder getConversationHolder() {
217 return conversation;
218 }
219
220 /**
221 * @return the viewer
222 */
223 public TreeViewer getViewer() {
224 return viewer;
225 }
226
227 /* (non-Javadoc)
228 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
229 */
230 @Override
231 public void changed(Object element) {
232 setDirty(true);
233 firePropertyChange(IEditorPart.PROP_DIRTY);
234 viewer.refresh();
235 }
236
237 /**
238 * Refreshes the derivate hierarchy tree
239 */
240 public void refreshTree(){
241 generateMultiLinkSingleReads();
242 labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
243 viewer.refresh();
244 }
245
246 private void generateMultiLinkSingleReads() {
247 Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
248 for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
249 if(entry.getValue().size()>1){
250 multiLinkSingleReads.add(entry.getKey());
251 }
252 }
253 this.multiLinkSingleReads = multiLinkSingleReads;
254 }
255
256 /**
257 * @return a set of {@link SingleRead}s that have multiple parents
258 */
259 public Set<SingleRead> getMultiLinkSingleReads() {
260 return this.multiLinkSingleReads;
261 }
262
263 /* (non-Javadoc)
264 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
265 */
266 @Override
267 public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
268 }
269
270 /* (non-Javadoc)
271 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
272 */
273 @Override
274 public void contextStop(IMemento memento, IProgressMonitor monitor) {
275 }
276
277 /* (non-Javadoc)
278 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
279 */
280 @Override
281 public void contextStart(IMemento memento, IProgressMonitor monitor) {
282 // if(memento == null){
283 // return;
284 // }
285 // IMemento editorMementos = memento.getChild(DERIVATE_VIEW_MEMENTO_KEY);
286 // DerivateViewEditorInput input = new DerivateViewEditorInput(UUID.fromString(editorInput.getString(DerivateViewEditorInput.UUID_MEMENTO_KEY)));
287 // try {
288 // EditorUtil.open(input);
289 // } catch (PartInitException e) {
290 // AbstractUtility.error(getClass(), "Error opening an editor window", e);
291 // }
292 }
293
294 /* (non-Javadoc)
295 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
296 */
297 @Override
298 public void contextRefresh(IProgressMonitor monitor) {
299 }
300
301 /* (non-Javadoc)
302 * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
303 */
304 @Override
305 public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
306 // if (!conversation.isBound()) {
307 // conversation.bind();
308 // }
309 // conversation.close();
310 // if(memento == null){
311 // return;
312 // }
313 //
314 // IEditorInput input = getEditorInput();
315 // if(input instanceof IPersistable){
316 // memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
317 // ((IPersistable) input).saveState(memento);
318 // }
319 }
320
321 }