Project

General

Profile

Download (7.99 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2009 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
package eu.etaxonomy.taxeditor.editor.definedterm.e4;
10

    
11
import javax.annotation.PostConstruct;
12
import javax.annotation.PreDestroy;
13
import javax.inject.Inject;
14

    
15
import org.eclipse.core.runtime.IProgressMonitor;
16
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
17
import org.eclipse.e4.core.contexts.IEclipseContext;
18
import org.eclipse.e4.ui.di.Focus;
19
import org.eclipse.e4.ui.di.Persist;
20
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
21
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
22
import org.eclipse.e4.ui.services.EMenuService;
23
import org.eclipse.e4.ui.workbench.modeling.EPartService;
24
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
25
import org.eclipse.jface.viewers.ISelectionChangedListener;
26
import org.eclipse.jface.viewers.StructuredSelection;
27
import org.eclipse.jface.viewers.TreeViewer;
28
import org.eclipse.jface.viewers.Viewer;
29
import org.eclipse.jface.viewers.ViewerSorter;
30
import org.eclipse.swt.SWT;
31
import org.eclipse.swt.dnd.DND;
32
import org.eclipse.swt.dnd.Transfer;
33
import org.eclipse.swt.layout.FillLayout;
34
import org.eclipse.swt.widgets.Composite;
35
import org.eclipse.ui.IMemento;
36

    
37
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
38
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
39
import eu.etaxonomy.cdm.model.common.CdmBase;
40
import eu.etaxonomy.cdm.model.common.OrderedTermBase;
41
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
42
import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
43
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
44
import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
45
import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
46
import eu.etaxonomy.taxeditor.model.AbstractUtility;
47
import eu.etaxonomy.taxeditor.model.IContextListener;
48
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
49
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
50
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
51
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
52
import eu.etaxonomy.taxeditor.store.CdmStore;
53
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
54
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
55

    
56
/**
57
 *
58
 * @author pplitzner
59
 * @since Aug 22, 2017
60
 *
61
 */
62
public class DefinedTermEditorE4 implements IConversationEnabled, IDirtyMarkable, IPostOperationEnabled,
63
IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContextListener {
64

    
65
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
66

    
67
	protected TreeViewer viewer;
68

    
69
	protected ConversationHolder conversation;
70

    
71
    @Inject
72
    private ESelectionService selService;
73

    
74
    @Inject
75
    private MDirtyable dirty;
76

    
77
    private ISelectionChangedListener selectionChangedListener;
78
	private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
79

    
80
    private TermEditorInput input =null;
81

    
82
    @Inject
83
    private MPart thisPart;
84

    
85
	@Inject
86
	public DefinedTermEditorE4() {
87
	    CdmStore.getContextManager().addContextListener(this);
88
	}
89

    
90
	@PostConstruct
91
	public void createPartControl(Composite parent, EMenuService menuService,
92
	        IEclipseContext context) {
93
	    if (CdmStore.isActive()){
94
            if(conversation == null){
95
                conversation = CdmStore.createConversation();
96
            }
97
        }
98
        else{
99
            return;
100
        }
101
	    FillLayout layout = new FillLayout();
102
	    layout.marginHeight = 0;
103
	    layout.marginWidth = 0;
104
	    layout.type = SWT.VERTICAL;
105

    
106
	    parent.setLayout(layout);
107
	    viewer = new TreeViewer(parent);
108
	    viewer.getControl().setLayoutData(LayoutConstants.FILL());
109
	    viewer.setContentProvider(new TermContentProvider());
110
	    viewer.setLabelProvider(new TermLabelProvider());
111
	    viewer.setSorter(new DefinedTermSorter());
112

    
113
	    Transfer[] transfers = new Transfer[] { TermTransfer.getInstance() };
114
	    viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListenerE4(viewer));
115
	    DefinedTermDropAdapterE4 dropListener = new DefinedTermDropAdapterE4(this);
116
	    ContextInjectionFactory.inject(dropListener, context);
117
        viewer.addDropSupport(dndOperations, transfers, dropListener);
118

    
119
	    //propagate selection
120
	    selectionChangedListener = (event -> selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event)));
