Project

General

Profile

Download (8.95 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.ArrayList;
13
import java.util.Arrays;
14
import java.util.HashMap;
15
import java.util.List;
16
import java.util.Map;
17

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

    
22
import org.eclipse.core.runtime.IProgressMonitor;
23
import org.eclipse.e4.ui.di.Focus;
24
import org.eclipse.e4.ui.di.Persist;
25
import org.eclipse.e4.ui.di.UISynchronize;
26
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
27
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
28
import org.eclipse.e4.ui.services.EMenuService;
29
import org.eclipse.e4.ui.workbench.modeling.EPartService;
30
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
31
import org.eclipse.jface.util.LocalSelectionTransfer;
32
import org.eclipse.jface.viewers.ISelectionChangedListener;
33
import org.eclipse.jface.viewers.IStructuredSelection;
34
import org.eclipse.jface.viewers.SelectionChangedEvent;
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.common.CdmBase;
46
import eu.etaxonomy.cdm.model.description.FeatureNode;
47
import eu.etaxonomy.cdm.model.description.FeatureTree;
48
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
49
import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
50
import eu.etaxonomy.taxeditor.featuretree.FeatureNodeTransfer;
51
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeContentProvider;
52
import eu.etaxonomy.taxeditor.featuretree.FeatureTreeLabelProvider;
53
import eu.etaxonomy.taxeditor.model.AbstractUtility;
54
import eu.etaxonomy.taxeditor.model.IContextListener;
55
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
56
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
57
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
58
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
59
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
60
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
61
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
62
import eu.etaxonomy.taxeditor.store.CdmStore;
63
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
64
import eu.etaxonomy.taxeditor.workbench.part.IE4ViewerPart;
65

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

    
76
    private ConversationHolder conversation;
77

    
78
    private ICdmEntitySession cdmEntitySession;
79

    
80
    @Inject
81
    private ESelectionService selService;
82

    
83
    @Inject
84
    private MDirtyable dirty;
85

    
86
    @Inject
87
    private MPart thisPart;
88

    
89
    @Inject
90
    private UISynchronize sync;
91

    
92
    private TreeViewer viewer;
93

    
94
    private List<AbstractPostOperation> operations = new ArrayList<>();
95

    
96
    @Inject
97
    public FeatureTreeEditor() {
98
        CdmStore.getContextManager().addContextListener(this);
99
    }
100

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

    
115
        int ops = DND.DROP_COPY | DND.DROP_MOVE;
116
        Transfer[] transfers = new Transfer[] {
117
                FeatureNodeTransfer.getInstance(),
118
                TermTransfer.getInstance(),
119
                LocalSelectionTransfer.getTransfer()};
120
        viewer.addDragSupport(ops, transfers, new FeatureNodeDragListener(viewer));
121
        viewer.addDropSupport(ops, transfers, new FeatureNodeDropAdapter(dirty, viewer));
122
        viewer.addSelectionChangedListener(this);
123

    
124
        List<FeatureTree> trees = CdmStore.getService(IFeatureTreeService.class).list(FeatureTree.class, null, null, null, null);
125
        viewer.setInput(trees);
126

    
127
        //create context menu
128
        menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.featureTreeEditor");
129
    }
130

    
131
    private void initSession(){
132
        if(conversation == null){
133
            conversation = CdmStore.createConversation();
134
        }
135
        if(cdmEntitySession==null){
136
            cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
137
        }
138
    }
139

    
140
    private void clearSession() {
141
        if(conversation!=null){
142
            conversation.close();
143
            conversation = null;
144
        }
145
        if(cdmEntitySession != null) {
146
            cdmEntitySession.dispose();
147
            cdmEntitySession = null;
148
        }
149
        dirty.setDirty(false);
150
    }
151

    
152
	public void setDirty(boolean isDirty){
153
	    this.dirty.setDirty(isDirty);
154
	}
155

    
156
	public boolean isDirty(){
157
	    return dirty.isDirty();
158
	}
159

    
160
	public void addOperation(AbstractPostOperation operation){
161
	    operations.add(operation);
162
	}
163

    
164
	/** {@inheritDoc} */
165
	@Override
166
	public void selectionChanged(SelectionChangedEvent event) {
167
		//propagate selection
168
		selService.setSelection(event.getSelection());
169
	}
170

    
171
	@Focus
172
	public void focus(){
173
	    if(viewer!=null){
174
	        viewer.getControl().setFocus();
175
	    }
176
        if(conversation!=null && !conversation.isBound()){
177
            conversation.bind();
178
        }
179
        if(cdmEntitySession != null) {
180
            cdmEntitySession.bind();
181
        }
182
	}
183

    
184
	@Override
185
    public void refresh(){
186
	    viewer.refresh();
187
	}
188

    
189
	public TreeViewer getViewer(){
190
	    return viewer;
191
	}
192

    
193
	/**
194
	 * {@inheritDoc}
195
	 */
196
	@Override
197
	public IStructuredSelection getSelection() {
198
	    return (IStructuredSelection) viewer.getSelection();
199
	}
200

    
201
	/**
202
	 * {@inheritDoc}
203
	 */
204
	@Override
205
	public ConversationHolder getConversationHolder() {
206
	    return conversation;
207
	}
208

    
209
	@Override
210
    @Persist
211
	public void save(IProgressMonitor monitor){
212
        if (!conversation.isBound()) {
213
            conversation.bind();
214
        }
215

    
216
        // commit the conversation and start a new transaction immediately
217
        conversation.commit(true);
218
        operations.forEach(operation->AbstractUtility.executeOperation(operation, sync));
219
        operations.clear();
220

    
221
//        List<FeatureTree> trees = (List<FeatureTree>) viewer.getInput();
222
//        CdmStore.getService(IFeatureTreeService.class).merge(trees);
223

    
224
        this.setDirty(false);
225
	}
226

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

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

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

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

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

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

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

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

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

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

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

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

    
298
    /**
299
     * {@inheritDoc}
300
     */
301
    @Override
302
    public boolean postOperation(CdmBase objectAffectedByOperation) {
303
        return false;
304
    }
305

    
306
    /**
307
     * {@inheritDoc}
308
     */
309
    @Override
310
    public boolean onComplete() {
311
        return false;
312
    }
313

    
314
}
(3-3/5)