1 package eu
.etaxonomy
.taxeditor
.editor
.view
.derivate
;
3 import java
.util
.Collection
;
4 import java
.util
.HashSet
;
5 import java
.util
.Map
.Entry
;
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
.ISelection
;
13 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
14 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
15 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
16 import org
.eclipse
.jface
.viewers
.TreeNode
;
17 import org
.eclipse
.jface
.viewers
.TreeViewer
;
18 import org
.eclipse
.swt
.SWT
;
19 import org
.eclipse
.swt
.dnd
.DND
;
20 import org
.eclipse
.swt
.dnd
.Transfer
;
21 import org
.eclipse
.swt
.widgets
.Composite
;
22 import org
.eclipse
.swt
.widgets
.Control
;
23 import org
.eclipse
.swt
.widgets
.Menu
;
24 import org
.eclipse
.swt
.widgets
.Tree
;
25 import org
.eclipse
.ui
.IEditorInput
;
26 import org
.eclipse
.ui
.IEditorPart
;
27 import org
.eclipse
.ui
.IEditorSite
;
28 import org
.eclipse
.ui
.IMemento
;
29 import org
.eclipse
.ui
.PartInitException
;
30 import org
.eclipse
.ui
.part
.EditorPart
;
32 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
33 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
34 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.ISequenceService
;
35 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
36 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleRead
;
37 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
38 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
39 import eu
.etaxonomy
.taxeditor
.model
.IContextListener
;
40 import eu
.etaxonomy
.taxeditor
.model
.IDirtyMarkable
;
41 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasDetails
;
42 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasFactualData
;
43 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasMedia
;
44 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasSupplementalData
;
45 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
46 import eu
.etaxonomy
.taxeditor
.view
.derivateSearch
.DerivateLabelProvider
;
49 * Displays the derivate hierarchy of the specimen specified in the editor input.
52 public class DerivateView
extends EditorPart
implements IPartContentHasFactualData
, IDirtyMarkable
,
53 IConversationEnabled
, IPartContentHasDetails
, IPartContentHasMedia
, IPartContentHasSupplementalData
,
54 IContextListener
, ISelectionChangedListener
{
57 * Key used for storing a single DerivateView in a memento
59 private static final String DERIVATE_VIEW_MEMENTO_KEY
= "derivateView";
62 * Key to to group mementos for every single DerivateView
64 private static final String DERIVATE_VIEWS_MEMENTO_KEY
= "derivateViews";
66 public static final String ID
= "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
68 private ConversationHolder conversation
;
70 private TreeViewer viewer
;
72 private boolean isDirty
;
74 private final int dndOperations
= DND
.DROP_MOVE
;
76 private DerivateLabelProvider labelProvider
;
78 private Set
<SingleRead
> multiLinkSingleReads
;
80 private ISelection selection
= null;
85 public DerivateView() {
86 CdmStore
.getContextManager().addContextListener(this);
90 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
93 public void createPartControl(Composite parent
) {
94 viewer
= new TreeViewer(new Tree(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
));
95 viewer
.setContentProvider(new DerivateContentProvider());
96 labelProvider
= new DerivateLabelProvider();
97 labelProvider
.setConversation(conversation
);
98 viewer
.setLabelProvider(labelProvider
);
99 viewer
.setAutoExpandLevel(AbstractTreeViewer
.ALL_LEVELS
);
100 // Propagate selection from viewer
101 getSite().setSelectionProvider(viewer
);
102 //listen to selection changes
103 viewer
.addSelectionChangedListener(this);
105 //create context menu
106 MenuManager menuManager
= new MenuManager();
107 getSite().registerContextMenu(menuManager
, viewer
);
108 Control control
= viewer
.getControl();
109 Menu menu
= menuManager
.createContextMenu(control
);
110 control
.setMenu(menu
);
112 generateMultiLinkSingleReads();
113 labelProvider
.setMultiLinkSingleReads(multiLinkSingleReads
);
114 IEditorInput editorInput
= getEditorInput();
115 viewer
.setInput(editorInput
);
116 if(editorInput
instanceof DerivateViewEditorInput
){
117 SpecimenOrObservationBase
<?
> specimen
= ((DerivateViewEditorInput
) editorInput
).getDerivate();
118 SpecimenOrObservationBase
<?
> rootElement
= ((DerivateViewEditorInput
) editorInput
).getRootElement();
119 setPartName(labelProvider
.getDerivateText(rootElement
));
120 viewer
.setSelection(new StructuredSelection(new TreeNode(specimen
)));
123 //add drag'n'drop support
124 Transfer
[] transfers
= new Transfer
[] {LocalSelectionTransfer
.getTransfer(),};
125 viewer
.addDragSupport(dndOperations
, transfers
, new DerivateDragListener(this));
126 viewer
.addDropSupport(dndOperations
, transfers
, new DerivateDropListener(this));
130 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
133 public void doSave(IProgressMonitor monitor
) {
134 monitor
.beginTask("Saving Derivates", 3);
135 if (!conversation
.isBound()) {
140 // commit the conversation and start a new transaction immediately
141 conversation
.commit(true);
144 this.setDirty(false);
147 firePropertyChange(PROP_DIRTY
);
152 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
155 public void doSaveAs() {
159 * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
162 public String
getTitleToolTip() {
163 return "Derivate View";
167 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
170 public void init(IEditorSite site
, IEditorInput input
) throws PartInitException
{
173 if(input
instanceof DerivateViewEditorInput
){
174 conversation
= ((DerivateViewEditorInput
) input
).getConversationHolder();
179 * @see org.eclipse.ui.part.EditorPart#isDirty()
182 public boolean isDirty() {
187 * @param isDirty the isDirty to set
189 public void setDirty(boolean isDirty
) {
190 this.isDirty
= isDirty
;
194 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
197 public boolean isSaveAsAllowed() {
203 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
206 public void setFocus() {
207 viewer
.getControl().setFocus();
208 //make sure to bind again if maybe in another view the conversation was unbound
209 if(!conversation
.isBound()){
215 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
218 public void update(CdmDataChangeMap changeEvents
) {
222 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
225 public ConversationHolder
getConversationHolder() {
232 public TreeViewer
getViewer() {
237 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
240 public void changed(Object element
) {
242 firePropertyChange(IEditorPart
.PROP_DIRTY
);
247 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
250 public void forceDirty() {
255 * Refreshes the derivate hierarchy tree
257 public void refreshTree(){
258 generateMultiLinkSingleReads();
259 labelProvider
.setMultiLinkSingleReads(multiLinkSingleReads
);
263 private void generateMultiLinkSingleReads() {
264 Set
<SingleRead
> multiLinkSingleReads
= new HashSet
<SingleRead
>();
265 for(Entry
<SingleRead
, Collection
<Sequence
>> entry
:CdmStore
.getService(ISequenceService
.class).getSingleReadSequencesMap().entrySet()){
266 if(entry
.getValue().size()>1){
267 multiLinkSingleReads
.add(entry
.getKey());
270 this.multiLinkSingleReads
= multiLinkSingleReads
;
274 * @return a set of {@link SingleRead}s that have multiple parents
276 public Set
<SingleRead
> getMultiLinkSingleReads() {
277 return this.multiLinkSingleReads
;
281 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
284 public void contextAboutToStop(IMemento memento
, IProgressMonitor monitor
) {
288 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
291 public void contextStop(IMemento memento
, IProgressMonitor monitor
) {
295 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
298 public void contextStart(IMemento memento
, IProgressMonitor monitor
) {
299 // if(memento == null){
302 // IMemento editorMementos = memento.getChild(DERIVATE_VIEW_MEMENTO_KEY);
303 // DerivateViewEditorInput input = new DerivateViewEditorInput(UUID.fromString(editorInput.getString(DerivateViewEditorInput.UUID_MEMENTO_KEY)));
305 // EditorUtil.open(input);
306 // } catch (PartInitException e) {
307 // AbstractUtility.error(getClass(), "Error opening an editor window", e);
312 * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
315 public void contextRefresh(IProgressMonitor monitor
) {
319 * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
322 public void workbenchShutdown(IMemento memento
, IProgressMonitor monitor
) {
323 // if (!conversation.isBound()) {
324 // conversation.bind();
326 // conversation.close();
327 // if(memento == null){
331 // IEditorInput input = getEditorInput();
332 // if(input instanceof IPersistable){
333 // memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
334 // ((IPersistable) input).saveState(memento);
339 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
342 public void selectionChanged(SelectionChangedEvent event
) {
343 this.selection
= event
.getSelection();
347 * @return the selection
349 public ISelection
getSelection() {