Project

General

Profile

Download (12.2 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.Collection;
13
import java.util.HashSet;
14
import java.util.List;
15
import java.util.Set;
16

    
17
import javax.annotation.PostConstruct;
18
import javax.annotation.PreDestroy;
19
import javax.inject.Inject;
20

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

    
44
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
45
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
46
import eu.etaxonomy.cdm.api.service.ITermService;
47
import eu.etaxonomy.cdm.api.service.IVocabularyService;
48
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
49
import eu.etaxonomy.cdm.model.term.TermBase;
50
import eu.etaxonomy.cdm.model.term.TermVocabulary;
51
import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
52
import eu.etaxonomy.cdm.persistence.dto.TermDto;
53
import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
54
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
55
import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermSorter;
56
import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoContentProvider;
57
import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoLabelProvider;
58
import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
59
import eu.etaxonomy.taxeditor.event.EventUtility;
60
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
61
import eu.etaxonomy.taxeditor.model.IContextListener;
62
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
63
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
64
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
65
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
66
import eu.etaxonomy.taxeditor.store.AppModelId;
67
import eu.etaxonomy.taxeditor.store.CdmStore;
68
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
69
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
70

    
71
/**
72
 *
73
 * @author pplitzner
74
 * @since Aug 22, 2017
75
 *
76
 */
77
public class DefinedTermEditorE4 implements IConversationEnabled, IDirtyMarkable, IPostOperationEnabled,
78
IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContextListener {
79

    
80
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor"; //$NON-NLS-1$
81
	private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
82

    
83
	protected TreeViewer viewer;
84

    
85
	protected ConversationHolder conversation;
86

    
87
    @Inject
88
    private ESelectionService selService;
89

    
90
    @Inject
91
    private MDirtyable dirty;
92

    
93
    private ISelectionChangedListener selectionChangedListener;
94

    
95
    private TermEditorInput input =null;
96

    
97
    @Inject
98
    private MPart thisPart;
99

    
100
    private Set<TermBase> changedTerms = new HashSet<>();
101

    
102
    private TermDtoContentProvider contentProvider;
103

    
104
	@Inject
105
	public DefinedTermEditorE4() {
106
	    CdmStore.getContextManager().addContextListener(this);
107
	}
108

    
109
	@PostConstruct
110
	public void createPartControl(Composite parent, EMenuService menuService,
111
	        IEclipseContext context) {
112
	    if (CdmStore.isActive()){
113
            if(conversation == null){
114
                conversation = CdmStore.createConversation();
115
            }
116
        }
117
        else{
118
            return;
119
        }
120
	    FillLayout layout = new FillLayout();
121
	    layout.marginHeight = 0;
122
	    layout.marginWidth = 0;
123
	    layout.type = SWT.VERTICAL;
124

    
125
	    parent.setLayout(layout);
126
	    viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI));
127
	    viewer.getControl().setLayoutData(LayoutConstants.FILL());
128
	    contentProvider = new TermDtoContentProvider();
129
        viewer.setContentProvider(contentProvider);
130
	    viewer.setLabelProvider(new TermDtoLabelProvider());
131
	    viewer.setComparator(new DefinedTermSorter());
132

    
133
	    Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer() };
134
	    viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListenerE4(viewer));
135
	    DefinedTermDropAdapterE4 dropListener = new DefinedTermDropAdapterE4(this);
136
	    ContextInjectionFactory.inject(dropListener, context);
137
        viewer.addDropSupport(dndOperations, transfers, dropListener);
138

    
139
	    //propagate selection
140
	    selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
141
	    viewer.addSelectionChangedListener(selectionChangedListener);
142

    
143
	    //create context menu
144
	    menuService.registerContextMenu(viewer.getControl(), AppModelId.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_STORE_POPUPMENU_TERMEDITOR);
145

    
146
	}
147

    
148
	@Override
149
	public boolean postOperation(Object objectAffectedByOperation) {
150
        input.initialiseVocabularies();
151

    
152
	    Collection<AbstractTermDto> itemsToSelect = new HashSet<>();
153

    
154
	    if(objectAffectedByOperation instanceof Collection){
155
	        for (Object o : (Collection<?>)objectAffectedByOperation) {
156
                if(o instanceof TermVocabularyDto){
157
                    contentProvider.removeVocabularyFromCache((TermVocabularyDto) o);
158
                }
159
                else if(o instanceof TermDto){
160
                    contentProvider.removeVocabularyFromCache(((TermDto) o).getVocabularyDto());
161
                    itemsToSelect.add((TermDto) o);
162
                }
163
            }
164
	    }
165
	    if(objectAffectedByOperation instanceof TermVocabularyDto){
166
	        contentProvider.removeVocabularyFromCache((TermVocabularyDto) objectAffectedByOperation);
167
	        itemsToSelect.add((AbstractTermDto) objectAffectedByOperation);
168
	    }
169
	    else if(objectAffectedByOperation instanceof TermDto){
170
	        TermDto termDto = (TermDto) objectAffectedByOperation;
171
            itemsToSelect.add(termDto);
172
            contentProvider.removeVocabularyFromCache(termDto.getVocabularyDto());
173
	    }
174
		if(!itemsToSelect.isEmpty()){
175
			StructuredSelection selection = new StructuredSelection(itemsToSelect);
176
            viewer.setSelection(selection);
177
            for (AbstractTermDto termDto : itemsToSelect) {
178
                viewer.expandToLevel(termDto, 1);
179
            }
180
		}
181
		viewer.refresh();
182
		return true;
183
	}
184

    
185
	public void init(TermEditorInput input, String label){
186
	    this.input = input;
187

    
188
        viewer.setInput(input.getVocabularies());
189
        for (TermVocabularyDto voc:input.getVocabularies()){
190
            for (TermDto dto: this.contentProvider.getChildTerms(voc)){
191
                voc.addTerm(dto);;
192
            }
193
        }
194
        thisPart.setLabel(label);
195
	}
