- added update() method to DerivateView
[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.PartInitException;
26 import org.eclipse.ui.part.EditorPart;
27
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;
42
43 /**
44 * Displays the derivate hierarchy of all derivates having one single {@link FieldUnit} as root.
45 *
46 */
47 public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider, IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData {
48
49 public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
50
51 private ConversationHolder conversation;
52
53 private TreeViewer viewer;
54
55 private boolean isDirty;
56
57 private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
58
59 private DerivateLabelProvider labelProvider;
60
61 /* (non-Javadoc)
62 * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
63 */
64 @Override
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);
73
74 //create context menu
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);
80
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)));
89 }
90
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));
95 }
96
97 /* (non-Javadoc)
98 * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
99 */
100 @Override
101 public void doSave(IProgressMonitor monitor) {
102 monitor.beginTask("Saving Derivates", 3);
103 if (!conversation.isBound()) {
104 conversation.bind();
105 }
106 monitor.worked(1);
107
108 // commit the conversation and start a new transaction immediately
109 conversation.commit(true);
110 monitor.worked(1);
111
112 this.setDirty(false);
113 monitor.worked(1);
114 monitor.done();
115 firePropertyChange(PROP_DIRTY);
116 update();
117 }
118
119 /* (non-Javadoc)
120 * @see org.eclipse.ui.part.EditorPart#doSaveAs()
121 */
122 @Override
123 public void doSaveAs() {
124 // TODO Auto-generated method stub
125
126 }
127
128 /* (non-Javadoc)
129 * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
130 */
131 @Override
132 public String getTitleToolTip() {
133 return "Derivate View";
134 }
135
136 /* (non-Javadoc)
137 * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
138 */
139 @Override
140 public void init(IEditorSite site, IEditorInput input) throws PartInitException {
141 setSite(site);
142 setInput(input);
143 if(input instanceof DerivateViewEditorInput){
144 conversation = ((DerivateViewEditorInput) input).getConversationHolder();
145 }
146 }
147
148 /* (non-Javadoc)
149 * @see org.eclipse.ui.part.EditorPart#isDirty()
150 */
151 @Override
152 public boolean isDirty() {
153 return isDirty;
154 }
155
156 /**
157 * @param isDirty the isDirty to set
158 */
159 public void setDirty(boolean isDirty) {
160 this.isDirty = isDirty;
161 }
162
163 /* (non-Javadoc)
164 * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
165 */
166 @Override
167 public boolean isSaveAsAllowed() {
168 // TODO Auto-generated method stub
169 return false;
170 }
171
172
173 /* (non-Javadoc)
174 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
175 */
176 @Override
177 public void setFocus() {
178 //make sure to bind again if maybe in another view the conversation was unbound
179 if(!conversation.isBound()){
180 conversation.bind();
181 }
182 }
183
184 /* (non-Javadoc)
185 * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
186 */
187 @Override
188 public void update(CdmDataChangeMap changeEvents) {
189 // TODO Auto-generated method stub
190
191 }
192
193 /* (non-Javadoc)
194 * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
195 */
196 @Override
197 public ConversationHolder getConversationHolder() {
198 return conversation;
199 }
200
201 /**
202 * @return the viewer
203 */
204 public TreeViewer getViewer() {
205 return viewer;
206 }
207
208 /* (non-Javadoc)
209 * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
210 */
211 @Override
212 public void changed(Object element) {
213 setDirty(true);
214 firePropertyChange(IEditorPart.PROP_DIRTY);
215 }
216
217 /**
218 * Updates the derivate hierarchy tree
219 */
220 public void update(){
221 labelProvider.setMultiLinkSingleReads(getMultiLinkSingleReads());
222 viewer.setInput(getEditorInput());
223 }
224
225 /**
226 * @return
227 */
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());
233 }
234 }
235 return multiLinkSingleReads;
236 }
237
238 }