Project

General

Profile

Download (25.4 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 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.descriptiveDataSet.character;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.Collection;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.Iterator;
17
import java.util.List;
18
import java.util.Map;
19
import java.util.Set;
20
import java.util.UUID;
21

    
22
import javax.annotation.PostConstruct;
23
import javax.annotation.PreDestroy;
24
import javax.inject.Inject;
25

    
26
import org.eclipse.core.runtime.IProgressMonitor;
27
import org.eclipse.e4.core.di.annotations.Optional;
28
import org.eclipse.e4.ui.di.Focus;
29
import org.eclipse.e4.ui.di.Persist;
30
import org.eclipse.e4.ui.di.UIEventTopic;
31
import org.eclipse.e4.ui.di.UISynchronize;
32
import org.eclipse.e4.ui.model.application.ui.MDirtyable;
33
import org.eclipse.e4.ui.services.EMenuService;
34
import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
35
import org.eclipse.jface.viewers.ISelection;
36
import org.eclipse.jface.viewers.ISelectionChangedListener;
37
import org.eclipse.jface.viewers.IStructuredSelection;
38
import org.eclipse.jface.viewers.SelectionChangedEvent;
39
import org.eclipse.jface.viewers.StructuredSelection;
40
import org.eclipse.jface.viewers.TreeSelection;
41
import org.eclipse.jface.viewers.TreeViewer;
42
import org.eclipse.swt.SWT;
43
import org.eclipse.swt.custom.SashForm;
44
import org.eclipse.swt.dnd.DND;
45
import org.eclipse.swt.dnd.Transfer;
46
import org.eclipse.swt.events.ModifyEvent;
47
import org.eclipse.swt.events.ModifyListener;
48
import org.eclipse.swt.events.SelectionAdapter;
49
import org.eclipse.swt.events.SelectionEvent;
50
import org.eclipse.swt.layout.GridData;
51
import org.eclipse.swt.layout.GridLayout;
52
import org.eclipse.swt.widgets.Button;
53
import org.eclipse.swt.widgets.Composite;
54
import org.eclipse.swt.widgets.Display;
55
import org.eclipse.swt.widgets.Label;
56
import org.eclipse.swt.widgets.Text;
57
import org.eclipse.ui.forms.widgets.FormToolkit;
58

    
59
import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
60
import eu.etaxonomy.cdm.api.conversation.IConversationEnabled;
61
import eu.etaxonomy.cdm.api.service.ITermNodeService;
62
import eu.etaxonomy.cdm.api.service.ITermTreeService;
63
import eu.etaxonomy.cdm.api.service.IVocabularyService;
64
import eu.etaxonomy.cdm.api.service.UpdateResult;
65
import eu.etaxonomy.cdm.model.common.Language;
66
import eu.etaxonomy.cdm.model.description.Character;
67
import eu.etaxonomy.cdm.model.description.Feature;
68
import eu.etaxonomy.cdm.model.term.DefinedTerm;
69
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
70
import eu.etaxonomy.cdm.model.term.Representation;
71
import eu.etaxonomy.cdm.model.term.TermNode;
72
import eu.etaxonomy.cdm.model.term.TermTree;
73
import eu.etaxonomy.cdm.model.term.TermType;
74
import eu.etaxonomy.cdm.model.term.TermVocabulary;
75
import eu.etaxonomy.cdm.model.term.VocabularyEnum;
76
import eu.etaxonomy.cdm.persistence.dto.CharacterDto;
77
import eu.etaxonomy.cdm.persistence.dto.CharacterNodeDto;
78
import eu.etaxonomy.cdm.persistence.dto.TermDto;
79
import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
80
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto;
81
import eu.etaxonomy.cdm.persistence.hibernate.CdmDataChangeMap;
82
import eu.etaxonomy.taxeditor.editor.AppModelId;
83
import eu.etaxonomy.taxeditor.editor.definedterm.TermTreeViewerComparator;
84
import eu.etaxonomy.taxeditor.editor.l10n.Messages;
85
import eu.etaxonomy.taxeditor.event.WorkbenchEventConstants;
86
import eu.etaxonomy.taxeditor.model.AbstractUtility;
87
import eu.etaxonomy.taxeditor.model.IDirtyMarkable;
88
import eu.etaxonomy.taxeditor.model.IPartContentHasDetails;
89
import eu.etaxonomy.taxeditor.model.IPartContentHasSupplementalData;
90
import eu.etaxonomy.taxeditor.model.ImageResources;
91
import eu.etaxonomy.taxeditor.model.MessagingUtils;
92
import eu.etaxonomy.taxeditor.operation.AbstractPostOperation;
93
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
94
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
95
import eu.etaxonomy.taxeditor.store.CdmStore;
96
import eu.etaxonomy.taxeditor.store.StoreUtil;
97
import eu.etaxonomy.taxeditor.termtree.CharacterTransfer;
98
import eu.etaxonomy.taxeditor.termtree.TermTreeContentProvider;
99
import eu.etaxonomy.taxeditor.termtree.TermTreeLabelProvider;
100
import eu.etaxonomy.taxeditor.termtree.e4.ICharacterEditor;
101
import eu.etaxonomy.taxeditor.termtree.e4.TermNodeDtoDragListener;
102
import eu.etaxonomy.taxeditor.termtree.e4.TermTreeDtoDropAdapter;
103
import eu.etaxonomy.taxeditor.termtree.e4.TermTreeDtoEditorComposite;
104
import eu.etaxonomy.taxeditor.termtree.e4.TermTreeEditor;
105
import eu.etaxonomy.taxeditor.ui.dialog.selection.FeatureTreeSelectionDialog;
106
import eu.etaxonomy.taxeditor.ui.dialog.selection.TermVocabularySelectionDialog;
107
import eu.etaxonomy.taxeditor.workbench.part.IE4SavablePart;
108
import eu.etaxonomy.taxeditor.workbench.part.IE4ViewerPart;
109

    
110
/**
111
 * Editor for combining structure and property terms to characters.
112
 * @author pplitzner
113
 * @date 24.05.2017
114
 */
115
public class CharacterEditor implements ICharacterEditor, IConversationEnabled, ISelectionChangedListener,
116
        ModifyListener, IE4ViewerPart, IPartContentHasDetails, IPartContentHasSupplementalData,
117
        IDirtyMarkable, IE4SavablePart {
118

    
119
    private TermTreeDtoEditorComposite characterTreeEditorComposite;
120
    private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
121

    
122
    @Inject
123
    private ESelectionService selService;
124

    
125
    @Inject
126
    private UISynchronize sync;
127

    
128
    @Inject
129
    private MDirtyable dirty;
130

    
131
    private ConversationHolder conversation;
132

    
133
    private ICdmEntitySession cdmEntitySession;
134

    
135
    private TermVocabulary vocabulary;
136
    private TreeViewer structureViewer;
137
    private TreeViewer propertyViewer;
138

    
139
    private List<AbstractPostOperation> operations = new ArrayList<>();
140

    
141
    private List<CharacterNodeDto> nodesToUpdate = new ArrayList<>();
142

    
143
    private Map<Character, CharacterNodeDto> nodesToSave = new HashMap<>();
144

    
145
    public CharacterEditor() {
146
    }
147

    
148
    /**
149
     * Create contents of the view part.
150
     */
151
    @PostConstruct
152
    public void createControls(Composite parent, EMenuService menuService ) {
153
        if (CdmStore.isActive()){
154
            if(conversation == null){
155
                conversation = CdmStore.createConversation();
156
            }
157
            if(cdmEntitySession==null){
158
                cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
159
            }
160
        }
161
        else{
162
            return;
163
        }
164
        parent.setLayout(new GridLayout(1, false));
165

    
166
        Composite vocChooserComposite = new Composite(parent, SWT.NONE);
167
        vocChooserComposite.setLayout(new GridLayout(4, false));
168
        vocChooserComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, false, false, 2, 1));
169
        Label lblVocImport = new Label(vocChooserComposite, SWT.NONE);
170
        lblVocImport.setText("Character vocabulary:");
171
        Text txtVocabulary = new Text(vocChooserComposite, SWT.NONE);
172
        txtVocabulary.setEditable(false);
173
        Button btnChooseVoc = new Button(vocChooserComposite, SWT.PUSH);
174
        btnChooseVoc.setImage(ImageResources.getImage(ImageResources.BROWSE_ICON));
175
        btnChooseVoc.addSelectionListener(new SelectionAdapter() {
176

    
177
            @Override
178
            public void widgetSelected(SelectionEvent e) {
179
                // hard-coded filter for "built-in" vocabularies Feature and Name Feature
180
                Set<TermVocabulary> vocabulariesToBeFiltered = new HashSet<>();
181
                vocabulariesToBeFiltered.add(CdmStore.getService(IVocabularyService.class).load(VocabularyEnum.Feature.getUuid()));
182
                vocabulariesToBeFiltered.add(CdmStore.getService(IVocabularyService.class).load(VocabularyEnum.NameFeature.getUuid()));
183
                if(vocabulary!=null){
184
                    vocabulariesToBeFiltered.add(vocabulary);
185
                }
186
                vocabulary = TermVocabularySelectionDialog.select("Select vocabulary for characters", btnChooseVoc.getShell(), vocabulariesToBeFiltered, TermType.Character);
187
                if(vocabulary!=null){
188
                    txtVocabulary.setText(vocabulary.getLabel());
189
                }
190
            }
191
        });
192

    
193
        SashForm sashForm = new SashForm(parent, SWT.NONE);
194
        sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
195
        formToolkit.adapt(sashForm);
196
        formToolkit.paintBordersFor(sashForm);
197

    
198
        Composite composite = new Composite(sashForm, SWT.NONE);
199
        formToolkit.adapt(composite);
200
        formToolkit.paintBordersFor(composite);
201
        GridLayout gl_composite = new GridLayout(1, false);
202
        gl_composite.marginWidth = 0;
203
        composite.setLayout(gl_composite);
204

    
205
        structureViewer = createTreeViewer(composite, TermType.Structure, Messages.CharacterEditor_STRUCTURES);
206

    
207
        Composite composite_1 = new Composite(sashForm, SWT.NONE);
208
        formToolkit.adapt(composite_1);
209
        formToolkit.paintBordersFor(composite_1);
210
        GridLayout gl_composite_1 = new GridLayout(1, false);
211
        gl_composite_1.marginWidth = 0;
212
        composite_1.setLayout(gl_composite_1);
213

    
214
        propertyViewer = createTreeViewer(composite_1, TermType.Property, Messages.CharacterEditor_PROPERTIES);
215

    
216
        int ops = DND.DROP_COPY | DND.DROP_MOVE;
217
        Transfer[] transfers = new Transfer[] {CharacterTransfer.getInstance()};
218
        propertyViewer.addDragSupport(ops, transfers, new CharacterDragListener(structureViewer, propertyViewer));
219

    
220
        Composite composite_3 = new Composite(sashForm, SWT.NONE);
221
        formToolkit.adapt(composite_3);
222
        formToolkit.paintBordersFor(composite_3);
223
        GridLayout gl_composite_3 = new GridLayout(2, false);
224
        gl_composite_3.marginWidth = 0;
225
        composite_3.setLayout(gl_composite_3);
226

    
227
        Button btnAddCharacter = new Button(composite_3, SWT.NONE);
228
        btnAddCharacter.setText(">>"); //$NON-NLS-1$
229
        formToolkit.adapt(btnAddCharacter, true, true);
230
        btnAddCharacter.addSelectionListener(new SelectionAdapter() {
231
            @Override
232
            public void widgetSelected(SelectionEvent e) {
233
                if(!isVocabularySet()){
234
                    return;
235
                }
236
                if (confirmSaveDirty()){
237
                    return;
238
                }
239
                ISelection structureTreeSelection = structureViewer.getSelection();
240
                ISelection propertyTreeSelection = propertyViewer.getSelection();
241
                if(structureTreeSelection==null || propertyTreeSelection==null || characterTreeEditorComposite.getFeatureTree()==null){
242
                    MessagingUtils.warningDialog(Messages.CharacterEditor_CANNOT_PERFORM_TITLE, CharacterEditor.this,
243
                            Messages.CharacterEditor_CANNOT_PERFORM_MESSAGE);
244
                    return;
245
                }
246
                Collection<Character> characters = createCharacters((TreeSelection)structureTreeSelection, (TreeSelection)propertyTreeSelection);
247
                TermNodeDto parent = characterTreeEditorComposite.getFeatureTree().getRoot();
248

    
249
                for (Character character : characters) {
250
                    //add new Character to feature tree
251
                    CharacterNodeDto nodeDto = new CharacterNodeDto(CharacterDto.fromCharacter(character), parent, 0, parent.getTree(), null, null, null);
252
                    nodesToSave.put(character, nodeDto);
253
                    setDirty();
254
                    //                    result = CdmStore.getService(IFeatureNodeService.class).createChildFeatureNode(parent.getUuid(), character, vocabulary.getUuid());
255

    
256
                }
257

    
258

    
259
                refresh();
260
            }
261
        });
262

    
263
        characterTreeEditorComposite = addFeatureTreeEditor(composite_3);
264
        initFeatureTreeComposite(TermType.Character, characterTreeEditorComposite, new TermNodeDtoDragListener(characterTreeEditorComposite.getViewer()),
265
                new TermTreeDtoDropAdapter(this, characterTreeEditorComposite.getViewer(), sync),
266
                null);
267

    
268
        characterTreeEditorComposite.getLabel_title().setText(Messages.CharacterEditor_CHARACTERS);
269

    
270
        //add context menu to character viewer
271
        menuService.registerContextMenu(characterTreeEditorComposite.getViewer().getControl(),
272
                AppModelId.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_EDITOR_POPUPMENU_CHARACTEREDITOR);
273

    
274
    }
