Project

General

Profile

Download (11.2 KB) Statistics
| Branch: | Tag: | Revision:
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
import java.util.UUID;
8

    
9
import org.eclipse.core.runtime.IProgressMonitor;
10
import org.eclipse.jface.action.MenuManager;
11
import org.eclipse.jface.util.LocalSelectionTransfer;
12
import org.eclipse.jface.viewers.AbstractTreeViewer;
13
import org.eclipse.jface.viewers.ISelection;
14
import org.eclipse.jface.viewers.ISelectionChangedListener;
15
import org.eclipse.jface.viewers.SelectionChangedEvent;
16
import org.eclipse.jface.viewers.StructuredSelection;
17
import org.eclipse.jface.viewers.TreeNode;
18
import org.eclipse.jface.viewers.TreeSelection;
19
import org.eclipse.jface.viewers.TreeViewer;
20
import org.eclipse.swt.SWT;
21
import org.eclipse.swt.dnd.DND;
22
import org.eclipse.swt.dnd.Transfer;
23
import org.eclipse.swt.widgets.Composite;
24
import org.eclipse.swt.widgets.Control;
25
import org.eclipse.swt.widgets.Menu;
26
import org.eclipse.swt.widgets.Tree;
27
import org.eclipse.ui.IEditorInput;
28
import org.eclipse.ui.IEditorPart;
29
import org.eclipse.ui.IEditorSite;
30
import org.eclipse.ui.PartInitException;
31
import org.eclipse.ui.part.EditorPart;
32

    
33
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
34
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
35
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
36
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
37
import eu.etaxonomy.cdm.model.common.CdmBase;
38
import eu.etaxonomy.cdm.model.molecular.Sequence;
39
import eu.etaxonomy.cdm.model.molecular.SingleRead;
40
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
41
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
42
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
43
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
44
import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
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.DerivateLabelProvider;
49

    
50
/**
51
 * Displays the derivate hierarchy of the specimen specified in the editor input.
52
 *
53
 */
54
public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkable,
55
        IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData,
56
        ISelectionChangedListener, IPostOperationEnabled {
57

    
58
    public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
59

    
60
	private ConversationHolder conversation;
61

    
62
	private TreeViewer viewer;
63

    
64
    private boolean isDirty;
65

    
66
    private final int dndOperations = DND.DROP_MOVE;
67

    
68
    private DerivateLabelProvider labelProvider;
69

    
70
    private Set<SingleRead> multiLinkSingleReads;
71

    
72
    private ISelection selection = null;
73

    
74
    /**
75
     * Default constructor
76
     */
77
    public DerivateView() {
78
    }
79

    
80
    /* (non-Javadoc)
81
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
82
     */
83
    @Override
84
    public void createPartControl(Composite parent) {
85
        viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
86
        viewer.setContentProvider(new DerivateContentProvider());
87
        labelProvider = new DerivateLabelProvider();
88
        labelProvider.setConversation(conversation);
89
        viewer.setLabelProvider(labelProvider);
90
        viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
91
        // Propagate selection from viewer
92
        getSite().setSelectionProvider(viewer);
93
        //listen to selection changes
94
        viewer.addSelectionChangedListener(this);
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
        //set selection to selected derivate if only one was selected
108
        if(editorInput instanceof DerivateViewEditorInput){
109
            Set<UUID> derivateUUIDs = ((DerivateViewEditorInput) editorInput).getDerivateUUIDs();
110
            if(derivateUUIDs.size()==1){
111
                SpecimenOrObservationBase<?> specimen = CdmStore.getService(IOccurrenceService.class).load(derivateUUIDs.iterator().next());
112
                if(specimen!=null){
113
                    viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
114
                }
115
            }
116
        }
117

    
118
        //add drag'n'drop support
119
        Transfer[] transfers = new Transfer[] {LocalSelectionTransfer.getTransfer(),};
120
        viewer.addDragSupport(dndOperations, transfers, new DerivateDragListener(this));
121
        viewer.addDropSupport(dndOperations, transfers, new DerivateDropListener(this));
122
    }
123

    
124
    /* (non-Javadoc)
125
     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
126
     */
127
    @Override
128
    public void doSave(IProgressMonitor monitor) {
129
        String taskName = "Saving hierarchy";
130
        if(getEditorInput() instanceof DerivateViewEditorInput){
131
            DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
132
            taskName += " "+derivateViewEditorInput.getName();
133
        }
134
        monitor.beginTask(taskName, 3);
135
        if (!conversation.isBound()) {
136
            conversation.bind();
137
        }
138
        monitor.worked(1);
139

    
140
        // commit the conversation and start a new transaction immediately
141
        conversation.commit(true);
142
        monitor.worked(1);
143

    
144
        this.setDirty(false);
145
        monitor.worked(1);
146
        monitor.done();
147
        firePropertyChange(PROP_DIRTY);
148
        refreshTree();
149
    }
150

    
151
    /* (non-Javadoc)
152
     * @see org.eclipse.ui.part.EditorPart#doSaveAs()
153
     */
154
    @Override
155
    public void doSaveAs() {
156
    }
157

    
158
    /* (non-Javadoc)
159
     * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
160
     */
161
    @Override
162
    public String getTitleToolTip() {
163
        if(getEditorInput() instanceof DerivateViewEditorInput){
164
            DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) getEditorInput();
165
            return derivateViewEditorInput.getName();
166
        }
167
        return "Derivate View";
168
    }
