Project

General

Profile

Download (7.42 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 javax.annotation.PostConstruct;
12
import javax.annotation.PreDestroy;
13
import javax.inject.Inject;
14

    
15
import org.eclipse.core.runtime.IProgressMonitor;
16
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
17
import org.eclipse.e4.core.contexts.IEclipseContext;
18
import org.eclipse.e4.ui.di.Focus;
19
import org.eclipse.e4.ui.di.Persist;
20
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
21
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
22
import org.eclipse.e4.ui.services.EMenuService;
23
import org.eclipse.e4.ui.workbench.modeling.EPartService;
24
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
25
import org.eclipse.jface.viewers.ISelectionChangedListener;
26
import org.eclipse.jface.viewers.StructuredSelection;
27
import org.eclipse.jface.viewers.TreeViewer;
28
import org.eclipse.swt.SWT;
29
import org.eclipse.swt.dnd.DND;
30
import org.eclipse.swt.dnd.Transfer;
31
import org.eclipse.swt.layout.FillLayout;
32
import org.eclipse.swt.widgets.Composite;
33
import org.eclipse.swt.widgets.Tree;
34
import org.eclipse.ui.IMemento;
35

    
36
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
37
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
38
import eu.etaxonomy.cdm.model.common.CdmBase;
39
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
40
import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermSorter;
41
import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
42
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
43
import eu.etaxonomy.taxeditor.editor.definedterm.TermTransfer;
44
import eu.etaxonomy.taxeditor.editor.definedterm.input.TermEditorInput;
45
import eu.etaxonomy.taxeditor.model.AbstractUtility;
46
import eu.etaxonomy.taxeditor.model.IContextListener;
47
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
48
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
49
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
50
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
51
import eu.etaxonomy.taxeditor.store.CdmStore;
52
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
53
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
54

    
55
/**
56
 *
57
 * @author pplitzner
58
 * @since Aug 22, 2017
59
 *
60
 */
61
public class DefinedTermEditorE4 implements IConversationEnabled, IDirtyMarkable, IPostOperationEnabled,
62
IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart, IContextListener {
63

    
64
	public static final String OPEN_COMMAND_ID = "eu.etaxonomy.taxeditor.store.openDefinedTermEditor";
65

    
66
	protected TreeViewer viewer;
67

    
68
	protected ConversationHolder conversation;
69

    
70
    @Inject
71
    private ESelectionService selService;
72

    
73
    @Inject
74
    private MDirtyable dirty;
75

    
76
    private ISelectionChangedListener selectionChangedListener;
77
	private final int dndOperations = DND.DROP_COPY | DND.DROP_MOVE;
78

    
79
    private TermEditorInput input =null;
80

    
81
    @Inject
82
    private MPart thisPart;
83

    
84
	@Inject
85
	public DefinedTermEditorE4() {
86
	    CdmStore.getContextManager().addContextListener(this);
87
	}
88

    
89
	@PostConstruct
90
	public void createPartControl(Composite parent, EMenuService menuService,
91
	        IEclipseContext context) {
92
	    if (CdmStore.isActive()){
93
            if(conversation == null){
94
                conversation = CdmStore.createConversation();
95
            }
96
        }
97
        else{
98
            return;
99
        }
100
	    FillLayout layout = new FillLayout();
101
	    layout.marginHeight = 0;
102
	    layout.marginWidth = 0;
103
	    layout.type = SWT.VERTICAL;
104

    
105
	    parent.setLayout(layout);
106
	    viewer = new TreeViewer(new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION));
107
	    viewer.getControl().setLayoutData(LayoutConstants.FILL());
108
	    viewer.setContentProvider(new TermContentProvider());
109
	    viewer.setLabelProvider(new TermLabelProvider());
110
	    viewer.setSorter(new DefinedTermSorter());
111

    
112
	    Transfer[] transfers = new Transfer[] { TermTransfer.getInstance() };
113
	    viewer.addDragSupport(dndOperations, transfers, new DefinedTermDragListenerE4(viewer));
114
	    DefinedTermDropAdapterE4 dropListener = new DefinedTermDropAdapterE4(this);
115
	    ContextInjectionFactory.inject(dropListener, context);
116
        viewer.addDropSupport(dndOperations, transfers, dropListener);
117

    
118
	    //propagate selection
119
	    selectionChangedListener = (event -> selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event)));