275

    
276
    private TreeViewer createTreeViewer(Composite parent, TermType termType, String labelString) {
277
        Composite composite = new Composite(parent, SWT.NONE);
278
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
279
        composite.setLayout(new GridLayout(2, false));
280
        Label label = new Label(composite, SWT.NONE);
281
        label.setText(labelString);
282
        Button btnRefresh = new Button(composite, SWT.PUSH);
283
        btnRefresh.setImage(ImageResources.getImage(ImageResources.REFRESH));
284
        btnRefresh.setToolTipText("Refresh");
285

    
286

    
287
        TreeViewer viewer = new TreeViewer(composite);
288
        viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
289
        viewer.setContentProvider(new TermTreeContentProvider());
290
        viewer.setLabelProvider(new TermTreeLabelProvider());
291
        viewer.setComparator(new TermTreeViewerComparator());
292
        viewer.addSelectionChangedListener(this);
293
        viewer.setInput(CdmStore.getService(ITermTreeService.class).list(termType, null, null, null, TermTreeEditor.TREE_PROPERTY_PATH));
294
        btnRefresh.addSelectionListener(new SelectionAdapter() {
295

    
296
            @Override
297
            public void widgetSelected(SelectionEvent e) {
298
                viewer.setInput(CdmStore.getService(ITermTreeService.class).list(termType, null, null, null, TermTreeEditor.TREE_PROPERTY_PATH));
299
                refresh(viewer);
300
            }
301
        });
302
        return viewer;
303
    }