169

    
170
    /* (non-Javadoc)
171
     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
172
     */
173
    @Override
174
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
175
        setSite(site);
176
        setInput(input);
177
        if(input instanceof DerivateViewEditorInput){
178
            DerivateViewEditorInput derivateViewEditorInput = (DerivateViewEditorInput) input;
179
            conversation = derivateViewEditorInput.getConversationHolder();
180
            setPartName(derivateViewEditorInput.getName());
181
        }
182
    }
183

    
184
    /* (non-Javadoc)
185
     * @see org.eclipse.ui.part.EditorPart#isDirty()
186
     */
187
    @Override
188
    public boolean isDirty() {
189
        return isDirty;
190
    }
191

    
192
    /**
193
     * @param isDirty the isDirty to set
194
     */
195
    public void setDirty(boolean isDirty) {
196
        this.isDirty = isDirty;
197
    }
198

    
199
    /* (non-Javadoc)
200
     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
201
     */
202
    @Override
203
    public boolean isSaveAsAllowed() {
204
        return false;
205
    }
206

    
207

    
208
    /* (non-Javadoc)
209
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
210
     */
211
    @Override
212
    public void setFocus() {
213
        viewer.getControl().setFocus();
214
        //make sure to bind again if maybe in another view the conversation was unbound
215
        if(!conversation.isBound()){
216
            conversation.bind();
217
        }
218
    }
219

    
220
    /* (non-Javadoc)
221
     * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
222
     */
223
    @Override
224
    public void update(CdmDataChangeMap changeEvents) {
225
    }
226

    
227
    /* (non-Javadoc)
228
     * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
229
     */
230
    @Override
231
    public ConversationHolder getConversationHolder() {
232
        return conversation;
233
    }
234

    
235
    /**
236
     * @return the viewer
237
     */
238
    public TreeViewer getViewer() {
239
        return viewer;
240
    }
241

    
242
    /* (non-Javadoc)
243
     * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
244
     */
245
    @Override
246
    public void changed(Object element) {
247
        setDirty(true);
248
        firePropertyChange(IEditorPart.PROP_DIRTY);
249
        viewer.refresh();
250
    }
251

    
252
    /* (non-Javadoc)
253
     * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#forceDirty()
254
     */
255
    @Override
256
    public void forceDirty() {
257
        changed(null);
258
    }
259

    
260
    /**
261
     * Refreshes the derivate hierarchy tree and expands the tree
262
     * to show and select the given object.
263
     *
264
     * @param expandTo the object to which the tree should be expanded
265
     */
266
    public void refreshTree(Object expandTo){
267
        refreshTree();
268
        TreeSelection selection = (TreeSelection) viewer.getSelection();
269
        viewer.expandToLevel(selection.getFirstElement(), 1);
270
        viewer.setSelection(new StructuredSelection(new TreeNode(expandTo)));
271
    }
272

    
273
    /**
274
     * Refreshes the derivate hierarchy tree
275
     */
276
    public void refreshTree(){
277
        generateMultiLinkSingleReads();
278
        labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
279
        viewer.refresh();
280
    }
281

    
282

    
283
    private void generateMultiLinkSingleReads() {
284
        Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
285
        for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
286
            if(entry.getValue().size()>1){
287
                multiLinkSingleReads.add(entry.getKey());
288
            }
289
        }
290
        this.multiLinkSingleReads = multiLinkSingleReads;
291
    }
292

    
293
    /**
294
     * @return a set of {@link SingleRead}s that have multiple parents
295
     */
296
    public Set<SingleRead> getMultiLinkSingleReads() {
297
        return this.multiLinkSingleReads;
298
    }
299

    
300
    /* (non-Javadoc)
301
     * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
302
     */
303
    @Override
304
    public void selectionChanged(SelectionChangedEvent event) {
305
        this.selection  = event.getSelection();
306
    }
307

    
308
    public ISelection getSelection() {
309
        return selection;
310
    }
311

    
312
    public DerivateLabelProvider getLabelProvider() {
313
        return labelProvider;
314
    }
315

    
316
    /* (non-Javadoc)
317
     * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#postOperation(eu.etaxonomy.cdm.model.common.CdmBase)
318
     */
319
    @Override
320
    public boolean postOperation(CdmBase objectAffectedByOperation) {
321
        refreshTree();
322
        if(objectAffectedByOperation!=null){
323
            changed(objectAffectedByOperation);
324
        }
325
        return true;
326
    }
327

    
328
    /* (non-Javadoc)
329
     * @see eu.etaxonomy.taxeditor.operation.IPostOperationEnabled#onComplete()
330
     */
331
    @Override
332
    public boolean onComplete() {
333
        return true;
334
    }
335

    
336
}
(4-4/6)