Project

General

Profile

Download (13.9 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.ui.forms.widgets.FormToolkit;
46

    
47
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
48
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
49
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
50
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
51
import eu.etaxonomy.cdm.api.service.ITermService;
52
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
53
import eu.etaxonomy.cdm.model.description.Character;
54
import eu.etaxonomy.cdm.model.description.FeatureNode;
55
import eu.etaxonomy.cdm.model.description.FeatureTree;
56
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
57
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureNodeDragListener;
58
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureNodeDropAdapter;
59
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite;
60
import eu.etaxonomy.taxeditor.model.AbstractUtility;
61
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
62
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
63
import eu.etaxonomy.taxeditor.model.MessagingUtils;
64
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
65
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
66
import eu.etaxonomy.taxeditor.store.CdmStore;
67
import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
68
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
69
import eu.etaxonomy.taxeditor.workbench.part.IE4ViewerPart;
70

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

    
79
    private FeatureTreeEditorComposite characterTreeEditorComposite;
80
    private FeatureTreeEditorComposite propertiesTreeEditorComposite;
81
    private FeatureTreeEditorComposite structuresTreeEditorComposite;
82
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
83
    private Button btnAddCharacter;
84

    
85
    @Inject
86
    private ESelectionService selService;
87

    
88
    @Inject
89
    private MDirtyable dirty;
90

    
91
    private ConversationHolder conversation;
92

    
93
    private ICdmEntitySession cdmEntitySession;
94
    private Composite composite;
95

    
96
    public CharacterEditor() {
97
    }
98

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

    
117
        SashForm sashForm = new SashForm(parent, SWT.NONE);
118
        sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
119
        formToolkit.adapt(sashForm);
120
        formToolkit.paintBordersFor(sashForm);
121

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

    
129
        structuresTreeEditorComposite = addFeatureTreeEditor(composite);
130
        initFeatureTreeComposite(structuresTreeEditorComposite, null, null);
131
        structuresTreeEditorComposite.getLabel_title().setText("Structures");
132

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

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

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

    
153
        btnAddCharacter = new Button(composite_3, SWT.NONE);
154
        btnAddCharacter.setText(">>");
155
        formToolkit.adapt(btnAddCharacter, true, true);
156

    
157
        characterTreeEditorComposite = addFeatureTreeEditor(composite_3);
158
        initFeatureTreeComposite(characterTreeEditorComposite, new FeatureNodeDragListener(characterTreeEditorComposite.getViewer()), new FeatureNodeDropAdapter(dirty, characterTreeEditorComposite.getViewer()));
159
        characterTreeEditorComposite.getLabel_title().setText("Characters");
160

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

    
164
        init();
165
    }
166

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

    
173
    private void initFeatureTreeComposite(FeatureTreeEditorComposite featureTreeEditorComposite,
174
            FeatureNodeDragListener featureNodeDragListener, FeatureNodeDropAdapter featureNodeDropAdapter) {
175
        featureTreeEditorComposite.init(featureNodeDragListener, featureNodeDropAdapter, this,
176
                new FeatureTreeChooserListener(featureTreeEditorComposite));
177
    }
178

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

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

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

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

    
226
                setDirty(true);
227
                characterTreeEditorComposite.getViewer().refresh();
228
            }
229
        });
230
    }
231

    
232
    @Override
233
    @Persist
234
    public void save(IProgressMonitor monitor){
235
        if (!conversation.isBound()) {
236
            conversation.bind();
237
        }
238

    
239
        // commit the conversation and start a new transaction immediately
240
        conversation.commit(true);
241

    
242
        CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(characterTreeEditorComposite.getFeatureTree());
243

    
244
        this.setDirty(false);
245
    }
246

    
247
    @PreDestroy
248
    public void dispose(){
249
        if(conversation!=null){
250
            conversation.close();
251
            conversation = null;
252
        }
253
        if(cdmEntitySession != null) {
254
            cdmEntitySession.dispose();
255
            cdmEntitySession = null;
256
        }
257
    }
258

    
259
    @Override
260
    public Map<Object, List<String>> getPropertyPathsMap() {
261
        List<String> propertyPaths = Arrays.asList(new String[] {
262
                "children", //$NON-NLS-1$
263
                "feature", //$NON-NLS-1$
264
                "featureTree", //$NON-NLS-1$
265
        });
266
        Map<Object, List<String>> propertyPathMap =
267
                new HashMap<Object, List<String>>();
268
        propertyPathMap.put(FeatureNode.class,propertyPaths);
269
        return propertyPathMap;
270
    }
271

    
272
    /**
273
     * {@inheritDoc}
274
     */
275
    @Override
276
    public List<FeatureTree> getRootEntities() {
277
        List<FeatureTree> root = new ArrayList<>();
278
        root.add(characterTreeEditorComposite.getFeatureTree());
279
        return root;
280
    }
281

    
282
    @Override
283
    public ICdmEntitySession getCdmEntitySession() {
284
        return cdmEntitySession;
285
    }
286

    
287
    @Focus
288
    public void setFocus() {
289
        if(conversation!=null && !conversation.isBound()){
290
            conversation.bind();
291
        }
292
    }
293

    
294
    /** {@inheritDoc} */
295
    @Override
296
    public void selectionChanged(SelectionChangedEvent event) {
297
        //propagate selection
298
        selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event));
299
    }
300

    
301

    
302
    /**
303
     * {@inheritDoc}
304
     */
305
    @Override
306
    public void modifyText(ModifyEvent e) {
307
        characterTreeEditorComposite.getFeatureTree().setTitleCache(characterTreeEditorComposite.getText_title().getText(), true);
308
        setDirty(true);
309
    }
310

    
311

    
312
    public void setDirty(boolean isDirty) {
313
        dirty.setDirty(isDirty);
314
    }
315

    
316
    /**
317
     * {@inheritDoc}
318
     */
319
    @Override
320
    public IStructuredSelection getSelection() {
321
        return (IStructuredSelection) characterTreeEditorComposite.getViewer().getSelection();
322
    }
323

    
324
    @Override
325
    public void refresh(){
326
        structuresTreeEditorComposite.getViewer().refresh();
327
        propertiesTreeEditorComposite.getViewer().refresh();
328
        characterTreeEditorComposite.getViewer().refresh();
329
    }
330

    
331
    private class FeatureTreeChooserListener extends SelectionAdapter{
332
        FeatureTreeEditorComposite featureTreeEditorComposite;
333

    
334
        public FeatureTreeChooserListener(FeatureTreeEditorComposite featureTreeEditorComposite) {
335
            super();
336
            this.featureTreeEditorComposite = featureTreeEditorComposite;
337
        }
338

    
339
        @Override
340
        public void widgetSelected(SelectionEvent e) {
341
            FeatureTree tree = FeatureTreeSelectionDialog.select(featureTreeEditorComposite.getDisplay().getActiveShell(), //conversation,
342
                    null);
343
            if(tree!=null){
344
                featureTreeEditorComposite.setSelectedTree(tree, CharacterEditor.this);
345
                featureTreeEditorComposite.getText_title().setEnabled(false);
346
            }
347
        }
348
    }
349

    
350
    /**
351
     * {@inheritDoc}
352
     */
353
    @Override
354
    public void update(CdmDataChangeMap arg0) {
355
    }
356

    
357
    /**
358
     * {@inheritDoc}
359
     */
360
    @Override
361
    public ConversationHolder getConversationHolder() {
362
        return conversation;
363
    }
364

    
365
}
(3-3/3)