Project

General

Profile

Download (9.08 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
        viewer.setInput(input.getVocabularies());
159
        thisPart.setLabel(input.getName());
160
	}
161

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
288
}
(3-3/4)