304

    
305
    private <T extends DefinedTermBase> TermTreeDtoEditorComposite<T> addFeatureTreeEditor(Composite composite_3) {
306
        TermTreeDtoEditorComposite<T> TermTreeEditorComposite = new TermTreeDtoEditorComposite<>(composite_3, SWT.NONE);
307
        TermTreeEditorComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
308
        return TermTreeEditorComposite;
309
    }
310

    
311
    private void initFeatureTreeComposite(
312
            TermType termType,
313
            TermTreeDtoEditorComposite TermTreeEditorComposite,
314
            TermNodeDtoDragListener featureNodeDragListener,
315
            TermTreeDtoDropAdapter featureNodeDropAdapter,
316
            Transfer[] transfers) {
317

    
318
        TermTreeEditorComposite.init(
319
                featureNodeDragListener,
320
                featureNodeDropAdapter,
321
                transfers,
322
                this,
323
                new FeatureTreeChooserListener(TermTreeEditorComposite, termType),
324
                this);
325
    }
326

    
327
    @Focus
328
    public void focus(){
329
        if(characterTreeEditorComposite!=null){
330
            characterTreeEditorComposite.getViewer().getControl().setFocus();
331
        }
332
        if(conversation!=null && !conversation.isBound()){
333
            conversation.bind();
334
        }
335
        if(cdmEntitySession != null) {
336
            cdmEntitySession.bind();
337
        }
338
    }
