Project

General

Profile

Download (9.29 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9

    
10
package eu.etaxonomy.taxeditor.featuretree.e4;
11

    
12
import java.util.Arrays;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16

    
17
import javax.annotation.PostConstruct;
18
import javax.annotation.PreDestroy;
19
import javax.inject.Inject;
20

    
21
import org.eclipse.core.runtime.IProgressMonitor;
22
import org.eclipse.e4.ui.di.Focus;
23
import org.eclipse.e4.ui.di.Persist;
24
import org.eclipse.e4.ui.di.UISynchronize;
25
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
26
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
27
import org.eclipse.e4.ui.services.EMenuService;
28
import org.eclipse.e4.ui.workbench.modeling.EPartService;
29
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
30
import org.eclipse.jface.util.LocalSelectionTransfer;
31
import org.eclipse.jface.viewers.ISelectionChangedListener;
32
import org.eclipse.jface.viewers.IStructuredSelection;
33
import org.eclipse.jface.viewers.SelectionChangedEvent;
34
import org.eclipse.jface.viewers.StructuredSelection;
35
import org.eclipse.jface.viewers.TreeViewer;
36
import org.eclipse.swt.dnd.DND;
37
import org.eclipse.swt.dnd.Transfer;
38
import org.eclipse.swt.layout.FillLayout;
39
import org.eclipse.swt.widgets.Composite;
40
import org.eclipse.ui.IMemento;
41

    
42
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
43
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
44
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
45
import eu.etaxonomy.cdm.model.description.FeatureNode;
46
import eu.etaxonomy.cdm.model.description.FeatureTree;
47
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
48
import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
49
import eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer;
50
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
51
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
52
import eu.etaxonomy.taxeditor.model.IContextListener;
53
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
54
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
55
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
56
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
57
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
58
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
59
import eu.etaxonomy.taxeditor.store.CdmStore;
60
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
61
import eu.etaxonomy.taxeditor.workbench.part.IE4ViewerPart;
62

    
63
/**
64
 *
65
 * @author pplitzner
66
 * @date 06.06.2017
67
 *
68
 */
69
public class FeatureTreeEditor implements ICdmEntitySessionEnabled, ISelectionChangedListener,
70
        IE4ViewerPart, IE4SavablePart, IPartContentHasDetails, IPartContentHasSupplementalData,
71
        IContextListener, IConversationEnabled, IDirtyMarkable, IPostOperationEnabled {
72

    
73
    private ConversationHolder conversation;
74

    
75
    private ICdmEntitySession cdmEntitySession;
76

    
77
    @Inject
78
    private ESelectionService selService;
79

    
80
    @Inject
81
    private MDirtyable dirty;
82

    
83
    @Inject
84
    private MPart thisPart;
85

    
86
    @Inject
87
    private UISynchronize sync;
88

    
89
    private TreeViewer viewer;
90

    
91
    @Inject
92
    public FeatureTreeEditor() {
93
        CdmStore.getContextManager().addContextListener(this);
94
    }
95

    
96
	/** {@inheritDoc} */
97
    @PostConstruct
98
    public void createControl(Composite parent, EMenuService menuService){
99
        if (CdmStore.isActive()){
100
            initSession();
101
        }
102
        else{
103
            return;
104
        }
105
        parent.setLayout(new FillLayout());
106
        viewer = new TreeViewer(parent);
107
        viewer.setContentProvider(new FeatureTreeContentProvider());
108
        viewer.setLabelProvider(new FeatureTreeLabelProvider());
109

    
110
        int ops = DND.DROP_COPY | DND.DROP_MOVE;
111
        Transfer[] transfers = new Transfer[] {
112
                FeatureNodeTransfer.getInstance(),
113
                TermTransfer.getInstance(),
114
                LocalSelectionTransfer.getTransfer()};
115
        viewer.addDragSupport(ops, transfers, new FeatureNodeDragListener(viewer));
116
        viewer.addDropSupport(ops, transfers, new FeatureNodeDropAdapter(dirty, this, viewer));
117
        viewer.addSelectionChangedListener(this);
118

    
119
        List<FeatureTree> trees = CdmStore.getService(IFeatureTreeService.class).list(FeatureTree.class, null, null, null, null);
120
        viewer.setInput(trees);
121

    
122
        //create context menu
123
        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.featureTreeEditor");
124
    }
125

    
126
    private void initSession(){
127
        if(conversation == null){
128
            conversation = CdmStore.createConversation();
129
        }
130
        if(cdmEntitySession==null){
131
            cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
132
        }
133
    }
134

    
135
    private void clearSession() {
136
        if(conversation!=null){
137
            conversation.close();
138
            conversation = null;
139
        }
140
        if(cdmEntitySession != null) {
141
            cdmEntitySession.dispose();
142
            cdmEntitySession = null;
143
        }
144
        dirty.setDirty(false);
145
    }
146

    
147
	public void setDirty(boolean isDirty){
148
	    this.dirty.setDirty(isDirty);
149
	}
150

    
151
	@Override
152
    public boolean isDirty(){
153
	    return dirty.isDirty();
154
	}
155

    
156
	/** {@inheritDoc} */
157
	@Override
158
	public void selectionChanged(SelectionChangedEvent event) {
159
		//propagate selection
160
		selService.setSelection(event.getSelection());
161
	}
162

    
163
	@Focus
164
	public void focus(){
165
	    if(viewer!=null){
166
	        viewer.getControl().setFocus();
167
	    }
168
        if(conversation!=null && !conversation.isBound()){
169
            conversation.bind();
170
        }
171
        if(cdmEntitySession != null) {
172
            cdmEntitySession.bind();
173
        }
174
	}
175

    
176
	@Override
177
    public void refresh(){
178
	    viewer.refresh();
179
	}
180

    
181
	public TreeViewer getViewer(){
182
	    return viewer;
183
	}
184

    
185
	/**
186
	 * {@inheritDoc}
187
	 */
188
	@Override
189
	public IStructuredSelection getSelection() {
190
	    return (IStructuredSelection) viewer.getSelection();
191
	}
192

    
193
	/**
194
	 * {@inheritDoc}
195
	 */
196
	@Override
197
	public ConversationHolder getConversationHolder() {
198
	    return conversation;
199
	}
200

    
201
	@Override
202
    @Persist
203
	public void save(IProgressMonitor monitor){
204
        if (!conversation.isBound()) {
205
            conversation.bind();
206
        }
207

    
208
        // commit the conversation and start a new transaction immediately
209
        conversation.commit(true);
210

    
211
        CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(getRootEntities());
212

    
213
        initialiseRootEntities();
214

    
215
        this.setDirty(false);
216
	}
217

    
218
    private void initialiseRootEntities() {
219
        Object[] expandedElements = viewer.getExpandedElements();
220
        viewer.getTree().removeAll();
221
        List<FeatureTree> trees = CdmStore.getService(IFeatureTreeService.class).list(FeatureTree.class, null, null, null, null);
222
        viewer.setInput(trees);
223
        viewer.setExpandedElements(expandedElements);
224
    }
225

    
226
	@PreDestroy
227
	public void dispose(){
228
	    selService.setSelection(null);
229
	    clearSession();
230
	}
231

    
232
    @Override
233
    public ICdmEntitySession getCdmEntitySession() {
234
        return cdmEntitySession;
235
    }
236

    
237
    @Override
238
    public Map<Object, List<String>> getPropertyPathsMap() {
239
        List<String> propertyPaths = Arrays.asList(new String[] {
240
                "children", //$NON-NLS-1$
241
                "feature", //$NON-NLS-1$
242
                "featureTree", //$NON-NLS-1$
243
        });
244
        Map<Object, List<String>> propertyPathMap =
245
                new HashMap<Object, List<String>>();
246
        propertyPathMap.put(FeatureNode.class,propertyPaths);
247
        return propertyPathMap;
248
    }
249

    
250
    @Override
251
    public List<FeatureTree> getRootEntities() {
252
        return (List<FeatureTree>) viewer.getInput();
253
    }
254

    
255
    @Override
256
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
257
    }
258

    
259
    @Override
260
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
261
        //close view when workbench closes
262
        try{
263
            thisPart.getContext().get(EPartService.class).hidePart(thisPart);
264
        }
265
        catch(Exception e){
266
            //nothing
267
        }
268
    }
