Project

General

Profile

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

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

    
67
/**
68
 * @author pplitzner
69
 * @date 24.05.2017
70
 *
71
 */
72
public class CharacterEditor
73
        implements ICdmEntitySessionEnabled, ISelectionChangedListener, ModifyListener, IE4ViewerPart
74
        , IPartContentHasDetails, IPartContentHasSupplementalData{
75

    
76
    private FeatureTreeEditorComposite characterTreeEditorComposite;
77
    private FeatureTreeEditorComposite propertiesTreeEditorComposite;
78
    private FeatureTreeEditorComposite structuresTreeEditorComposite;
79
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
80
    private Button btnAddCharacter;
81

    
82
    @Inject
83
    private ESelectionService selService;
84

    
85
    @Inject
86
    private MDirtyable dirty;
87

    
88
    private ConversationHolder conversation;
89

    
90
    private ICdmEntitySession cdmEntitySession;
91
    private Composite composite;
92

    
93
    public CharacterEditor() {
94
    }
95

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

    
114
        SashForm sashForm = new SashForm(parent, SWT.NONE);
115
        sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
116
        formToolkit.adapt(sashForm);
117
        formToolkit.paintBordersFor(sashForm);
118

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

    
126
        structuresTreeEditorComposite = addFeatureTreeEditor(composite);
127
        initFeatureTreeComposite(structuresTreeEditorComposite, null, null);
128
        structuresTreeEditorComposite.getLabel_title().setText("Structures");
129

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

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

    
143
        Composite composite_2 = new Composite(sashForm, SWT.NONE);
144
        formToolkit.adapt(composite_2);
145
        formToolkit.paintBordersFor(composite_2);
146
        GridLayout gl_composite_2 = new GridLayout(1, false);
147
        gl_composite_2.marginWidth = 0;
148
        composite_2.setLayout(gl_composite_2);
149

    
150
        btnAddCharacter = new Button(composite_2, SWT.NONE);
151
        btnAddCharacter.setText(">>");
152
        btnAddCharacter.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, true, 1, 1));
153
        formToolkit.adapt(btnAddCharacter, true, true);
154

    
155
        Composite composite_3 = new Composite(sashForm, SWT.NONE);
156
        formToolkit.adapt(composite_3);
157
        formToolkit.paintBordersFor(composite_3);
158
        GridLayout gl_composite_3 = new GridLayout(1, false);
159
        gl_composite_3.marginWidth = 0;
160
        composite_3.setLayout(gl_composite_3);
161

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

    
166
        sashForm.setWeights(new int[] {9, 9, 1, 9});
167

    
168

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

    
172
        init();
173
    }
174

    
175
    private FeatureTreeEditorComposite addFeatureTreeEditor(Composite composite_3) {
176
        FeatureTreeEditorComposite featureTreeEditorComposite = new FeatureTreeEditorComposite(composite_3, SWT.NONE);
177
        featureTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
178
        return featureTreeEditorComposite;
179
    }
180

    
181
    private void initFeatureTreeComposite(FeatureTreeEditorComposite featureTreeEditorComposite,
182
            FeatureNodeDragListener featureNodeDragListener, FeatureNodeDropAdapter featureNodeDropAdapter) {
183
        featureTreeEditorComposite.init(featureNodeDragListener, featureNodeDropAdapter, this,
184
                new FeatureTreeChooserListener(featureTreeEditorComposite));
185
    }
186

    
187
    @Focus
188
    public void focus(){
189
        if(characterTreeEditorComposite!=null){
190
            characterTreeEditorComposite.getViewer().getControl().setFocus();
191
        }
192
        if(conversation!=null && !conversation.isBound()){
193
            conversation.bind();
194
        }
195
        if(cdmEntitySession != null) {
196
            cdmEntitySession.bind();
197
        }
198
    }
199

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

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

    
228
                        //add new Character to feature tree
229
                        FeatureNode parent = ((FeatureTree) characterTreeEditorComposite.getViewer().getInput()).getRoot();
230
                        CdmStore.getService(IFeatureNodeService.class).addChildFeatureNode(parent.getUuid(), character.getUuid());
231
                    }
232
                }
233

    
234
                setDirty(true);
235
                characterTreeEditorComposite.getViewer().refresh();
236
            }
237
        });
238
    }
239

    
240
    @Persist
241
    public void save(){
242
        if (!conversation.isBound()) {
243
            conversation.bind();
244
        }
245

    
246
        // commit the conversation and start a new transaction immediately
247
        conversation.commit(true);
248

    
249
        CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(characterTreeEditorComposite.getFeatureTree());
250

    
251
        this.setDirty(false);
252
    }
253

    
254
    @PreDestroy
255
    public void dispose(){
256
        if(conversation!=null){
257
            conversation.close();
258
        }
259
        if(cdmEntitySession != null) {
260
            cdmEntitySession.dispose();
261
        }
262
    }
263

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

    
277
    /**
278
     * {@inheritDoc}
279
     */
280
    @Override
281
    public List<FeatureTree> getRootEntities() {
282
        List<FeatureTree> root = new ArrayList<>();
283
        root.add(characterTreeEditorComposite.getFeatureTree());
284
        return root;
285
    }
286

    
287
    @Override
288
    public ICdmEntitySession getCdmEntitySession() {
289
        return cdmEntitySession;
290
    }
291

    
292
    @Focus
293
    public void setFocus() {
294
        if(conversation!=null && !conversation.isBound()){
295
            conversation.bind();
296
        }
297
    }
298

    
299
    /** {@inheritDoc} */
300
    @Override
301
    public void selectionChanged(SelectionChangedEvent event) {
302
        //propagate selection
303
        selService.setSelection(AbstractUtility.getElementsFromSelectionChangedEvent(event));
304
    }
305

    
306

    
307
    /**
308
     * {@inheritDoc}
309
     */
310
    @Override
311
    public void modifyText(ModifyEvent e) {
312
        characterTreeEditorComposite.getFeatureTree().setTitleCache(characterTreeEditorComposite.getText_title().getText(), true);
313
        setDirty(true);
314
    }
315

    
316

    
317
    public void setDirty(boolean isDirty) {
318
        dirty.setDirty(isDirty);
319
    }
320

    
321
    /**
322
     * {@inheritDoc}
323
     */
324
    @Override
325
    public IStructuredSelection getSelection() {
326
        return (IStructuredSelection) characterTreeEditorComposite.getViewer().getSelection();
327
    }
328

    
329
    @Override
330
    public void refresh(){
331
        structuresTreeEditorComposite.getViewer().refresh();
332
        propertiesTreeEditorComposite.getViewer().refresh();
333
        characterTreeEditorComposite.getViewer().refresh();
334
    }
335

    
336
    private class FeatureTreeChooserListener extends SelectionAdapter{
337
        FeatureTreeEditorComposite featureTreeEditorComposite;
338

    
339
        public FeatureTreeChooserListener(FeatureTreeEditorComposite featureTreeEditorComposite) {
340
            super();
341
            this.featureTreeEditorComposite = featureTreeEditorComposite;
342
        }
343

    
344
        @Override
345
        public void widgetSelected(SelectionEvent e) {
346
            FeatureTree tree = FeatureTreeSelectionDialog.select(featureTreeEditorComposite.getDisplay().getActiveShell(), conversation, null);
347
            if(tree!=null){
348
                featureTreeEditorComposite.setSelectedTree(tree, CharacterEditor.this);
349
                featureTreeEditorComposite.getText_title().setEnabled(false);
350
            }
351
        }
352
    }
353

    
354
}
(3-3/3)