Project

General

Profile

Download (12.4 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;
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.e4.ui.di.Focus;
24
import org.eclipse.e4.ui.di.Persist;
25
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
26
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
27
import org.eclipse.jface.viewers.ISelection;
28
import org.eclipse.jface.viewers.ISelectionChangedListener;
29
import org.eclipse.jface.viewers.IStructuredSelection;
30
import org.eclipse.jface.viewers.SelectionChangedEvent;
31
import org.eclipse.jface.viewers.TreeSelection;
32
import org.eclipse.swt.SWT;
33
import org.eclipse.swt.custom.SashForm;
34
import org.eclipse.swt.events.ModifyEvent;
35
import org.eclipse.swt.events.ModifyListener;
36
import org.eclipse.swt.events.SelectionAdapter;
37
import org.eclipse.swt.events.SelectionEvent;
38
import org.eclipse.swt.layout.GridData;
39
import org.eclipse.swt.layout.GridLayout;
40
import org.eclipse.swt.widgets.Button;
41
import org.eclipse.swt.widgets.Composite;
42
import org.eclipse.swt.widgets.Display;
43
import org.eclipse.ui.forms.widgets.FormToolkit;
44

    
45
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
46
import eu.etaxonomy.cdm.api.service.IFeatureNodeService;
47
import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
48
import eu.etaxonomy.cdm.api.service.ITermService;
49
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
50
import eu.etaxonomy.cdm.model.description.Character;
51
import eu.etaxonomy.cdm.model.description.FeatureNode;
52
import eu.etaxonomy.cdm.model.description.FeatureTree;
53
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureNodeDragListener;
54
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureNodeDropAdapter;
55
import eu.etaxonomy.taxeditor.featuretree.e4.FeatureTreeEditorComposite;
56
import eu.etaxonomy.taxeditor.model.MessagingUtils;
57
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
58
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
59
import eu.etaxonomy.taxeditor.store.CdmStore;
60
import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
61

    
62
/**
63
 * @author pplitzner
64
 * @date 24.05.2017
65
 *
66
 */
67
public class CharacterEditor implements ICdmEntitySessionEnabled, ISelectionChangedListener, ModifyListener{
68

    
69

    
70
    private FeatureTreeEditorComposite characterTreeEditorComposite;
71
    private FeatureTreeEditorComposite propertiesTreeEditorComposite;
72
    private FeatureTreeEditorComposite structuresTreeEditorComposite;
73
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
74
    private Button btnAddCharacter;
75

    
76
    @Inject
77
    private ESelectionService selService;
78

    
79
    @Inject
80
    private MDirtyable dirty;
81

    
82
    private ConversationHolder conversation;
83

    
84
    private ICdmEntitySession cdmEntitySession;
85
    private Composite composite;
86

    
87
    public CharacterEditor() {
88
    }
89

    
90
    /**
91
     * Create contents of the view part.
92
     */
93
    @PostConstruct
94
    public void createControls(Composite parent) {
95
        if (CdmStore.isActive()){
96
            if(conversation == null){
97
                conversation = CdmStore.createConversation();
98
            }
99
            if(cdmEntitySession!=null){
100
                cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
101
            }
102
        }
103
        else{
104
            return;
105
        }
106
        parent.setLayout(new GridLayout(1, false));
107

    
108
        SashForm sashForm = new SashForm(parent, SWT.NONE);
109
        sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
110
        formToolkit.adapt(sashForm);
111
        formToolkit.paintBordersFor(sashForm);
112

    
113
        composite = new Composite(sashForm, SWT.NONE);
114
        formToolkit.adapt(composite);
115
        formToolkit.paintBordersFor(composite);
116
        composite.setLayout(new GridLayout(1, false));
117

    
118
        structuresTreeEditorComposite = addFeatureTreeEditor(composite);
119
        initFeatureTreeComposite(structuresTreeEditorComposite, null, null);
120
        structuresTreeEditorComposite.getLabel_title().setText("Structures");
121

    
122
        Composite composite_1 = new Composite(sashForm, SWT.NONE);
123
        formToolkit.adapt(composite_1);
124
        formToolkit.paintBordersFor(composite_1);
125
        composite_1.setLayout(new GridLayout(1, false));
126

    
127
        propertiesTreeEditorComposite = addFeatureTreeEditor(composite_1);
128
        initFeatureTreeComposite(propertiesTreeEditorComposite, null, null);
129
        propertiesTreeEditorComposite.getLabel_title().setText("Properties");
130
        //TODO: fix drag and drop
131
//        initFeatureTreeComposite(treeViewerProperties, new CharacterDragListener(treeViewerStructures.getViewer(), treeViewerProperties.getViewer()), null);
132

    
133
        Composite composite_2 = new Composite(sashForm, SWT.NONE);
134
        formToolkit.adapt(composite_2);
135
        formToolkit.paintBordersFor(composite_2);
136
        composite_2.setLayout(new GridLayout(1, false));
137

    
138
        btnAddCharacter = new Button(composite_2, SWT.NONE);
139
        btnAddCharacter.setText(">>");
140
        btnAddCharacter.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, true, 1, 1));
141
        formToolkit.adapt(btnAddCharacter, true, true);
142

    
143
        Composite composite_3 = new Composite(sashForm, SWT.NONE);
144
        formToolkit.adapt(composite_3);
145
        formToolkit.paintBordersFor(composite_3);
146
        composite_3.setLayout(new GridLayout(1, false));
147

    
148
        characterTreeEditorComposite = addFeatureTreeEditor(composite_3);
149
        initFeatureTreeComposite(characterTreeEditorComposite, new FeatureNodeDragListener(characterTreeEditorComposite.getViewer()), new FeatureNodeDropAdapter(dirty, characterTreeEditorComposite.getViewer()));
150
        characterTreeEditorComposite.getLabel_title().setText("Characters");
151

    
152
        sashForm.setWeights(new int[] {3, 3, 1, 3});
153

    
154
        init();
155
    }