269

    
270
    @Override
271
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
272
    }
273

    
274
    @Override
275
    public void contextRefresh(IProgressMonitor monitor) {
276
    }
277

    
278
    @Override
279
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
280
    }
281

    
282
    @Override
283
    public void update(CdmDataChangeMap arg0) {
284
    }
285

    
286
    @Override
287
    public void changed(Object element) {
288
        dirty.setDirty(true);
289
        viewer.refresh();
290
    }
291

    
292
    @Override
293
    public void forceDirty() {
294
        dirty.setDirty(true);
295
    }
296

    
297
    /**
298
     * {@inheritDoc}
299
     */
300
    @Override
301
    public boolean postOperation(Object objectAffectedByOperation) {
302
        initialiseRootEntities();
303
        viewer.refresh();
304
        if(objectAffectedByOperation instanceof FeatureNode){
305
            FeatureNode node = (FeatureNode)objectAffectedByOperation;
306
            viewer.expandToLevel(node.getFeatureTree(), 1);
307
            StructuredSelection selection = new StructuredSelection(objectAffectedByOperation);
308
            viewer.setSelection(selection);
309
        }
310
        return true;
311
    }
312

    
313
    /**
314
     * {@inheritDoc}
315
     */
316
    @Override
317
    public boolean onComplete() {
318
        return false;
319
    }
320

    
321
}
(3-3/4)