339

    
340
    public static Collection<Character> createCharacters(TreeSelection structureTreeSelection, TreeSelection propertyTreeSelection){
341
        Set<Character> characters = new HashSet<>();
342
        //get selected structures and properties
343
        Iterator<TermNode<DefinedTerm>> structureIterator = structureTreeSelection.iterator();
344

    
345
        //create all combinations of structures and properties
346
        while(structureIterator.hasNext()){
347
            TermNode<DefinedTerm> structureNode = structureIterator.next();
348
            Iterator<TermNode<DefinedTerm>> propertiesIterator = propertyTreeSelection.iterator();
349
            while(propertiesIterator.hasNext()){
350
                TermNode<DefinedTerm> propertyNode = propertiesIterator.next();
351
                Representation structureRepresentation = structureNode.getTerm().getRepresentation(PreferencesUtil.getGlobalLanguage());
352
                if(structureRepresentation==null){
353
                    structureRepresentation = structureNode.getTerm().getRepresentation(Language.DEFAULT());
354
                }
355
                Representation propertyRepresentation = propertyNode.getTerm().getRepresentation(PreferencesUtil.getGlobalLanguage());
356
                if(propertyRepresentation==null){
357
                    propertyRepresentation = propertyNode.getTerm().getRepresentation(Language.DEFAULT());
358
                }
359
                String label = null;
360
                String abbrevLabel = null;
361
                if(structureRepresentation!=null && propertyRepresentation!=null){
362
                    if(structureRepresentation.getLabel()!=null && propertyRepresentation.getLabel()!=null){
363
                        label = structureRepresentation.getLabel()+" "+propertyRepresentation.getLabel();
364
                    }
365
                    if(structureRepresentation.getAbbreviatedLabel()!=null && propertyRepresentation.getAbbreviatedLabel()!=null){
366
                        abbrevLabel = structureRepresentation.getAbbreviatedLabel()+" "+propertyRepresentation.getAbbreviatedLabel();
367
                    }
368
                }
369
                if(label!=null){
370
                    //default label
371
                    label = structureNode.getTerm().getLabel()+" "+propertyNode.getTerm().getLabel();
372
                }
373
                Character character = Character.NewInstance(structureNode, propertyNode, null, label, abbrevLabel);
374
                characters.add(character);
375

    
376
            }
377
        }
378
        return characters;
379
    }
