Project

General

Profile

Download (9.38 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.List;
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.dialogs.MessageDialog;
29
import org.eclipse.jface.util.LocalSelectionTransfer;
30
import org.eclipse.jface.viewers.ISelectionChangedListener;
31
import org.eclipse.jface.viewers.StructuredSelection;
32
import org.eclipse.jface.viewers.TreeViewer;
33
import org.eclipse.swt.SWT;
34
import org.eclipse.swt.dnd.DND;
35
import org.eclipse.swt.dnd.Transfer;
36
import org.eclipse.swt.layout.FillLayout;
37
import org.eclipse.swt.widgets.Composite;
38
import org.eclipse.swt.widgets.Tree;
39
import org.eclipse.ui.IMemento;
40

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

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

    
73
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
74

    
75
	protected TreeViewer viewer;
76

    
77
	protected ConversationHolder conversation;
78

    
79
    @Inject
80
    private ESelectionService selService;
81

    
82
    @Inject
83
    private MDirtyable dirty;
84

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

    
88
    private TermEditorInput input =null;
89

    
90
    @Inject
91
    private MPart thisPart;
92

    
93
    private List<DefinedTermBase> changedTerms = new ArrayList<>();
94

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

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

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

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

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

    
133
	    //create context menu
134
	    menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.termeditor");
135

    
136
	}
137

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

    
149
	public void init(TermEditorInput input){
150
	    this.input = input;
151

    
152
        input.initialiseVocabularies();
153
        viewer.setInput(input.getVocabularies());
154
        thisPart.setLabel(input.getName());
155
	}
156

    
157
    /**
158
     * Checks the dirty flag and, if set, prompts the user to optionally save
159
     * the editor
160
     *
161
     * @return <code>true</code> if the editor is not dirty anymore, either
162
     *         because it wasn't beforehand or because it has been saved.
163
     *         <code>false</code> otherwise
164
     */
165
	public boolean checkDirty(){
166
	    if (isDirty()){
167
	        boolean proceed = MessageDialog.openQuestion(null,
168
	                "Save changes", "You have made changes that must be saved before this query can be executed. Would you like to proceed?");
169
	        if (proceed) {
170
	            save(null);
171
	            return true;
172
	        }
173
	        else{
174
	            return false;
175
	        }
176
	    }
177
	    else{
178
	        return true;
179
	    }
180
	}
181

    
182
	@Override
183
    @Persist
184
	public void save(IProgressMonitor monitor) {
185
		getConversationHolder().commit();
186
        changedTerms.forEach(term->CdmStore.getService(ITermService.class).merge(term));
187
        changedTerms.clear();
188
		input.merge();
189
		setDirty(false);
190
		input.initialiseVocabularies();
191
		viewer.refresh();
192
		EventUtility.postEvent(WorkbenchEventConstants.REFRESH_SUPPLEMENTAL, true);
193
	}
194

    
195
	public boolean isDirty() {
196
		return dirty.isDirty();
197
	}
198

    
199
	@Focus
200
	public void setFocus() {
201
	    if(viewer!=null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
202
	        viewer.getControl().setFocus();
203
	    }
204
	    if(conversation!=null){
205
	        conversation.bind();
206
	    }
207
		if(input!=null){
208
		    input.bind();
209
		}
210
	}
211

    
212
	@Override
213
	public void update(CdmDataChangeMap changeEvents) {
214
	}
215

    
216
	@Override
217
	public ConversationHolder getConversationHolder() {
218
		return conversation;
219
	}
220

    
221
	@Override
222
	public void changed(Object element) {
223
	    if(element instanceof DefinedTermBase){
224
	        DefinedTermBase definedTermBase = (DefinedTermBase) element;
225
            TermDto termDto = new TermDto(definedTermBase.getUuid(),
226
	                definedTermBase.getRepresentations(),
227
	                null,
228
	                null,
229
	                null);
230
	        viewer.update(termDto, null);
231
	        changedTerms.add(definedTermBase);
232
	    }
233
	    else if(element instanceof TermVocabulary){
234
	        TermVocabulary vocabulary = (TermVocabulary)element;
235
	        TermVocabularyDto vocabularyDto = new TermVocabularyDto(vocabulary.getUuid(), vocabulary.getRepresentations());
236
	        viewer.update(vocabularyDto, null);
237
	    }
238
		setDirty(true);
239
		viewer.update(element, null);
240
	}
241

    
242
	@Override
243
	public void forceDirty() {
244
	    changed(null);
245
	}
246

    
247
	public void setDirty(boolean dirty) {
248
		this.dirty.setDirty(dirty);
249
	}
250

    
251
	@Override
252
	public boolean onComplete() {
253
		return false;
254
	}
255

    
256
	public TreeViewer getViewer() {
257
		return viewer;
258
	}
259

    
260
	@PreDestroy
261
	public void dispose() {
262
	    if(conversation!=null){
263
	        conversation.unregisterForDataStoreChanges(this);
264
	        conversation.close();
265
	        conversation = null;
266
	    }
267
	    if(input!=null){
268
	        input.dispose();
269
	    }
270
	    this.dirty.setDirty(false);
271
	}
272

    
273
    public TermEditorInput getDefinedTermEditorInput() {
274
        return input;
275
    }
276

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

    
281
    @Override
282
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
283
        //close view when workbench closes
284
        try{
285
            thisPart.getContext().get(EPartService.class).hidePart(thisPart);
286
        }
287
        catch(Exception e){
288
            //nothing
289
        }
290
    }
291

    
292
    @Override
293
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
294
    }
295

    
296
    @Override
297
    public void contextRefresh(IProgressMonitor monitor) {
298
    }
299

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

    
304
}
(3-3/4)