156

    
157
    private FeatureTreeEditorComposite addFeatureTreeEditor(Composite composite_3) {
158
        FeatureTreeEditorComposite featureTreeEditorComposite = new FeatureTreeEditorComposite(composite_3, SWT.BORDER);
159
        featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
160
        return featureTreeEditorComposite;
161
    }
162

    
163
    private void initFeatureTreeComposite(FeatureTreeEditorComposite featureTreeEditorComposite,
164
            FeatureNodeDragListener featureNodeDragListener, FeatureNodeDropAdapter featureNodeDropAdapter) {
165
        featureTreeEditorComposite.init(featureNodeDragListener, featureNodeDropAdapter, this,
166
                new FeatureTreeChooserListener(featureTreeEditorComposite));
167
    }
168

    
169
    @Focus
170
    public void focus(){
171
        if(characterTreeEditorComposite!=null){
172
            characterTreeEditorComposite.getViewer().getControl().setFocus();
173
        }
174
        if(conversation!=null && !conversation.isBound()){
175
            conversation.bind();
176
        }
177
        if(cdmEntitySession != null) {
178
            cdmEntitySession.bind();
179
        }
180
    }
181

    
182
    private void init(){
183
        btnAddCharacter.addSelectionListener(new SelectionAdapter() {
184
            /**
185
             * {@inheritDoc}
186
             */
187
            @Override
188
            public void widgetSelected(SelectionEvent e) {
189
                ISelection structureTreeSelection = structuresTreeEditorComposite.getViewer().getSelection();
190
                ISelection propertyTreeSelection = propertiesTreeEditorComposite.getViewer().getSelection();
191
                if(structureTreeSelection==null || propertyTreeSelection==null || characterTreeEditorComposite.getFeatureTree()==null){
192
                    MessagingUtils.warningDialog("Cannot perform action", CharacterEditor.this,
193
                            "You have to select a structure, a property and a feature tree to perform this action.");
194
                    return;
195
                }
196
                //get selected structures and properties
197
                Iterator<FeatureNode> structureIterator = ((TreeSelection)structureTreeSelection).iterator();
198

    
199
                //create all combinations of structures and properties
200
                while(structureIterator.hasNext()){
201
                    FeatureNode structureNode = structureIterator.next();
202
                    Iterator<FeatureNode> propertiesIterator = ((TreeSelection)propertyTreeSelection).iterator();
203
                    while(propertiesIterator.hasNext()){
204
                        FeatureNode propertyNode = propertiesIterator.next();
205
                        //create new Character
206
                        String label = structureNode.getFeature().generateTitle()+" "+propertyNode.getFeature().generateTitle();
207
                        Character character = Character.NewInstance(structureNode, propertyNode, "", label, label);
208
                        character = HibernateProxyHelper.deproxy(CdmStore.getService(ITermService.class).merge(character), Character.class);
209

    
210
                        //add new Character to feature tree
211
                        FeatureNode parent = ((FeatureTree) characterTreeEditorComposite.getViewer().getInput()).getRoot();
212
                        CdmStore.getService(IFeatureNodeService.class).addChildFeatureNode(parent.getUuid(), character.getUuid());
213
                    }
214
                }
215

    
216
                setDirty(true);
217
                characterTreeEditorComposite.getViewer().refresh();
218
            }
219
        });
220
    }
