Project

General

Profile

Download (14.5 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2017 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10
package eu.etaxonomy.taxeditor.editor.workingSet.character;
11

    
12
import java.util.ArrayList;
13
import java.util.Arrays;
14
import java.util.HashMap;
15
import java.util.Iterator;
16
import java.util.List;
17
import java.util.Map;
18

    
19
import javax.annotation.PostConstruct;
20
import javax.annotation.PreDestroy;
21
import javax.inject.Inject;
22

    
23
import org.eclipse.core.runtime.IProgressMonitor;
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.services.EMenuService;
28
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
29
import org.eclipse.jface.viewers.ISelection;
30
import org.eclipse.jface.viewers.ISelectionChangedListener;
31
import org.eclipse.jface.viewers.IStructuredSelection;
32
import org.eclipse.jface.viewers.SelectionChangedEvent;
33
import org.eclipse.jface.viewers.TreeSelection;
34
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.custom.SashForm;
36
import org.eclipse.swt.events.ModifyEvent;
37
import org.eclipse.swt.events.ModifyListener;
38
import org.eclipse.swt.events.SelectionAdapter;
39
import org.eclipse.swt.events.SelectionEvent;
40
import org.eclipse.swt.layout.GridData;
41
import org.eclipse.swt.layout.GridLayout;
42
import org.eclipse.swt.widgets.Button;
43
import org.eclipse.swt.widgets.Composite;
44
import org.eclipse.swt.widgets.Display;
45
import org.eclipse.swt.widgets.Text;
46
import org.eclipse.ui.forms.widgets.FormToolkit;
47

    
48
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
49
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
50
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
51
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
52
import eu.etaxonomy.cdm.api.service.ITermService;
53
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
54
import eu.etaxonomy.cdm.model.description.Character;
55
import eu.etaxonomy.cdm.model.description.FeatureNode;
56
import eu.etaxonomy.cdm.model.description.FeatureTree;
57
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
58
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureNodeDragListener;
59
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureNodeDropAdapter;
60
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite;
61
import eu.etaxonomy.taxeditor.model.AbstractUtility;
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.model.MessagingUtils;
66
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
67
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
68
import eu.etaxonomy.taxeditor.store.CdmStore;
69
import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
70
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
71
import eu.etaxonomy.taxeditor.workbench.part.IE4ViewerPart;
72

    
73
/**
74
 * @author pplitzner
75
 * @date 24.05.2017
76
 *
77
 */
78
public class CharacterEditor implements ICdmEntitySessionEnabled, IConversationEnabled, ISelectionChangedListener,
79
        ModifyListener, IE4ViewerPart, IPartContentHasDetails, IPartContentHasSupplementalData, IE4SavablePart,
80
        IDirtyMarkable {
81

    
82
    private FeatureTreeEditorComposite characterTreeEditorComposite;
83
    private FeatureTreeEditorComposite propertiesTreeEditorComposite;
84
    private FeatureTreeEditorComposite structuresTreeEditorComposite;
85
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
86
    private Button btnAddCharacter;
87

    
88
    @Inject
89
    private ESelectionService selService;
90

    
91
    @Inject
92
    private MDirtyable dirty;
93

    
94
    private ConversationHolder conversation;
95

    
96
    private ICdmEntitySession cdmEntitySession;
97
    private Composite composite;
98

    
99
    public CharacterEditor() {
100
    }
101

    
102
    /**
103
     * Create contents of the view part.
104
     */
105
    @PostConstruct
106
    public void createControls(Composite parent, EMenuService menuService ) {
107
        if (CdmStore.isActive()){
108
            if(conversation == null){
109
                conversation = CdmStore.createConversation();
110
            }
111
            if(cdmEntitySession!=null){
112
                cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
113
            }
114
        }
115
        else{
116
            return;
117
        }
118
        parent.setLayout(new GridLayout(1, false));
119

    
120
        SashForm sashForm = new SashForm(parent, SWT.NONE);
121
        sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
122
        formToolkit.adapt(sashForm);
123
        formToolkit.paintBordersFor(sashForm);
124

    
125
        composite = new Composite(sashForm, SWT.NONE);
126
        formToolkit.adapt(composite);
127
        formToolkit.paintBordersFor(composite);
128
        GridLayout gl_composite = new GridLayout(1, false);
129
        gl_composite.marginWidth = 0;
130
        composite.setLayout(gl_composite);
131

    
132
        structuresTreeEditorComposite = addFeatureTreeEditor(composite);
133
        initFeatureTreeComposite(structuresTreeEditorComposite, null, null);
134
        structuresTreeEditorComposite.getLabel_title().setText("Structures");
135

    
136
        Composite composite_1 = new Composite(sashForm, SWT.NONE);
137
        formToolkit.adapt(composite_1);
138
        formToolkit.paintBordersFor(composite_1);
139
        GridLayout gl_composite_1 = new GridLayout(1, false);
140
        gl_composite_1.marginWidth = 0;
141
        composite_1.setLayout(gl_composite_1);
142

    
143
        propertiesTreeEditorComposite = addFeatureTreeEditor(composite_1);
144
        initFeatureTreeComposite(propertiesTreeEditorComposite, null, null);
145
        propertiesTreeEditorComposite.getLabel_title().setText("Properties");
146
        //TODO: fix drag and drop
147
//        initFeatureTreeComposite(treeViewerProperties, new CharacterDragListener(treeViewerStructures.getViewer(), treeViewerProperties.getViewer()), null);
148

    
149
        Composite composite_3 = new Composite(sashForm, SWT.NONE);
150
        formToolkit.adapt(composite_3);
151
        formToolkit.paintBordersFor(composite_3);
152
        GridLayout gl_composite_3 = new GridLayout(2, false);
153
        gl_composite_3.marginWidth = 0;
154
        composite_3.setLayout(gl_composite_3);
155

    
156
        btnAddCharacter = new Button(composite_3, SWT.NONE);
157
        btnAddCharacter.setText(">>");
158
        formToolkit.adapt(btnAddCharacter, true, true);
159

    
160
        characterTreeEditorComposite = addFeatureTreeEditor(composite_3);
161
        initFeatureTreeComposite(characterTreeEditorComposite, new FeatureNodeDragListener(characterTreeEditorComposite.getViewer()), new FeatureNodeDropAdapter(dirty, characterTreeEditorComposite.getViewer()));
162
        characterTreeEditorComposite.getLabel_title().setText("Characters");
163

    
164
        //add context menu to character viewer//create context menu
165
        menuService.registerContextMenu(characterTreeEditorComposite.getViewer().getControl(), "eu.etaxonomy.taxeditor.editor.popupmenu.characterEditor");
166

    
167
        init();
168
    }
169

    
170
    private FeatureTreeEditorComposite addFeatureTreeEditor(Composite composite_3) {
171
        FeatureTreeEditorComposite featureTreeEditorComposite = new FeatureTreeEditorComposite(composite_3, SWT.NONE);
172
        featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
173
        return featureTreeEditorComposite;
174
    }
175

    
176
    private void initFeatureTreeComposite(FeatureTreeEditorComposite featureTreeEditorComposite,
177
            FeatureNodeDragListener featureNodeDragListener, FeatureNodeDropAdapter featureNodeDropAdapter) {
178
        featureTreeEditorComposite.init(featureNodeDragListener, featureNodeDropAdapter, this,
179
                new FeatureTreeChooserListener(featureTreeEditorComposite), this);
180
    }
181

    
182
    @Focus
183
    public void focus(){
184
        if(characterTreeEditorComposite!=null){
185
            characterTreeEditorComposite.getViewer().getControl().setFocus();
186
        }
187
        if(conversation!=null && !conversation.isBound()){
188
            conversation.bind();
189
        }
190
        if(cdmEntitySession != null) {
191
            cdmEntitySession.bind();
192
        }
193
    }
194

    
195
    private void init(){
196
        btnAddCharacter.addSelectionListener(new SelectionAdapter() {
197
            /**
198
             * {@inheritDoc}
199
             */
200
            @Override
201
            public void widgetSelected(SelectionEvent e) {
202
                ISelection structureTreeSelection = structuresTreeEditorComposite.getViewer().getSelection();
203
                ISelection propertyTreeSelection = propertiesTreeEditorComposite.getViewer().getSelection();
204
                if(structureTreeSelection==null || propertyTreeSelection==null || characterTreeEditorComposite.getFeatureTree()==null){
205
                    MessagingUtils.warningDialog("Cannot perform action", CharacterEditor.this,
206
                            "You have to select a structure, a property and a feature tree to perform this action.");
207
                    return;
208
                }
209
                //get selected structures and properties
210
                Iterator<FeatureNode> structureIterator = ((TreeSelection)structureTreeSelection).iterator();
211

    
212
                //create all combinations of structures and properties
213
                while(structureIterator.hasNext()){
214
                    FeatureNode structureNode = structureIterator.next();
215
                    Iterator<FeatureNode> propertiesIterator = ((TreeSelection)propertyTreeSelection).iterator();
216
                    while(propertiesIterator.hasNext()){
217
                        FeatureNode propertyNode = propertiesIterator.next();
218
                        //create new Character
219
                        String label = structureNode.getFeature().generateTitle()+" "+propertyNode.getFeature().generateTitle();
220
                        Character character = Character.NewInstance(structureNode, propertyNode, "", label, label);
221
                        character = HibernateProxyHelper.deproxy(CdmStore.getService(ITermService.class).merge(character), Character.class);
222

    
223
                        //add new Character to feature tree
224
                        FeatureNode parent = ((FeatureTree) characterTreeEditorComposite.getViewer().getInput()).getRoot();
225
                        CdmStore.getService(IFeatureNodeService.class).addChildFeatureNode(parent.getUuid(), character.getUuid());
226
                    }
227
                }
228

    
229
                setDirty();
230
                characterTreeEditorComposite.getViewer().refresh();
231
            }
232
        });
233
    }
234

    
235
    @Override
236
    @Persist
237
    public void save(IProgressMonitor monitor){
238
        if (!conversation.isBound()) {
239
            conversation.bind();
240
        }
241

    
242
        // commit the conversation and start a new transaction immediately
243
        conversation.commit(true);
244

    
245
        FeatureTree featureTree = characterTreeEditorComposite.getFeatureTree();
246
        if(featureTree!=null){
247
            //save characters because they can be modified in this editor
248
            featureTree.getDistinctFeatures().forEach(character->CdmStore.getService(ITermService.class).merge(character,true));
249
        }
250
        CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(featureTree);
251

    
252

    
253
        dirty.setDirty(false);
254
    }
255

    
256
    @PreDestroy
257
    public void dispose(){
258
        if(conversation!=null){
259
            conversation.close();
260
            conversation = null;
261
        }
262
        if(cdmEntitySession != null) {
263
            cdmEntitySession.dispose();
264
            cdmEntitySession = null;
265
        }
266
        dirty.setDirty(false);
267
    }
268

    
269
    @Override
270
    public Map<Object, List<String>> getPropertyPathsMap() {
271
        List<String> propertyPaths = Arrays.asList(new String[] {
272
                "children", //$NON-NLS-1$
273
                "feature", //$NON-NLS-1$
274
                "featureTree", //$NON-NLS-1$
275
        });
276
        Map<Object, List<String>> propertyPathMap =
277
                new HashMap<Object, List<String>>();
278
        propertyPathMap.put(FeatureNode.class,propertyPaths);
279
        return propertyPathMap;
280
    }
281

    
282
    /**
283
     * {@inheritDoc}
284
     */
285
    @Override
286
    public List<FeatureTree> getRootEntities() {
287
        List<FeatureTree> root = new ArrayList<>();
288
        root.add(characterTreeEditorComposite.getFeatureTree());
289
        return root;
290
    }
291

    
292
    @Override
293
    public ICdmEntitySession getCdmEntitySession() {
294
        return cdmEntitySession;
295
    }
296

    
297
    @Focus
298
    public void setFocus() {
299
        if(conversation!=null && !conversation.isBound()){
300
            conversation.bind();
301
        }
302
    }
303

    
304
    /** {@inheritDoc} */
305
    @Override
306
    public void selectionChanged(SelectionChangedEvent event) {
307
        //propagate selection
308
        selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event));
309
    }
