Project

General

Profile

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

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

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

    
81
	protected TreeViewer viewer;
82

    
83
	@Inject
84
    private ESelectionService selService;
85

    
86
    @Inject
87
    private MDirtyable dirty;
88

    
89
    private ISelectionChangedListener selectionChangedListener;
90

    
91
    private TermEditorInput input =null;
92

    
93
    @Inject
94
    private MPart thisPart;
95

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

    
98
    private TermDtoContentProvider contentProvider;
99

    
100
	@Inject
101
	public DefinedTermEditorE4() {
102
	    CdmStore.getContextManager().addContextListener(this);
103
	}
104

    
105
	@PostConstruct
106
	public void createPartControl(Composite parent, EMenuService menuService,
107
	        IEclipseContext context) {
108
	    
109
	    FillLayout layout = new FillLayout();
110
	    layout.marginHeight = 0;
111
	    layout.marginWidth = 0;
112
	    layout.type = SWT.VERTICAL;
113

    
114
	    parent.setLayout(layout);
115
	    viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI));
116
	    viewer.getControl().setLayoutData(LayoutConstants.FILL());
117
	    contentProvider = new TermDtoContentProvider();
118
        viewer.setContentProvider(contentProvider);
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(), AppModelId.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_STORE_POPUPMENU_TERMEDITOR);
134

    
135
	}
136

    
137
	@Override
138
	public boolean postOperation(Object objectAffectedByOperation) {
139
        input.initialiseVocabularies();
140

    
141
	    Collection<AbstractTermDto> itemsToSelect = new HashSet<>();
142

    
143
	    if(objectAffectedByOperation instanceof Collection){
144
	        for (Object o : (Collection<?>)objectAffectedByOperation) {
145
                if(o instanceof TermVocabularyDto){
146
                    contentProvider.removeVocabularyFromCache((TermVocabularyDto) o);
147
                }
148
                else if(o instanceof TermDto){
149
                    contentProvider.removeVocabularyFromCache(((TermDto) o).getVocabularyDto());
150
                    itemsToSelect.add((TermDto) o);
151
                }
152
            }
153
	    }
154
	    if(objectAffectedByOperation instanceof TermVocabularyDto){
155
	        contentProvider.removeVocabularyFromCache((TermVocabularyDto) objectAffectedByOperation);
156
	        itemsToSelect.add((AbstractTermDto) objectAffectedByOperation);
157
	    }
158
	    else if(objectAffectedByOperation instanceof TermDto){
159
	        TermDto termDto = (TermDto) objectAffectedByOperation;
160
            itemsToSelect.add(termDto);
161
            contentProvider.removeVocabularyFromCache(termDto.getVocabularyDto());
162
	    }
163
		if(!itemsToSelect.isEmpty()){
164
			StructuredSelection selection = new StructuredSelection(itemsToSelect);
165
            viewer.setSelection(selection);
166
            for (AbstractTermDto termDto : itemsToSelect) {
167
                viewer.expandToLevel(termDto, 1);
168
            }
169
		}
170
		viewer.refresh();
171
		return true;
172
	}
173

    
174
	public void init(TermEditorInput input, String label){
175
	    this.input = input;
176

    
177
        viewer.setInput(input.getVocabularies());
178
        for (TermVocabularyDto voc:input.getVocabularies()){
179
            for (TermDto dto: this.contentProvider.getChildTerms(voc)){
180
                voc.addTerm(dto);;
181
            }
182
        }
183
        thisPart.setLabel(label);
184
	}
185

    
186
	@Override
187
    @Persist
188
	public void save(IProgressMonitor monitor) {
189
		List<DefinedTermBase> terms = new ArrayList<>();
190
		List<TermVocabulary> vocs = new ArrayList<>();
191
		for(TermBase term:changedTerms){
192
            if(term.isInstanceOf(DefinedTermBase.class)){
193
                DefinedTermBase<?> definedTermBase = (DefinedTermBase<?>) term;
194
                terms.add(definedTermBase);
195

    
196
            }
197
            else if(term.isInstanceOf(TermVocabulary.class)){
198
                TermVocabulary<?> voc = (TermVocabulary<?>) term;
199
                vocs.add(voc);
200
            }
201
		}
202
		if (!terms.isEmpty()){
203
		    CdmStore.getService(ITermService.class).merge(terms, true);
204
		}
205
		if (!vocs.isEmpty()){
206
		    CdmStore.getService(IVocabularyService.class).merge(vocs, true);
207
		}
208
		setDirty(false);
209
		input.initialiseVocabularies();
210
        changedTerms.clear();
211
        viewer.refresh();
212
		EventUtility.postEvent(WorkbenchEventConstants.REFRESH_SUPPLEMENTAL, true);
213
	}
