Project

General

Profile

Download (10.9 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

    
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.IMemento;
26
import org.eclipse.ui.PartInitException;
27
import org.eclipse.ui.part.EditorPart;
28

    
29
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
30
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
31
import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;
32
import eu.etaxonomy.cdm.model.molecular.Sequence;
33
import eu.etaxonomy.cdm.model.molecular.SingleRead;
34
import eu.etaxonomy.cdm.model.occurrence.FieldUnit;
35
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
36
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
37
import eu.etaxonomy.taxeditor.model.IContextListener;
38
import eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider;
39
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
40
import eu.etaxonomy.taxeditor.model.IPartContentHasFactualData;
41
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
42
import eu.etaxonomy.taxeditor.store.CdmStore;
43
import eu.etaxonomy.taxeditor.view.derivateSearch.DerivateLabelProvider;
44

    
45
/**
46
 * Displays the derivate hierarchy of all derivates having one single {@link FieldUnit} as root.
47
 *
48
 */
49
public class DerivateView extends EditorPart implements IPartContentHasFactualData, IDirtyMarkableSelectionProvider,
50
        IConversationEnabled, IPartContentHasDetails, IPartContentHasSupplementalData, IContextListener {
51

    
52
	/**
53
     * Key used for storing a single DerivateView in a memento
54
     */
55
    private static final String DERIVATE_VIEW_MEMENTO_KEY = "derivateView";
56

    
57
    /**
58
     * Key to to group mementos for every single DerivateView
59
     */
60
    private static final String DERIVATE_VIEWS_MEMENTO_KEY = "derivateViews";
61

    
62
    public static final String ID = "eu.etaxonomy.taxeditor.editor.view.derivate.DerivateView";
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
    /**
77
     * Default constructor
78
     */
79
    public DerivateView() {
80
        CdmStore.getContextManager().addContextListener(this);
81
    }
82

    
83
    /* (non-Javadoc)
84
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
85
     */
86
    @Override
87
    public void createPartControl(Composite parent) {
88
        viewer = new TreeViewer(new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
89
        viewer.setContentProvider(new DerivateContentProvider());
90
        labelProvider = new DerivateLabelProvider();
91
        labelProvider.setConversation(conversation);
92
        viewer.setLabelProvider(labelProvider);
93
        viewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
94
        // Propagate selection from viewer
95
        getSite().setSelectionProvider(viewer);
96

    
97
        //create context menu
98
        MenuManager menuManager = new MenuManager();
99
        getSite().registerContextMenu(menuManager, viewer);
100
        Control control = viewer.getControl();
101
        Menu menu = menuManager.createContextMenu(control);
102
        control.setMenu(menu);
103

    
104
        generateMultiLinkSingleReads();
105
        labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
106
        IEditorInput editorInput = getEditorInput();
107
        viewer.setInput(editorInput);
108
        if(editorInput instanceof DerivateViewEditorInput){
109
            SpecimenOrObservationBase<?> specimen = ((DerivateViewEditorInput) editorInput).getDerivate();
110
            SpecimenOrObservationBase<?> rootElement = ((DerivateViewEditorInput) editorInput).getRootElement();
111
            setPartName(labelProvider.getDerivateText(rootElement));
112
            viewer.setSelection(new StructuredSelection(new TreeNode(specimen)));
113
        }
114

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

    
121
    /* (non-Javadoc)
122
     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
123
     */
124
    @Override
125
    public void doSave(IProgressMonitor monitor) {
126
        monitor.beginTask("Saving Derivates", 3);
127
        if (!conversation.isBound()) {
128
            conversation.bind();
129
        }
130
        monitor.worked(1);
131

    
132
        // commit the conversation and start a new transaction immediately
133
        conversation.commit(true);
134
        monitor.worked(1);
135

    
136
        this.setDirty(false);
137
        monitor.worked(1);
138
        monitor.done();
139
        firePropertyChange(PROP_DIRTY);
140
        refreshTree();
141
    }
142

    
143
    /* (non-Javadoc)
144
     * @see org.eclipse.ui.part.EditorPart#doSaveAs()
145
     */
146
    @Override
147
    public void doSaveAs() {
148
    }
149

    
150
    /* (non-Javadoc)
151
     * @see org.eclipse.ui.part.EditorPart#getTitleToolTip()
152
     */
153
    @Override
154
    public String getTitleToolTip() {
155
        return "Derivate View";
156
    }
157

    
158
    /* (non-Javadoc)
159
     * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput)
160
     */
161
    @Override
162
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
163
        setSite(site);
164
        setInput(input);
165
        if(input instanceof DerivateViewEditorInput){
166
            conversation = ((DerivateViewEditorInput) input).getConversationHolder();
167
        }
168
    }
169

    
170
    /* (non-Javadoc)
171
     * @see org.eclipse.ui.part.EditorPart#isDirty()
172
     */
173
    @Override
174
    public boolean isDirty() {
175
        return isDirty;
176
    }
177

    
178
    /**
179
     * @param isDirty the isDirty to set
180
     */
181
    public void setDirty(boolean isDirty) {
182
        this.isDirty = isDirty;
183
    }
184

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

    
193

    
194
    /* (non-Javadoc)
195
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
196
     */
197
    @Override
198
    public void setFocus() {
199
        viewer.getControl().setFocus();
200
        //make sure to bind again if maybe in another view the conversation was unbound
201
        if(!conversation.isBound()){
202
            conversation.bind();
203
        }
204
    }
205

    
206
    /* (non-Javadoc)
207
     * @see eu.etaxonomy.cdm.persistence.hibernate.ICdmPostDataChangeObserver#update(eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap)
208
     */
209
    @Override
210
    public void update(CdmDataChangeMap changeEvents) {
211
    }
212

    
213
    /* (non-Javadoc)
214
     * @see eu.etaxonomy.cdm.api.conversation.IConversationEnabled#getConversationHolder()
215
     */
216
    @Override
217
    public ConversationHolder getConversationHolder() {
218
        return conversation;
219
    }
220

    
221
    /**
222
     * @return the viewer
223
     */
224
    public TreeViewer getViewer() {
225
        return viewer;
226
    }
227

    
228
    /* (non-Javadoc)
229
     * @see eu.etaxonomy.taxeditor.model.IDirtyMarkableSelectionProvider#changed(java.lang.Object)
230
     */
231
    @Override
232
    public void changed(Object element) {
233
        setDirty(true);
234
        firePropertyChange(IEditorPart.PROP_DIRTY);
235
        viewer.refresh();
236
    }
237

    
238
    /**
239
     * Refreshes the derivate hierarchy tree
240
     */
241
    public void refreshTree(){
242
        generateMultiLinkSingleReads();
243
        labelProvider.setMultiLinkSingleReads(multiLinkSingleReads);
244
        viewer.refresh();
245
    }
246

    
247
    private void generateMultiLinkSingleReads() {
248
        Set<SingleRead> multiLinkSingleReads = new HashSet<SingleRead>();
249
        for(Entry<SingleRead, Collection<Sequence>> entry:CdmStore.getService(ISequenceService.class).getSingleReadSequencesMap().entrySet()){
250
            if(entry.getValue().size()>1){
251
                multiLinkSingleReads.add(entry.getKey());
252
            }
253
        }
254
        this.multiLinkSingleReads = multiLinkSingleReads;
255
    }
256

    
257
    /**
258
     * @return a set of {@link SingleRead}s that have multiple parents
259
     */
260
    public Set<SingleRead> getMultiLinkSingleReads() {
261
        return this.multiLinkSingleReads;
262
    }
263

    
264
    /* (non-Javadoc)
265
     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextAboutToStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
266
     */
267
    @Override
268
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
269
    }
270

    
271
    /* (non-Javadoc)
272
     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStop(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
273
     */
274
    @Override
275
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
276
    }
277

    
278
    /* (non-Javadoc)
279
     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextStart(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
280
     */
281
    @Override
282
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
283
//        if(memento == null){
284
//            return;
285
//        }
286
//        IMemento editorMementos = memento.getChild(DERIVATE_VIEW_MEMENTO_KEY);
287
//            DerivateViewEditorInput input = new DerivateViewEditorInput(UUID.fromString(editorInput.getString(DerivateViewEditorInput.UUID_MEMENTO_KEY)));
288
//                try {
289
//                    EditorUtil.open(input);
290
//                } catch (PartInitException e) {
291
//                    AbstractUtility.error(getClass(), "Error opening an editor window", e);
292
//                }
293
    }
294

    
295
    /* (non-Javadoc)
296
     * @see eu.etaxonomy.taxeditor.model.IContextListener#contextRefresh(org.eclipse.core.runtime.IProgressMonitor)
297
     */
298
    @Override
299
    public void contextRefresh(IProgressMonitor monitor) {
300
    }
301

    
302
    /* (non-Javadoc)
303
     * @see eu.etaxonomy.taxeditor.model.IContextListener#workbenchShutdown(org.eclipse.ui.IMemento, org.eclipse.core.runtime.IProgressMonitor)
304
     */
305
    @Override
306
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
307
//        if (!conversation.isBound()) {
308
//            conversation.bind();
309
//        }
310
//        conversation.close();
311
//        if(memento == null){
312
//            return;
313
//        }
314
//
315
//        IEditorInput input = getEditorInput();
316
//        if(input instanceof IPersistable){
317
//            memento.createChild(DERIVATE_VIEW_MEMENTO_KEY);
318
//            ((IPersistable) input).saveState(memento);
319
//        }
320
    }
321

    
322
}
(4-4/6)