Project

General

Profile

Download (9.12 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.AppModelId;
62
import eu.etaxonomy.taxeditor.store.CdmStore;
63
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
64
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
65

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

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

    
77
	protected TreeViewer viewer;
78

    
79
	protected ConversationHolder conversation;
80

    
81
    @Inject
82
    private ESelectionService selService;
83

    
84
    @Inject
85
    private MDirtyable dirty;
86

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

    
90
    private TermEditorInput input =null;
91

    
92
    @Inject
93
    private MPart thisPart;
94

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

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

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

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

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

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

    
135
	    //create context menu
136
	    menuService.registerContextMenu(viewer.getControl(), AppModelId.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_STORE_POPUPMENU_TERMEDITOR);
137

    
138
	}
139

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

    
155
	public void init(TermEditorInput input){
156
	    this.input = input;
157

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

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

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

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

    
200
	@Override
201
	public void update(CdmDataChangeMap changeEvents) {
202
	}
203

    
204
	@Override
205
	public ConversationHolder getConversationHolder() {
206
		return conversation;
207
	}
208

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

    
227
	@Override
228
	public void forceDirty() {
229
	    changed(null);
230
	}
231

    
232
	public void setDirty(boolean dirty) {
233
		this.dirty.setDirty(dirty);
234
	}
235

    
236
	@Override
237
	public boolean onComplete() {
238
		return false;
239
	}
240

    
241
	public TreeViewer getViewer() {
242
		return viewer;
243
	}
244

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

    
258
    public TermEditorInput getDefinedTermEditorInput() {
259
        return input;
260
    }
261

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

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

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

    
281
    @Override
282
    public void contextRefresh(IProgressMonitor monitor) {
283
    }
284

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

    
289
}
(3-3/4)