120
	    viewer.addSelectionChangedListener(selectionChangedListener);
121

    
122
	    //create context menu
123
	    menuService.registerContextMenu(viewer.getControl(), "eu.etaxonomy.taxeditor.store.popupmenu.termeditor");
124

    
125
	}
126

    
127
	@Override
128
	public boolean postOperation(CdmBase objectAffectedByOperation) {
129
		viewer.refresh();
130

    
131
		if(objectAffectedByOperation != null){
132
			viewer.setSelection(new StructuredSelection(objectAffectedByOperation));
133
		}
134
		setDirty(true);
135

    
136
		return true;
137
	}
138

    
139
	public void init(TermEditorInput input){
140
	    this.input = input;
141

    
142
        input.initialiseVocabularies();
143
        viewer.setInput(input.getVocabularies());
144
        thisPart.setLabel(input.getName());
145
	}
146

    
147
	@Override
148
    @Persist
149
	public void save(IProgressMonitor monitor) {
150
		getConversationHolder().commit();
151
		input.merge();
152
		setDirty(false);
153
		input.initialiseVocabularies();
154
		viewer.refresh();
155
	}
156

    
157
	public boolean isDirty() {
158
		return dirty.isDirty();
159
	}
160

    
161
	@Focus
162
	public void setFocus() {
163
	    if(viewer!=null && viewer.getControl() != null && !viewer.getControl().isDisposed()){
164
	        viewer.getControl().setFocus();
165
	    }
166
	    if(conversation!=null){
167
	        conversation.bind();
168
	    }
169
		if(input!=null){
170
		    input.bind();
171
		}
172
	}
173

    
174
	@Override
175
	public void update(CdmDataChangeMap changeEvents) {
176
	}
177

    
178
	@Override
179
	public ConversationHolder getConversationHolder() {
180
		return conversation;
181
	}
182

    
183
	@Override
184
	public void changed(Object element) {
185
		setDirty(true);
186
		viewer.update(element, null);
187
	}
188

    
189
	@Override
190
	public void forceDirty() {
191
	    changed(null);
192
	}
193

    
194
	public void setDirty(boolean dirty) {
195
		this.dirty.setDirty(dirty);
196
	}
197

    
198
	@Override
199
	public boolean onComplete() {
200
		return false;
201
	}
202

    
203
	public TreeViewer getViewer() {
204
		return viewer;
205
	}
206

    
207
	@PreDestroy
208
	public void dispose() {
209
	    if(conversation!=null){
210
	        conversation.unregisterForDataStoreChanges(this);
211
	        conversation.close();
212
	        conversation = null;
213
	    }
214
	    if(input!=null){
215
	        input.dispose();
216
	    }
217
	}
218

    
219
    public TermEditorInput getDefinedTermEditorInput() {
220
        return input;
221
    }
222

    
223
    /**
224
     * {@inheritDoc}
225
     */
226
    @Override
227
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
228
    }
229

    
230
    /**
231
     * {@inheritDoc}
232
     */
233
    @Override
234
    public void contextStop(IMemento memento, IProgressMonitor monitor) {
235
        //close view when workbench closes
236
        try{
237
            thisPart.getContext().get(EPartService.class).hidePart(thisPart);
238
        }
239
        catch(Exception e){
240
            //nothing
241
        }
242
    }
243

    
244
    /**
245
     * {@inheritDoc}
246
     */
247
    @Override
248
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
249
    }
250

    
251
    /**
252
     * {@inheritDoc}
253
     */
254
    @Override
255
    public void contextRefresh(IProgressMonitor monitor) {
256
    }
257

    
258
    /**
259
     * {@inheritDoc}
260
     */
261
    @Override
262
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
263
    }
264

    
265
}
(3-3/4)