380

    
381
    @Override
382
    @Persist
383
    public void save(IProgressMonitor monitor){
384
        if (!conversation.isBound()) {
385
            conversation.bind();
386
        }
387
        UpdateResult result = new UpdateResult();
388
        if (nodesToSave != null && this.getVocabulary() != null) {
389
            result.includeResult(CdmStore.getService(ITermNodeService.class).saveNewCharacterNodeDtoMap(this.nodesToSave, this.getVocabulary().getUuid()));
390
        }
391
        nodesToSave.clear();
392
        TermTreeDto featureTree = characterTreeEditorComposite.getFeatureTree();
393
        if (operations != null && !operations.isEmpty()){
394
            for (AbstractPostOperation<TermNode> operation: operations){
395
                AbstractUtility.executeOperation(operation, sync);
396
            }
397
            operations.clear();
398
        }
399

    
400
//      TODO: implement update method for dto
401

    
402
        result.includeResult(CdmStore.getService(ITermNodeService.class).saveCharacterNodeDtoList(this.nodesToUpdate));
403
        nodesToUpdate.clear();
404
        // commit the conversation and start a new transaction immediately
405
        conversation.commit(true);
406
        if (result.getUpdatedObjects() != null && !result.getUpdatedObjects().isEmpty()){
407
            Object o = result.getUpdatedObjects().iterator().next();
408
            if (o instanceof TermNode){
409
                TermNode node = (TermNode)o;
410
                TermTree updateTree = (TermTree)node.getGraph();
411
                if (updateTree != null){
412
                    characterTreeEditorComposite.setSelectedTree(updateTree);
413
                }
414
            }
415

    
416
        }
417

    
418
//        initializeTrees();
419

    
420
        dirty.setDirty(false);
421
    }
