Project

General

Profile

Download (6.67 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.ui.di.Focus;
17
import org.eclipse.e4.ui.di.Persist;
18
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
19
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
20
import org.eclipse.e4.ui.services.EMenuService;
21
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
22
import org.eclipse.jface.viewers.ISelectionChangedListener;
23
import org.eclipse.jface.viewers.StructuredSelection;
24
import org.eclipse.jface.viewers.TreeViewer;
25
import org.eclipse.jface.viewers.Viewer;
26
import org.eclipse.jface.viewers.ViewerSorter;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.dnd.DND;
29
import org.eclipse.swt.dnd.Transfer;
30
import org.eclipse.swt.layout.FillLayout;
31
import org.eclipse.swt.widgets.Composite;
32

    
33
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
34
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
35
import eu.etaxonomy.cdm.model.common.CdmBase;
36
import eu.etaxonomy.cdm.model.common.OrderedTermBase;
37
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
38
import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
39
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
40
import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
41
import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
42
import eu.etaxonomy.taxeditor.model.AbstractUtility;
43
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
44
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
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.ui.element.LayoutConstants;
49
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
50

    
51
/**
52
 *
53
 * @author pplitzner
54
 * @since Aug 22, 2017
55
 *
56
 */
57
public class DefinedTermEditorE4 implements IConversationEnabled, IDirtyMarkable, IPostOperationEnabled,
58
IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart {
59

    
60
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
61

    
62
	protected TreeViewer viewer;
63

    
64
	protected ConversationHolder conversation;
65

    
66
    @Inject
67
    private ESelectionService selService;
68

    
69
    @Inject
70
    private MDirtyable dirty;
71

    
72
    private ISelectionChangedListener selectionChangedListener;
73
	private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
74

    
75
    private TermEditorInput input =null;
76

    
77
    @Inject
78
    private MPart thisPart;
79

    
80
	@Inject
81
	public DefinedTermEditorE4() {
82
	}
83

    
84
	@PostConstruct
85
	public void createPartControl(Composite parent, EMenuService menuService) {
86
	    if (CdmStore.isActive()){
87
            if(conversation == null){
88
                conversation = CdmStore.createConversation();
89
            }
90
        }
91
        else{
92
            return;
93
        }
94
	    FillLayout layout = new FillLayout();
95
	    layout.marginHeight = 0;
96
	    layout.marginWidth = 0;
97
	    layout.type = SWT.VERTICAL;
98

    
99
	    parent.setLayout(layout);
100
	    viewer = new TreeViewer(parent);
101
	    viewer.getControl().setLayoutData(LayoutConstants.FILL());
102
	    viewer.setContentProvider(new TermContentProvider());
103
	    viewer.setLabelProvider(new TermLabelProvider());
104
	    viewer.setSorter(new DefinedTermSorter());
105

    
106
	    Transfer[] transfers = new Transfer[] { TermTransfer.getInstance() };
107
	    viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListenerE4(viewer));
108
	    viewer.addDropSupport(dndOperations, transfers, new DefinedTermDropAdapterE4(this));
109

    
110
	    //propagate selection
111
	    selectionChangedListener = (event -> selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event)));
112
	    viewer.addSelectionChangedListener(selectionChangedListener);
113

    
114
	    //create context menu
115
	    menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.termeditor");
116

    
117
	}
118

    
119
	@Override
120
	public boolean postOperation(CdmBase objectAffectedByOperation) {
121
		viewer.refresh();
122

    
123
		if(objectAffectedByOperation != null){
124
			viewer.setSelection(new StructuredSelection(objectAffectedByOperation));
125
		}
126
		setDirty(true);
127

    
128
		return true;
129
	}
130

    
131
	public void init(TermEditorInput input){
132
	    this.input = input;
133

    
134
        input.initialiseVocabularies();
135
        viewer.setInput(input.getVocabularies());
136
        thisPart.setLabel(input.getName());
137
	}
138

    
139
	@Override
140
    @Persist
141
	public void save(IProgressMonitor monitor) {
142
		getConversationHolder().commit();
143
		input.merge();
144
		setDirty(false);
145
		input.initialiseVocabularies();
146
		viewer.refresh();
147
	}
148

    
149
	public boolean isDirty() {
150
		return dirty.isDirty();
151
	}
152

    
153
	@Focus
154
	public void setFocus() {
155
	    if(viewer!=null){
156
	        viewer.getControl().setFocus();
157
	    }
158
	    if(conversation!=null){
159
	        conversation.bind();
160
	    }
161
		if(input!=null){
162
		    input.bind();
163
		}
164
	}
165

    
166
	@Override
167
	public void update(CdmDataChangeMap changeEvents) {
168
	}
169

    
170
	@Override
171
	public ConversationHolder getConversationHolder() {
172
		return conversation;
173
	}
174

    
175
	@Override
176
	public void changed(Object element) {
177
		setDirty(true);
178
		viewer.update(element, null);
179
	}
180

    
181
	@Override
182
	public void forceDirty() {
183
	    changed(null);
184
	}
185

    
186
	public void setDirty(boolean dirty) {
187
		this.dirty.setDirty(dirty);
188
	}
189

    
190
	@Override
191
	public boolean onComplete() {
192
		return false;
193
	}
194

    
195
	public TreeViewer getViewer() {
196
		return viewer;
197
	}
198

    
199
	private class DefinedTermSorter extends ViewerSorter {
200

    
201
	    @Override
202
	    public int compare(Viewer viewer, Object e1, Object e2) {
203
	        // the comparison value in this method determines the
204
	        // location <-> add term method used in the MoveDefinedTermOperation
205
	        // execute call
206
	        if(e1 instanceof OrderedTermBase && e2 instanceof OrderedTermBase) {
207
	            OrderedTermBase otbe1 = (OrderedTermBase)e1;
208
	            OrderedTermBase otbe2 = (OrderedTermBase)e2;
209
	            if(otbe1.getOrderIndex() == otbe2.getOrderIndex()) {
210
	                return 0;
211
	            } else if (otbe1.getOrderIndex() < otbe2.getOrderIndex()){
212
	            	return -1;
213
	            } else{
214
	            	return 1;
215
	            }
216
	        } else {
217
	            return super.compare(viewer, e1, e2);
218
	        }
219
	    }
220
	}
221

    
222
	@PreDestroy
223
	public void dispose() {
224
	    if(input!=null){
225
	        input.dispose();
226
	    }
227
	}
228

    
229
    public TermEditorInput getDefinedTermEditorInput() {
230
        return input;
231
    }
232

    
233
}
(3-3/4)