221

    
222
    @Persist
223
    public void save(){
224
        if (!conversation.isBound()) {
225
            conversation.bind();
226
        }
227

    
228
        // commit the conversation and start a new transaction immediately
229
        conversation.commit(true);
230

    
231
        CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(characterTreeEditorComposite.getFeatureTree());
232

    
233
        this.setDirty(false);
234
    }
235

    
236
    @PreDestroy
237
    public void dispose(){
238
        if(conversation!=null){
239
            conversation.close();
240
        }
241
        if(cdmEntitySession != null) {
242
            cdmEntitySession.dispose();
243
        }
244
    }
245

    
246
    @Override
247
    public Map<Object, List<String>> getPropertyPathsMap() {
248
        List<String> propertyPaths = Arrays.asList(new String[] {
249
                "children", //$NON-NLS-1$
250
                "feature", //$NON-NLS-1$
251
                "featureTree", //$NON-NLS-1$
252
        });
253
        Map<Object, List<String>> propertyPathMap =
254
                new HashMap<Object, List<String>>();
255
        propertyPathMap.put(FeatureNode.class,propertyPaths);
256
        return propertyPathMap;
257
    }
258

    
259
    /**
260
     * {@inheritDoc}
261
     */
262
    @Override
263
    public List<FeatureTree> getRootEntities() {
264
        List<FeatureTree> root = new ArrayList<>();
265
        root.add(characterTreeEditorComposite.getFeatureTree());
266
        return root;
267
    }
268

    
269
    @Override
270
    public ICdmEntitySession getCdmEntitySession() {
271
        return cdmEntitySession;
272
    }
273

    
274
    @Focus
275
    public void setFocus() {
276
        if(conversation!=null && !conversation.isBound()){
277
            conversation.bind();
278
        }
279
    }
280

    
281
    /**
282
     * {@inheritDoc}
283
     */
284
    @Override
285
    public void selectionChanged(SelectionChangedEvent event) {
286
        //propagate selection
287
        IStructuredSelection isel = (IStructuredSelection) event.getSelection();
288
        selService.setSelection((isel.size() == 1 ? isel.getFirstElement() : isel.toArray()));
289
    }
290

    
291

    
292
    /**
293
     * {@inheritDoc}
294
     */
295
    @Override
296
    public void modifyText(ModifyEvent e) {
297
        characterTreeEditorComposite.getFeatureTree().setTitleCache(characterTreeEditorComposite.getText_title().getText(), true);
298
        setDirty(true);
299
    }
300

    
301

    
302
    public void setDirty(boolean isDirty) {
303
        dirty.setDirty(isDirty);
304
    }
305

    
306
    private class FeatureTreeChooserListener extends SelectionAdapter{
307
        FeatureTreeEditorComposite featureTreeEditorComposite;
308

    
309
        public FeatureTreeChooserListener(FeatureTreeEditorComposite featureTreeEditorComposite) {
310
            super();
311
            this.featureTreeEditorComposite = featureTreeEditorComposite;
312
        }
313

    
314
        @Override
315
        public void widgetSelected(SelectionEvent e) {
316
            FeatureTree tree = FeatureTreeSelectionDialog.select(featureTreeEditorComposite.getDisplay().getActiveShell(), conversation, null);
317
            if(tree!=null){
318
                featureTreeEditorComposite.setSelectedTree(tree, CharacterEditor.this);
319
                featureTreeEditorComposite.getText_title().setEnabled(false);
320
            }
321
        }
322
    }
323

    
324
}
(3-3/3)