422

    
423
    private void initializeTrees() {
424
        Object[] expandedElements = characterTreeEditorComposite.getViewer().getExpandedElements();
425
        characterTreeEditorComposite.getViewer().getTree().removeAll();
426
        characterTreeEditorComposite.getViewer().setExpandedElements(expandedElements);
427
    }
428

    
429
    @Override
430
    public boolean isDirty() {
431
        return dirty.isDirty();
432
    }
433

    
434
    @PreDestroy
435
    public void dispose(){
436
        if(conversation!=null){
437
            conversation.close();
438
            conversation = null;
439
        }
440
        if(cdmEntitySession != null) {
441
            cdmEntitySession.dispose();
442
            cdmEntitySession = null;
443
        }
444
        dirty.setDirty(false);
445
    }
446

    
447
    public boolean isVocabularySet() {
448
        if(vocabulary==null){
449
            MessagingUtils.warningDialog("Character creation not possible", this.getClass(), "Please select a vocabulary for the characters.");
450
        }
451
        return vocabulary!=null;
452
    }
453

    
454
    public boolean confirmSaveDirty(){
455
        return StoreUtil.promptCheckIsDirty(this);
456
    }
457

    
458
    public TermVocabulary getVocabulary() {
459
        return vocabulary;
460
    }
461

    
462
    @Override
463
    public Map<Object, List<String>> getPropertyPathsMap() {
464
        List<String> propertyPaths = Arrays.asList(new String[] {
465
                "children", //$NON-NLS-1$
466
                "feature", //$NON-NLS-1$
467
                "featureTree", //$NON-NLS-1$
468
        });
469
        Map<Object, List<String>> propertyPathMap =
470
                new HashMap<Object, List<String>>();
471
        propertyPathMap.put(TermNode.class,propertyPaths);
472
        return propertyPathMap;
473
    }
474

    
475
    @Override
476
    public List<TermTreeDto> getRootEntities() {
477
        List<TermTreeDto> root = new ArrayList<>();
478
        root.add(characterTreeEditorComposite.getFeatureTree());
479
        return root;
480
    }
481

    
482
    @Override
483
    public ICdmEntitySession getCdmEntitySession() {
484
        return cdmEntitySession;
485
    }
486

    
487

    
488
    @Focus
489
    public void setFocus() {
490
        if(conversation!=null && !conversation.isBound()){
491
            conversation.bind();
492
        }
493
    }
494

    
495
    @Override
496
    public void selectionChanged(SelectionChangedEvent event) {
497
        //propagate selection
498
        selService.setSelection(event.getSelection());
499
    }
500

    
501

    
502
    @Override
503
    public void modifyText(ModifyEvent e) {
504
        characterTreeEditorComposite.getFeatureTree().setTitleCache(((Text) e.widget).getText());
505
        setDirty();
506
    }
507

    
508

    
509

    
510
    @Override
511
    public void setDirty() {
512
        dirty.setDirty(true);
513
    }
514

    
515
    @Override
516
    public IStructuredSelection getSelection() {
517
        return (IStructuredSelection) characterTreeEditorComposite.getViewer().getSelection();
518
    }
519

    
520

    
521
    @Override
522
    public TermType getTermType() {
523
        return TermType.Character;
524
    }
525

    
526
    public TermTreeDto getCharacterTree(){
527
        return characterTreeEditorComposite.getFeatureTree();
528
    }
529

    
530

    
531
    public void refresh(TreeViewer viewer){
532
        viewer.refresh();
533

    
534
        characterTreeEditorComposite.getViewer().setInput(characterTreeEditorComposite.getViewer().getInput());
535
    }