196

    
197
	@Override
198
    @Persist
199
	public void save(IProgressMonitor monitor) {
200
		getConversationHolder().commit();
201
		List<DefinedTermBase> terms = new ArrayList<>();
202
		List<TermVocabulary> vocs = new ArrayList<>();
203
		for(TermBase term:changedTerms){
204
            if(term.isInstanceOf(DefinedTermBase.class)){
205
                DefinedTermBase<?> definedTermBase = (DefinedTermBase<?>) term;
206
                terms.add(definedTermBase);
207

    
208
            }
209
            else if(term.isInstanceOf(TermVocabulary.class)){
210
                TermVocabulary<?> voc = (TermVocabulary<?>) term;
211
                vocs.add(voc);
212
            }
213
		}
214
		if (!terms.isEmpty()){
215
		    CdmStore.getService(ITermService.class).merge(terms, true);
216
		}
217
		if (!vocs.isEmpty()){
218
		    CdmStore.getService(IVocabularyService.class).merge(vocs, true);
219
		}
220
		setDirty(false);
221
		input.initialiseVocabularies();
222
        changedTerms.clear();
223
        viewer.refresh();
224
		EventUtility.postEvent(WorkbenchEventConstants.REFRESH_SUPPLEMENTAL, true);
225
	}
226

    
227
	@Override
228
    public boolean isDirty() {
229
		return dirty.isDirty();
230
	}
231

    
232
	@Focus
233
	public void setFocus() {
234
	    if(viewer!=null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
235
	        viewer.getControl().setFocus();
236
	    }
237
	    if(conversation!=null){
238
	        conversation.bind();
239
	    }
240
		if(input!=null){
241
		    input.bind();
242
		}
243

    
244
		if (viewer.getSelection().isEmpty()){
245
		    viewer.setSelection(null);
246
		}
247
	}
248

    
249
	@Override
250
	public void update(CdmDataChangeMap changeEvents) {
251
	}
252

    
253
	@Override
254
	public ConversationHolder getConversationHolder() {
255
		return conversation;
256
	}
257

    
258
	@Override
259
	public void changed(Object element) {
260
	    if(element instanceof DefinedTermBase){
261
	        DefinedTermBase<?> definedTermBase = (DefinedTermBase<?>) element;
262
            TermDto termDto = TermDto.fromTerm(definedTermBase);
263
	        viewer.update(termDto, null);
264
	        changedTerms.add(definedTermBase);
265
            contentProvider.removeVocabularyFromCache(termDto.getVocabularyDto());
266
	    }
267
	    else if(element instanceof TermVocabulary){
268
	        TermVocabulary<?> vocabulary = (TermVocabulary<?>)element;
269
	        TermVocabularyDto vocabularyDto = new TermVocabularyDto(vocabulary.getUuid(), vocabulary.getRepresentations(), vocabulary.getTermType(), vocabulary.getTitleCache(), vocabulary.isAllowDuplicates(), vocabulary.isOrderRelevant(), vocabulary.isFlat());
270
	        viewer.update(vocabularyDto, null);
271
	        changedTerms.add(vocabulary);
272
            contentProvider.removeVocabularyFromCache(vocabularyDto);
273
	    }
274
		setDirty(true);
275
		viewer.update(element, null);
276
	}
277

    
278
	@Override
279
	public void forceDirty() {
280
	    changed(null);
281
	}
282

    
283
	public void setDirty(boolean dirty) {
284
		this.dirty.setDirty(dirty);
285
	}
286

    
287
	@Override
288
	public boolean onComplete() {
289
		return false;
290
	}
291

    
292
	public TreeViewer getViewer() {
293
		return viewer;
294
	}
295

    
296
	@PreDestroy
297
	public void dispose() {
298
	    if(conversation!=null){
299
	        conversation.unregisterForDataStoreChanges(this);
300
	        conversation.close();
301
	        conversation = null;
302
	    }
303
	    if(input!=null){
304
	        input.dispose();
305
	    }
306
	    this.dirty.setDirty(false);
307
	}
308

    
309
    public TermEditorInput getDefinedTermEditorInput() {
310
        return input;
311
    }
312

    
313
    @Override
314
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
315
    }
316

    
317
    @Override
318
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
319
        //close view when workbench closes
320
        try{
321
            thisPart.getContext().get(EPartService.class).hidePart(thisPart);
322
        }
323
        catch(Exception e){
324
            //nothing
325
        }
326
    }
327

    
328
    @Override
329
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
330
    }
331

    
332
    @Override
333
    public void contextRefresh(IProgressMonitor monitor) {
334
    }
335

    
336
    @Override
337
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
338
    }
339

    
340
    public void setSelection(TermDto toBeSelected){
341
        TreeItem[] children = viewer.getTree().getItems();
342
        for (TreeItem con: children){
343
            if (con.getData() == toBeSelected){
344
                this.viewer.setSelection(new StructuredSelection(toBeSelected));
345
                return;
346
            }else {
347
               if(con != null){
348
                   Object data= con.getData();
349
                   if(data != null && data instanceof TermVocabularyDto ){
350
                       for (TermDto term:((TermVocabularyDto)data).getTerms()){
351
                           if(term.getUuid().equals(toBeSelected.getUuid())){
352
                               StructuredSelection selection = new StructuredSelection(term);
353
                               viewer.expandToLevel(data, 1);
354
                               viewer.setSelection(selection,true);
355
                               return;
356
                           }
357
                       }
358
                   }
359
               }
360

    
361
            }
362
        }
363

    
364
    }
365
}
(3-3/5)