121
	    viewer.addSelectionChangedListener(selectionChangedListener);
122

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

    
126
	}
127

    
128
	@Override
129
	public boolean postOperation(CdmBase objectAffectedByOperation) {
130
		viewer.refresh();
131

    
132
		if(objectAffectedByOperation != null){
133
			viewer.setSelection(new StructuredSelection(objectAffectedByOperation));
134
		}
135
		setDirty(true);
136

    
137
		return true;
138
	}
139

    
140
	public void init(TermEditorInput input){
141
	    this.input = input;
142

    
143
        input.initialiseVocabularies();
144
        viewer.setInput(input.getVocabularies());
145
        thisPart.setLabel(input.getName());
146
	}
147

    
148
	@Override
149
    @Persist
150
	public void save(IProgressMonitor monitor) {
151
		getConversationHolder().commit();
152
		input.merge();
153
		setDirty(false);
154
		input.initialiseVocabularies();
155
		viewer.refresh();
156
	}
157

    
158
	public boolean isDirty() {
159
		return dirty.isDirty();
160
	}
161

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

    
175
	@Override
176
	public void update(CdmDataChangeMap changeEvents) {
177
	}
178

    
179
	@Override
180
	public ConversationHolder getConversationHolder() {
181
		return conversation;
182
	}
183

    
184
	@Override
185
	public void changed(Object element) {
186
		setDirty(true);
187
		viewer.update(element, null);
188
	}
189

    
190
	@Override
191
	public void forceDirty() {
192
	    changed(null);
193
	}
194

    
195
	public void setDirty(boolean dirty) {
196
		this.dirty.setDirty(dirty);
197
	}
198

    
199
	@Override
200
	public boolean onComplete() {
201
		return false;
202
	}
203

    
204
	public TreeViewer getViewer() {
205
		return viewer;
206
	}
207

    
208
	private class DefinedTermSorter extends ViewerSorter {
209

    
210
	    @Override
211
	    public int compare(Viewer viewer, Object e1, Object e2) {
212
	        // the comparison value in this method determines the
213
	        // location <-> add term method used in the MoveDefinedTermOperation
214
	        // execute call
215
	        if(e1 instanceof OrderedTermBase && e2 instanceof OrderedTermBase) {
216
	            OrderedTermBase otbe1 = (OrderedTermBase)e1;
217
	            OrderedTermBase otbe2 = (OrderedTermBase)e2;
218
	            if(otbe1.getOrderIndex() == otbe2.getOrderIndex()) {
219
	                return 0;
220
	            } else if (otbe1.getOrderIndex() < otbe2.getOrderIndex()){
221
	            	return -1;
222
	            } else{
223
	            	return 1;
224
	            }
225
	        } else {
226
	            return super.compare(viewer, e1, e2);
227
	        }
228
	    }
229
	}
230

    
231
	@PreDestroy
232
	public void dispose() {
233
	    if(input!=null){
234
	        input.dispose();
235
	    }
236
	}
237

    
238
    public TermEditorInput getDefinedTermEditorInput() {
239
        return input;
240
    }
241

    
242
    /**
243
     * {@inheritDoc}
244
     */
245
    @Override
246
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
247
    }
248

    
249
    /**
250
     * {@inheritDoc}
251
     */
252
    @Override
253
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
254
        //close view when workbench closes
255
        try{
256
            thisPart.getContext().get(EPartService.class).hidePart(thisPart);
257
        }
258
        catch(Exception e){
259
            //nothing
260
        }
261
    }
262

    
263
    /**
264
     * {@inheritDoc}
265
     */
266
    @Override
267
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
268
    }
269

    
270
    /**
271
     * {@inheritDoc}
272
     */
273
    @Override
274
    public void contextRefresh(IProgressMonitor monitor) {
275
    }
276

    
277
    /**
278
     * {@inheritDoc}
279
     */
280
    @Override
281
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
282
    }
283

    
284
}
(3-3/4)