536

    
537
    private class FeatureTreeChooserListener extends SelectionAdapter{
538
        private TermTreeDtoEditorComposite<Feature> TermTreeEditorComposite;
539
        private TermType termType;
540

    
541
        public FeatureTreeChooserListener(TermTreeDtoEditorComposite<Feature> TermTreeEditorComposite, TermType termType) {
542
            super();
543
            this.TermTreeEditorComposite = TermTreeEditorComposite;
544
            this.termType = termType;
545
        }
546

    
547
        @Override
548
        public void widgetSelected(SelectionEvent e) {
549
            TermTree tree = FeatureTreeSelectionDialog.select(TermTreeEditorComposite.getDisplay().getActiveShell(), null, termType);
550
            if(tree!=null){
551
                cdmEntitySession.load(tree, true);
552
                TermTreeEditorComposite.setSelectedTree(tree);
553
            }
554
        }
555
    }
556

    
557
    @Override
558
    public void update(CdmDataChangeMap arg0) {
559
    }
560

    
561
    @Override
562
    public ConversationHolder getConversationHolder() {
563
        return conversation;
564
    }
565

    
566
    @Override
567
    public void changed(Object element) {
568
        setDirty();
569
        characterTreeEditorComposite.getViewer().refresh();
570
    }
571

    
572
    @Override
573
    public void forceDirty() {
574
        setDirty();
575
    }
576

    
577
    @Override
578
    public boolean postOperation(Object objectAffectedByOperation) {
579
        characterTreeEditorComposite.getViewer().refresh();
580
        if(objectAffectedByOperation instanceof TermNode){
581
            StructuredSelection selection = new StructuredSelection(objectAffectedByOperation);
582
            characterTreeEditorComposite.getViewer().setSelection(selection);
583
        }
584
        return true;
585
    }
586

    
587
    @Override
588
    public boolean onComplete() {
589
        return false;
590
    }
591

    
592
    @Override
593
    public void refresh() {
594
        structureViewer.refresh();
595
        propertyViewer.refresh();
596
        characterTreeEditorComposite.refresh();
597

    
598
    }
599

    
600
    @Override
601
    public TermNodeDto getNodeDtoForUuid(UUID nodeUuid){
602
        return (TermNodeDto)this.characterTreeEditorComposite.getNodeUuidMap().get(nodeUuid);
603

    
604
    }
605

    
606
    @Override
607
    public void addOperation(AbstractPostOperation operation) {
608
        operations.add(operation);
609

    
610
    }
611

    
612
    @Inject
613
    @Optional
614
    private void addSaveCandidate(@UIEventTopic(WorkbenchEventConstants.ADD_SAVE_CHARACTER) CharacterNodeDto characterNodeDto) {
615

    
616
        if (characterNodeDto != null){
617
            if (nodesToUpdate.contains(characterNodeDto)){
618
                nodesToUpdate.remove(characterNodeDto);
619
            }
620
            nodesToUpdate.add(characterNodeDto);
621
        }
622

    
623
    }
624

    
625
    @Override
626
    public TreeViewer getViewer() {
627
        return this.characterTreeEditorComposite.getViewer();
628
    }
629

    
630
    @Override
631
    public TermTreeDto getTreeDtoForUuid(UUID treeUuid) {
632
        if (this.characterTreeEditorComposite.getFeatureTree().getUuid().equals(treeUuid)){
633
            return this.characterTreeEditorComposite.getFeatureTree();
634
        }
635
        return null;
636
    }
637

    
638
    @Override
639
    public boolean checkDuplicates(UUID termUuid, UUID treeUuid) {
640
        for (TermDto dto: characterTreeEditorComposite.getFeatureTree().getTerms()){
641
            if (dto != null && dto.getUuid().equals(termUuid)){
642
                return true;
643
            }
644
        }
645
        return false;
646
    }
647

    
648
    @Override
649
    public void setNodeDtoForUuid(TermNodeDto node) {
650
        // TODO Auto-generated method stub
651

    
652
    }
653

    
654
    @Override
655
    public void setTreeDtoForUuid(TermTreeDto tree) {
656
        // TODO Auto-generated method stub
657

    
658
    }
659

    
660

    
661

    
662

    
663
}
(3-3/3)