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
.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
.PartInitException
;
26 import org
.eclipse
.ui
.part
.EditorPart
;
28 import eu
.etaxonomy
.cdm
.api
.conversation
.ConversationHolder
;
29 import eu
.etaxonomy
.cdm
.api
.conversation
.IConversationEnabled
;
30 import eu
.etaxonomy
.cdm
.api
.service
.molecular
.ISequenceService
;
31 import eu
.etaxonomy
.cdm
.model
.molecular
.Sequence
;
32 import eu
.etaxonomy
.cdm
.model
.molecular
.SingleRead
;
33 import eu
.etaxonomy
.cdm
.model
.occurrence
.FieldUnit
;
34 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
35 import eu
.etaxonomy
.cdm
.persistence
.hibernate
.CdmDataChangeMap
;
36 import eu
.etaxonomy
.taxeditor
.model
.IDirtyMarkableSelectionProvider
;
37 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasDetails
;
38 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasFactualData
;
39 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasSupplementalData
;
40 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
41 import eu
.etaxonomy
.taxeditor
.view
.derivateSearch
.DerivateLabelProvider
;
44 * Displays the derivate hierarchy of all derivates having one single {@link FieldUnit} as root.
47 public class DerivateView
extends EditorPart
implements IPartContentHasFactualData
, IDirtyMarkableSelectionProvider
, IConversationEnabled
, IPartContentHasDetails
, IPartContentHasSupplementalData
{
49 public static final String ID
= "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
51 private ConversationHolder conversation
;
53 private TreeViewer viewer
;
55 private boolean isDirty
;
57 private final int dndOperations
= DND
.DROP_COPY
| DND
.DROP_MOVE
| DND
.DROP_LINK
;
59 private DerivateLabelProvider labelProvider
;
62 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
65 public void createPartControl(Composite parent
) {
66 viewer
= new TreeViewer(new Tree(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
));
67 viewer
.setContentProvider(new DerivateContentProvider());
68 labelProvider
= new DerivateLabelProvider();
69 viewer
.setLabelProvider(labelProvider
);
70 viewer
.setAutoExpandLevel(AbstractTreeViewer
.ALL_LEVELS
);
71 // Propagate selection from viewer
72 getSite().setSelectionProvider(viewer
);
75 MenuManager menuManager
= new MenuManager();
76 getSite().registerContextMenu(menuManager
, viewer
);
77 Control control
= viewer
.getControl();
78 Menu menu
= menuManager
.createContextMenu(control
);
79 control
.setMenu(menu
);
81 labelProvider
.setMultiLinkSingleReads(getMultiLinkSingleReads());
82 IEditorInput editorInput
= getEditorInput();
83 viewer
.setInput(editorInput
);
84 if(editorInput
instanceof DerivateViewEditorInput
){
85 SpecimenOrObservationBase
<?
> specimen
= ((DerivateViewEditorInput
) editorInput
).getDerivate();
86 SpecimenOrObservationBase
<?
> rootElement
= ((DerivateViewEditorInput
) editorInput
).getRootElement();
87 setPartName(rootElement
.toString());
88 viewer
.setSelection(new StructuredSelection(new TreeNode(specimen
)));
91 //add drag'n'drop support
92 Transfer
[] transfers
= new Transfer
[] {LocalSelectionTransfer
.getTransfer(),};
93 viewer
.addDragSupport(dndOperations
, transfers
, new DerivateDragListener(viewer
));
94 viewer
.addDropSupport(dndOperations
, transfers
, new DerivateDropListener(this));
98 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
101 public void doSave(IProgressMonitor monitor
) {
102 monitor
.beginTask("Saving Derivates", 3);
103 if (!conversation
.isBound()) {
108 // commit the conversation and start a new transaction immediately
109 conversation
.commit(true);
112 this.setDirty(false);
115 firePropertyChange(PROP_DIRTY
);
120 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
123 public void doSaveAs() {
124 // TODO Auto-generated method stub
129 * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
132 public String
getTitleToolTip() {
133 return "Derivate View";
137 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
140 public void init(IEditorSite site
, IEditorInput input
) throws PartInitException
{
143 if(input
instanceof DerivateViewEditorInput
){
144 conversation
= ((DerivateViewEditorInput
) input
).getConversationHolder();
149 * @see org.eclipse.ui.part.EditorPart#isDirty()
152 public boolean isDirty() {
157 * @param isDirty the isDirty to set
159 public void setDirty(boolean isDirty
) {
160 this.isDirty
= isDirty
;
164 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
167 public boolean isSaveAsAllowed() {
168 // TODO Auto-generated method stub
174 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
177 public void setFocus() {
178 //make sure to bind again if maybe in another view the conversation was unbound
179 if(!conversation
.isBound()){
185 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
188 public void update(CdmDataChangeMap changeEvents
) {
189 // TODO Auto-generated method stub
194 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
197 public ConversationHolder
getConversationHolder() {
204 public TreeViewer
getViewer() {
209 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
212 public void changed(Object element
) {
214 firePropertyChange(IEditorPart
.PROP_DIRTY
);
218 * Updates the derivate hierarchy tree
220 public void update(){
221 labelProvider
.setMultiLinkSingleReads(getMultiLinkSingleReads());
222 viewer
.setInput(getEditorInput());
228 private Set
<SingleRead
> getMultiLinkSingleReads() {
229 Set
<SingleRead
> multiLinkSingleReads
= new HashSet
<SingleRead
>();
230 for(Entry
<SingleRead
, Collection
<Sequence
>> entry
:CdmStore
.getService(ISequenceService
.class).getSingleReadSequencesMap().entrySet()){
231 if(entry
.getValue().size()>1){
232 multiLinkSingleReads
.add(entry
.getKey());
235 return multiLinkSingleReads
;