310

    
311

    
312
    /**
313
     * {@inheritDoc}
314
     */
315
    @Override
316
    public void modifyText(ModifyEvent e) {
317
        characterTreeEditorComposite.getFeatureTree().setTitleCache(((Text) e.widget).getText(), true);
318
        setDirty();
319
    }
320

    
321

    
322
    private void setDirty() {
323
        dirty.setDirty(true);
324
    }
325

    
326
    /**
327
     * {@inheritDoc}
328
     */
329
    @Override
330
    public IStructuredSelection getSelection() {
331
        return (IStructuredSelection) characterTreeEditorComposite.getViewer().getSelection();
332
    }
333

    
334
    @Override
335
    public void refresh(){
336
        structuresTreeEditorComposite.getViewer().refresh();
337
        propertiesTreeEditorComposite.getViewer().refresh();
338
        characterTreeEditorComposite.getViewer().refresh();
339
    }
340

    
341
    private class FeatureTreeChooserListener extends SelectionAdapter{
342
        FeatureTreeEditorComposite featureTreeEditorComposite;
343

    
344
        public FeatureTreeChooserListener(FeatureTreeEditorComposite featureTreeEditorComposite) {
345
            super();
346
            this.featureTreeEditorComposite = featureTreeEditorComposite;
347
        }
348

    
349
        @Override
350
        public void widgetSelected(SelectionEvent e) {
351
            FeatureTree tree = FeatureTreeSelectionDialog.select(featureTreeEditorComposite.getDisplay().getActiveShell(), //conversation,
352
                    null);
353
            if(tree!=null){
354
                featureTreeEditorComposite.setSelectedTree(tree);
355
                featureTreeEditorComposite.getText_title().setEnabled(false);
356
            }
357
        }
358
    }
359

    
360
    /**
361
     * {@inheritDoc}
362
     */
363
    @Override
364
    public void update(CdmDataChangeMap arg0) {
365
    }
366

    
367
    /**
368
     * {@inheritDoc}
369
     */
370
    @Override
371
    public ConversationHolder getConversationHolder() {
372
        return conversation;
373
    }
374

    
375
    /**
376
     * {@inheritDoc}
377
     */
378
    @Override
379
    public void changed(Object element) {
380
        setDirty();
381
    }
382

    
383
    /**
384
     * {@inheritDoc}
385
     */
386
    @Override
387
    public void forceDirty() {
388
        setDirty();
389
    }
390

    
391
}
(3-3/3)