Project

General

Profile

Download (9 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.HashSet;
12
import java.util.Set;
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.api.service.IVocabularyService;
44
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
45
import eu.etaxonomy.cdm.model.common.TermBase;
46
import eu.etaxonomy.cdm.model.common.TermVocabulary;
47
import eu.etaxonomy.cdm.persistence.dto.TermDto;
48
import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
49
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
50
import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermSorter;
51
import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoContentProvider;
52
import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoLabelProvider;
53
import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
54
import eu.etaxonomy.taxeditor.event.EventUtility;
55
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
56
import eu.etaxonomy.taxeditor.model.IContextListener;
57
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
58
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
59
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
60
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
61
import eu.etaxonomy.taxeditor.store.CdmStore;
62
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
63
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
64

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

    
74
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor"; //$NON-NLS-1$
75

    
76
	protected TreeViewer viewer;
77

    
78
	protected ConversationHolder conversation;
79

    
80
    @Inject
81
    private ESelectionService selService;
82

    
83
    @Inject
84
    private MDirtyable dirty;
85

    
86
    private ISelectionChangedListener selectionChangedListener;
87
	private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
88

    
89
    private TermEditorInput input =null;
90

    
91
    @Inject
92
    private MPart thisPart;
93

    
94
    private Set<TermBase> changedTerms = new HashSet<>();
95

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

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

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

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

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

    
134
	    //create context menu
135
	    menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.termeditor"); //$NON-NLS-1$
136

    
137
	}
138

    
139
	@Override
140
	public boolean postOperation(Object objectAffectedByOperation) {
141
	    if(objectAffectedByOperation instanceof TermVocabulary){
142
	        input.initialiseVocabularies();
143
	    }
144
	    viewer.refresh();
145
		if(objectAffectedByOperation != null){
146
			StructuredSelection selection = new StructuredSelection(objectAffectedByOperation);
147
            viewer.setSelection(selection);
148
			viewer.expandToLevel(objectAffectedByOperation, 1);
149
		}
150
		return true;
151
	}
152

    
153
	public void init(TermEditorInput input){
154
	    this.input = input;
155

    
156
        input.initialiseVocabularies();
157
        viewer.setInput(input.getVocabularies());
158
        thisPart.setLabel(input.getName());
159
	}
160

    
161
	@Override
162
    @Persist
163
	public void save(IProgressMonitor monitor) {
164
		getConversationHolder().commit();
165
		for(TermBase term:changedTerms){
166
            if(term.isInstanceOf(DefinedTermBase.class)){
167
                CdmStore.getService(ITermService.class).merge((DefinedTermBase) term);
168
            }
169
            else if(term.isInstanceOf(TermVocabulary.class)){
170
                CdmStore.getService(IVocabularyService.class).merge((TermVocabulary) term);
171
            }
172
		}
173
        changedTerms.clear();
174
		setDirty(false);
175
		input.initialiseVocabularies();
176
		viewer.refresh();
177
		EventUtility.postEvent(WorkbenchEventConstants.REFRESH_SUPPLEMENTAL, true);
178
	}
179

    
180
	@Override
181
    public boolean isDirty() {
182
		return dirty.isDirty();
183
	}
184

    
185
	@Focus
186
	public void setFocus() {
187
	    if(viewer!=null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
188
	        viewer.getControl().setFocus();
189
	    }
190
	    if(conversation!=null){
191
	        conversation.bind();
192
	    }
193
		if(input!=null){
194
		    input.bind();
195
		}
196
	}
197

    
198
	@Override
199
	public void update(CdmDataChangeMap changeEvents) {
200
	}
201

    
202
	@Override
203
	public ConversationHolder getConversationHolder() {
204
		return conversation;
205
	}
206

    
207
	@Override
208
	public void changed(Object element) {
209
	    if(element instanceof DefinedTermBase){
210
	        DefinedTermBase definedTermBase = (DefinedTermBase) element;
211
            TermDto termDto = TermDto.fromTerm(definedTermBase);
212
	        viewer.update(termDto, null);
213
	        changedTerms.add(definedTermBase);
214
	    }
215
	    else if(element instanceof TermVocabulary){
216
	        TermVocabulary vocabulary = (TermVocabulary)element;
217
	        TermVocabularyDto vocabularyDto = new TermVocabularyDto(vocabulary.getUuid(), vocabulary.getRepresentations());
218
	        viewer.update(vocabularyDto, null);
219
	        changedTerms.add(vocabulary);
220
	    }
221
		setDirty(true);
222
		viewer.update(element, null);
223
	}
224

    
225
	@Override
226
	public void forceDirty() {
227
	    changed(null);
228
	}
229

    
230
	public void setDirty(boolean dirty) {
231
		this.dirty.setDirty(dirty);
232
	}
233

    
234
	@Override
235
	public boolean onComplete() {
236
		return false;
237
	}
238

    
239
	public TreeViewer getViewer() {
240
		return viewer;
241
	}
242

    
243
	@PreDestroy
244
	public void dispose() {
245
	    if(conversation!=null){
246
	        conversation.unregisterForDataStoreChanges(this);
247
	        conversation.close();
248
	        conversation = null;
249
	    }
250
	    if(input!=null){
251
	        input.dispose();
252
	    }
253
	    this.dirty.setDirty(false);
254
	}
255

    
256
    public TermEditorInput getDefinedTermEditorInput() {
257
        return input;
258
    }
259

    
260
    @Override
261
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
262
    }
263

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

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

    
279
    @Override
280
    public void contextRefresh(IProgressMonitor monitor) {
281
    }
282

    
283
    @Override
284
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
285
    }
286

    
287
}
(3-3/4)