I18n of login and data source view
[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.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.TreeSelection;
18 import org.eclipse.jface.viewers.TreeViewer;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.dnd.DND;
21 import org.eclipse.swt.dnd.Transfer;
22 import org.eclipse.swt.widgets.Composite;
23 import org.eclipse.swt.widgets.Control;
24 import org.eclipse.swt.widgets.Menu;
25 import org.eclipse.swt.widgets.Tree;
26 import org.eclipse.ui.IEditorInput;
27 import org.eclipse.ui.IEditorPart;
28 import org.eclipse.ui.IEditorSite;
29 import org.eclipse.ui.PartInitException;
30 import org.eclipse.ui.part.EditorPart;
31
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.common.CdmBase;
36 import eu.etaxonomy.cdm.model.molecular.Sequence;
37 import eu.etaxonomy.cdm.model.molecular.SingleRead;
38 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
39 import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
40 import eu.etaxonomy.taxeditor.editor.Messages;
41 import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
42 import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
43 import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
44 import eu.etaxonomy.taxeditor.model.IPartContentHasMedia;
45 import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
46 import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
47 import eu.etaxonomy.taxeditor.store.CdmStore;
48 import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateContentProvider;
49 import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
50
51 /**
52 * Displays the derivate hierarchy of the specimen specified in the editor input.
53 *
54 */
55 public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkable,
56 IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IPartContentHasMedia,
57 ISelectionChangedListener, IPostOperationEnabled{
58
59 public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView"; //$NON-NLS-1$
60
61 public static final String YOU_NEED_TO_SAVE_BEFORE_PERFORMING_THIS_ACTION = Messages.DerivateView_YOU_NEED_TO_SAVE;
62 public static final String VIEW_HAS_UNSAVED_CHANGES = Messages.DerivateView_UNSAVED_CHANGES;
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 private ISelection selection = null;
77
78
79 private DerivateContentProvider contentProvider;
80
81 /**
82 * Default constructor
83 */
84 public DerivateView() {
85 }
86
87 @Override
88 public void createPartControl(Composite parent) {
89 viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
90 contentProvider = new DerivateContentProvider();
91 viewer.setContentProvider(contentProvider);
92 labelProvider = new DerivateLabelProvider();
93 labelProvider.setConversation(conversation);
94 viewer.setLabelProvider(labelProvider);
95 viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
96 // Propagate selection from viewer
97 getSite().setSelectionProvider(viewer);
98 //listen to selection changes
99 viewer.addSelectionChangedListener(this);
100
101 //create context menu
102 MenuManager menuManager = new MenuManager();
103 getSite().registerContextMenu(menuManager, viewer);
104 Control control = viewer.getControl();
105 Menu menu = menuManager.createContextMenu(control);
106 control.setMenu(menu);
107
108 generateMultiLinkSingleReads();
109 labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
110 IEditorInput editorInput = getEditorInput();
111 viewer.setInput(((DerivateViewEditorInput) editorInput).getRootEntities());
112 //set selection to selected derivate if only one was selected
113 if(editorInput instanceof DerivateViewEditorInput){
114 Set<SpecimenOrObservationBase<?>> derivateEntities = ((DerivateViewEditorInput) editorInput).getDerivateEntities();
115 if(derivateEntities.size()==1){
116 SpecimenOrObservationBase<?> specimen = derivateEntities.iterator().next();
117 if(specimen != null){
118 viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
119 }
120 }
121 }
122
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));
127 }
128
129 @Override
130 public void doSave(IProgressMonitor monitor) {
131 String taskName = Messages.DerivateView_SAVING_HIERARCHY;
132 if(getEditorInput() instanceof DerivateViewEditorInput){
133 DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
134 taskName += " "+derivateViewEditorInput.getName(); //$NON-NLS-1$
135 }
136 monitor.beginTask(taskName, 3);
137 if (!conversation.isBound()) {
138 conversation.bind();
139 }
140 monitor.worked(1);
141
142 // commit the conversation and start a new transaction immediately
143 conversation.commit(true);
144 ((DerivateViewEditorInput) getEditorInput()).merge();
145 monitor.worked(1);
146
147 this.setDirty(false);
148 monitor.worked(1);
149 monitor.done();
150 firePropertyChange(PROP_DIRTY);
151 refreshTree();
152 }
153
154 @Override
155 public void doSaveAs() {
156 }
157
158 @Override
159 public String getTitleToolTip() {
160 if(getEditorInput() instanceof DerivateViewEditorInput){
161 DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
162 return derivateViewEditorInput.getName();
163 }
164 return Messages.DerivateView_DERIVATIVE_EDITOR;
165 }
166
167 @Override
168 public void init(IEditorSite site, IEditorInput input) throws PartInitException {
169 setSite(site);
170 setInput(input);
171 if(input instanceof DerivateViewEditorInput){
172 DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) input;
173 conversation = derivateViewEditorInput.getConversationHolder();
174 setPartName(derivateViewEditorInput.getName());
175 }
176 }
177
178 @Override
179 public boolean isDirty() {
180 return isDirty;
181 }
182
183 /**
184 * @param isDirty the isDirty to set
185 */
186 public void setDirty(boolean isDirty) {
187 this.isDirty = isDirty;
188 }
189
190 @Override
191 public boolean isSaveAsAllowed() {
192 return false;
193 }
194
195 @Override
196 public void setFocus() {
197 viewer.getControl().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 ((DerivateViewEditorInput) getEditorInput()).bind();
203 }
204
205 @Override
206 public void update(CdmDataChangeMap changeEvents) {
207 }
208
209 @Override
210 public ConversationHolder getConversationHolder() {
211 return conversation;
212 }
213
214 /**
215 * @return the viewer
216 */
217 public TreeViewer getViewer() {
218 return viewer;
219 }
220
221 @Override
222 public void changed(Object element) {
223 setDirty(true);
224 firePropertyChange(IEditorPart.PROP_DIRTY);
225 viewer.refresh();
226 }
227
228 @Override
229 public void forceDirty() {
230 changed(null);
231 }
232
233 /**
234 * Refreshes the derivate hierarchy tree and expands the tree
235 * to show and select the given object.
236 *
237 * @param expandTo the object to which the tree should be expanded
238 */
239 public void refreshTree(Object expandTo){
240 refreshTree();
241 TreeSelection selection = (TreeSelection) viewer.getSelection();
242 viewer.expandToLevel(selection.getFirstElement(), 1);
243 viewer.setSelection(new StructuredSelection(new TreeNode(expandTo)));
244 }
245
246 /**
247 * Refreshes the derivate hierarchy tree
248 */
249 public void refreshTree(){
250 generateMultiLinkSingleReads();
251 labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
252 viewer.refresh();
253 }
254
255 //FIXME:Remoting hack to make this work for remoting
256 //This should actually be resolved using remoting post operations
257 public void remove(Object obj) {
258 Set<SpecimenOrObservationBase<?>> rootEntities = ((DerivateViewEditorInput) getEditorInput()).getRootEntities();
259 rootEntities.remove(obj);
260 viewer.setInput(rootEntities);
261 }
262
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());
268 }
269 }
270 this.multiLinkSingleReads = multiLinkSingleReads;
271 }
272
273 /**
274 * @return a set of {@link SingleRead}s that have multiple parents
275 */
276 public Set<SingleRead> getMultiLinkSingleReads() {
277 return this.multiLinkSingleReads;
278 }
279
280 @Override
281 public void selectionChanged(SelectionChangedEvent event) {
282 this.selection = event.getSelection();
283 }
284
285 public ISelection getSelection() {
286 return selection;
287 }
288
289 public DerivateLabelProvider getLabelProvider() {
290 return labelProvider;
291 }
292
293 @Override
294 public boolean postOperation(CdmBase objectAffectedByOperation) {
295 refreshTree();
296 if(objectAffectedByOperation!=null){
297 changed(objectAffectedByOperation);
298 }
299 return true;
300 }
301
302 @Override
303 public boolean onComplete() {
304 return true;
305 }
306
307 @Override
308 public void dispose() {
309 ((DerivateViewEditorInput) getEditorInput()).dispose();
310 super.dispose();
311 }
312
313
314 @Override
315 public boolean canAttachMedia() {
316 return true;
317 }
318 }