Project

General

Profile

Download (8.6 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 java.util.ArrayList;
12
import java.util.List;
13

    
14
import javax.annotation.PostConstruct;
15
import javax.annotation.PreDestroy;
16
import javax.inject.Inject;
17

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

    
40
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
41
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
42
import eu.etaxonomy.cdm.api.service.ITermService;
43
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
44
import eu.etaxonomy.cdm.model.common.TermVocabulary;
45
import eu.etaxonomy.cdm.persistence.dto.TermDto;
46
import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
47
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
48
import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermSorter;
49
import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoContentProvider;
50
import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoLabelProvider;
51
import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
52
import eu.etaxonomy.taxeditor.event.EventUtility;
53
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
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.IPostOperationEnabled;
59
import eu.etaxonomy.taxeditor.store.CdmStore;
60
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
61
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
62

    
63
/**
64
 *
65
 * @author pplitzner
66
 * @since Aug 22, 2017
67
 *
68
 */
69
public class DefinedTermEditorE4 implements IConversationEnabled, IDirtyMarkable, IPostOperationEnabled,
70
IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContextListener {
71

    
72
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
73

    
74
	protected TreeViewer viewer;
75

    
76
	protected ConversationHolder conversation;
77

    
78
    @Inject
79
    private ESelectionService selService;
80

    
81
    @Inject
82
    private MDirtyable dirty;
83

    
84
    private ISelectionChangedListener selectionChangedListener;
85
	private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
86

    
87
    private TermEditorInput input =null;
88

    
89
    @Inject
90
    private MPart thisPart;
91

    
92
    private List<DefinedTermBase> changedTerms = new ArrayList<>();
93

    
94
	@Inject
95
	public DefinedTermEditorE4() {
96
	    CdmStore.getContextManager().addContextListener(this);
97
	}
98

    
99
	@PostConstruct
100
	public void createPartControl(Composite parent, EMenuService menuService,
101
	        IEclipseContext context) {
102
	    if (CdmStore.isActive()){
103
            if(conversation == null){
104
                conversation = CdmStore.createConversation();
105
            }
106
        }
107
        else{
108
            return;
109
        }
110
	    FillLayout layout = new FillLayout();
111
	    layout.marginHeight = 0;
112
	    layout.marginWidth = 0;
113
	    layout.type = SWT.VERTICAL;
114

    
115
	    parent.setLayout(layout);
116
	    viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI));
117
	    viewer.getControl().setLayoutData(LayoutConstants.FILL());
118
	    viewer.setContentProvider(new TermDtoContentProvider());
119
	    viewer.setLabelProvider(new TermDtoLabelProvider());
120
	    viewer.setComparator(new DefinedTermSorter());
121

    
122
	    Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer() };
123
	    viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListenerE4(viewer));
124
	    DefinedTermDropAdapterE4 dropListener = new DefinedTermDropAdapterE4(this);
125
	    ContextInjectionFactory.inject(dropListener, context);
126
        viewer.addDropSupport(dndOperations, transfers, dropListener);
127

    
128
	    //propagate selection
129
	    selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
130
	    viewer.addSelectionChangedListener(selectionChangedListener);
131

    
132
	    //create context menu
133
	    menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.termeditor");
134

    
135
	}
136

    
137
	@Override
138
	public boolean postOperation(Object objectAffectedByOperation) {
139
	    viewer.refresh();
140
		if(objectAffectedByOperation != null){
141
			StructuredSelection selection = new StructuredSelection(objectAffectedByOperation);
142
            viewer.setSelection(selection);
143
			viewer.expandToLevel(objectAffectedByOperation, 1);
144
		}
145
		return true;
146
	}
147

    
148
	public void init(TermEditorInput input){
149
	    this.input = input;
150

    
151
        input.initialiseVocabularies();
152
        viewer.setInput(input.getVocabularies());
153
        thisPart.setLabel(input.getName());
154
	}
155

    
156
	@Override
157
    @Persist
158
	public void save(IProgressMonitor monitor) {
159
		getConversationHolder().commit();
160
        changedTerms.forEach(term->CdmStore.getService(ITermService.class).merge(term));
161
        changedTerms.clear();
162
		input.merge();
163
		setDirty(false);
164
		input.initialiseVocabularies();
165
		viewer.refresh();
166
		EventUtility.postEvent(WorkbenchEventConstants.REFRESH_SUPPLEMENTAL, true);
167
	}
168

    
169
	public boolean isDirty() {
170
		return dirty.isDirty();
171
	}
172

    
173
	@Focus
174
	public void setFocus() {
175
	    if(viewer!=null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
176
	        viewer.getControl().setFocus();
177
	    }
178
	    if(conversation!=null){
179
	        conversation.bind();
180
	    }
181
		if(input!=null){
182
		    input.bind();
183
		}
184
	}
185

    
186
	@Override
187
	public void update(CdmDataChangeMap changeEvents) {
188
	}
189

    
190
	@Override
191
	public ConversationHolder getConversationHolder() {
192
		return conversation;
193
	}
194

    
195
	@Override
196
	public void changed(Object element) {
197
	    if(element instanceof DefinedTermBase){
198
	        DefinedTermBase definedTermBase = (DefinedTermBase) element;
199
            TermDto termDto = new TermDto(definedTermBase.getUuid(),
200
	                definedTermBase.getRepresentations(),
201
	                null,
202
	                null,
203
	                null);
204
	        viewer.update(termDto, null);
205
	        changedTerms.add(definedTermBase);
206
	    }
207
	    else if(element instanceof TermVocabulary){
208
	        TermVocabulary vocabulary = (TermVocabulary)element;
209
	        TermVocabularyDto vocabularyDto = new TermVocabularyDto(vocabulary.getUuid(), vocabulary.getRepresentations());
210
	        viewer.update(vocabularyDto, null);
211
	    }
212
		setDirty(true);
213
		viewer.update(element, null);
214
	}
215

    
216
	@Override
217
	public void forceDirty() {
218
	    changed(null);
219
	}
220

    
221
	public void setDirty(boolean dirty) {
222
		this.dirty.setDirty(dirty);
223
	}
224

    
225
	@Override
226
	public boolean onComplete() {
227
		return false;
228
	}
229

    
230
	public TreeViewer getViewer() {
231
		return viewer;
232
	}
233

    
234
	@PreDestroy
235
	public void dispose() {
236
	    if(conversation!=null){
237
	        conversation.unregisterForDataStoreChanges(this);
238
	        conversation.close();
239
	        conversation = null;
240
	    }
241
	    if(input!=null){
242
	        input.dispose();
243
	    }
244
	    this.dirty.setDirty(false);
245
	}
246

    
247
    public TermEditorInput getDefinedTermEditorInput() {
248
        return input;
249
    }
250

    
251
    @Override
252
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
253
    }
254

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

    
266
    @Override
267
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
268
    }
269

    
270
    @Override
271
    public void contextRefresh(IProgressMonitor monitor) {
272
    }
273

    
274
    @Override
275
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
276
    }
277

    
278
}
(3-3/4)