Project

General

Profile

Download (7.56 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.event.EventUtility;
46
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
47
import eu.etaxonomy.taxeditor.model.IContextListener;
48
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
49
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
50
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
51
import eu.etaxonomy.taxeditor.operation.IPostOperationEnabled;
52
import eu.etaxonomy.taxeditor.store.CdmStore;
53
import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
54
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
55

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

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

    
67
	protected TreeViewer viewer;
68

    
69
	protected ConversationHolder conversation;
70

    
71
    @Inject
72
    private ESelectionService selService;
73

    
74
    @Inject
75
    private MDirtyable dirty;
76

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

    
80
    private TermEditorInput input =null;
81

    
82
    @Inject
83
    private MPart thisPart;
84

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

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

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

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

    
119
	    //propagate selection
120
	    selectionChangedListener = (event -> selService.setSelection(event.getSelection()));
121
	    viewer.addSelectionChangedListener(selectionChangedListener);
122

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

    
126
	}
127

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

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

    
137
		return true;
138
	}
139

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

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

    
148
	@Override
149
    @Persist
150
	public void save(IProgressMonitor monitor) {
151
		getConversationHolder().commit();
152
		input.merge();
153
		setDirty(false);
154
		input.initialiseVocabularies();
155
		viewer.refresh();
156
		EventUtility.postEvent(WorkbenchEventConstants.REFRESH_SUPPLEMENTAL, true);
157
	}
158

    
159
	public boolean isDirty() {
160
		return dirty.isDirty();
161
	}
162

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

    
176
	@Override
177
	public void update(CdmDataChangeMap changeEvents) {
178
	}
179

    
180
	@Override
181
	public ConversationHolder getConversationHolder() {
182
		return conversation;
183
	}
184

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

    
191
	@Override
192
	public void forceDirty() {
193
	    changed(null);
194
	}
195

    
196
	public void setDirty(boolean dirty) {
197
		this.dirty.setDirty(dirty);
198
	}
199

    
200
	@Override
201
	public boolean onComplete() {
202
		return false;
203
	}
204

    
205
	public TreeViewer getViewer() {
206
		return viewer;
207
	}
208

    
209
	@PreDestroy
210
	public void dispose() {
211
	    if(conversation!=null){
212
	        conversation.unregisterForDataStoreChanges(this);
213
	        conversation.close();
214
	        conversation = null;
215
	    }
216
	    if(input!=null){
217
	        input.dispose();
218
	    }
219
	    this.dirty.setDirty(false);
220
	}
221

    
222
    public TermEditorInput getDefinedTermEditorInput() {
223
        return input;
224
    }
225

    
226
    /**
227
     * {@inheritDoc}
228
     */
229
    @Override
230
    public void contextAboutToStop(IMemento memento, IProgressMonitor monitor) {
231
    }
232

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

    
247
    /**
248
     * {@inheritDoc}
249
     */
250
    @Override
251
    public void contextStart(IMemento memento, IProgressMonitor monitor) {
252
    }
253

    
254
    /**
255
     * {@inheritDoc}
256
     */
257
    @Override
258
    public void contextRefresh(IProgressMonitor monitor) {
259
    }
260

    
261
    /**
262
     * {@inheritDoc}
263
     */
264
    @Override
265
    public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
266
    }
267

    
268
}
(3-3/4)