214

    
215
	@Override
216
    public boolean isDirty() {
217
		return dirty.isDirty();
218
	}
219

    
220
	@Focus
221
	public void setFocus() {
222
	    if(viewer!=null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
223
	        viewer.getControl().setFocus();
224
	    }
225
	    if(input!=null){
226
		    input.bind();
227
		}
228

    
229
		if (viewer.getSelection().isEmpty()){
230
		    viewer.setSelection(null);
231
		}
232
	}
233

    
234
	@Override
235
	public void changed(Object element) {
236
	    if(element instanceof DefinedTermBase){
237
	        DefinedTermBase<?> definedTermBase = (DefinedTermBase<?>) element;
238
            TermDto termDto = TermDto.fromTerm(definedTermBase);
239
	        viewer.update(termDto, null);
240
	        changedTerms.add(definedTermBase);
241
            contentProvider.removeVocabularyFromCache(termDto.getVocabularyDto());
242
	    }
243
	    else if(element instanceof TermVocabulary){
244
	        TermVocabulary<?> vocabulary = (TermVocabulary<?>)element;
245
	        TermVocabularyDto vocabularyDto = new TermVocabularyDto(vocabulary.getUuid(), vocabulary.getRepresentations(), vocabulary.getTermType(), vocabulary.getTitleCache(), vocabulary.isAllowDuplicates(), vocabulary.isOrderRelevant(), vocabulary.isFlat());
246
	        viewer.update(vocabularyDto, null);
247
	        changedTerms.add(vocabulary);
248
            contentProvider.removeVocabularyFromCache(vocabularyDto);
249
	    }
250
		setDirty(true);
251
		viewer.update(element, null);
252
	}
253

    
254
	@Override
255
	public void forceDirty() {
256
	    changed(null);
257
	}
258

    
259
	public void setDirty(boolean dirty) {
260
		this.dirty.setDirty(dirty);
261
	}
262

    
263
	@Override
264
	public boolean onComplete() {
265
		return false;
266
	}
267

    
268
	public TreeViewer getViewer() {
269
		return viewer;
270
	}
271

    
272
	@PreDestroy
273
	public void dispose() {
274
	    if(input!=null){
275
	        input.dispose();
276
	    }
277
	    this.dirty.setDirty(false);
278
	}
279

    
280
    public TermEditorInput getDefinedTermEditorInput() {
281
        return input;
282
    }
283

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

    
288
    @Override
289
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
290
        //close view when workbench closes
291
        try{
292
            thisPart.getContext().get(EPartService.class).hidePart(thisPart);
293
        }
294
        catch(Exception e){
295
            //nothing
296
        }
297
    }
298

    
299
    @Override
300
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
301
    }
302

    
303
    @Override
304
    public void contextRefresh(IProgressMonitor monitor) {
305
    }
306

    
307
    @Override
308
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
309
    }
310

    
311
    public void setSelection(TermDto toBeSelected){
312
        TreeItem[] children = viewer.getTree().getItems();
313
        for (TreeItem con: children){
314
            if (con.getData() == toBeSelected){
315
                this.viewer.setSelection(new StructuredSelection(toBeSelected));
316
                return;
317
            }else {
318
               if(con != null){
319
                   Object data= con.getData();
320
                   if(data != null && data instanceof TermVocabularyDto ){
321
                       for (TermDto term:((TermVocabularyDto)data).getTerms()){
322
                           if(term.getUuid().equals(toBeSelected.getUuid())){
323
                               StructuredSelection selection = new StructuredSelection(term);
324
                               viewer.expandToLevel(data, 1);
325
                               viewer.setSelection(selection,true);
326
                               return;
327
                           }
328
                       }
329
                   }
330
               }
331

    
332
            }
333
        }
334

    
335
    }
336
}
(3-3/5)