2 * Copyright (C) 2017 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.taxeditor
.editor
.descriptiveDataSet
.character
;
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
;
20 import java
.util
.UUID
;
22 import javax
.annotation
.PostConstruct
;
23 import javax
.annotation
.PreDestroy
;
24 import javax
.inject
.Inject
;
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
;
59 import eu
.etaxonomy
.cdm
.api
.service
.ITermNodeService
;
60 import eu
.etaxonomy
.cdm
.api
.service
.ITermTreeService
;
61 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
62 import eu
.etaxonomy
.cdm
.api
.service
.UpdateResult
;
63 import eu
.etaxonomy
.cdm
.format
.description
.CharacterLabelBuilder
;
64 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
65 import eu
.etaxonomy
.cdm
.model
.description
.Character
;
66 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
67 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTerm
;
68 import eu
.etaxonomy
.cdm
.model
.term
.DefinedTermBase
;
69 import eu
.etaxonomy
.cdm
.model
.term
.Representation
;
70 import eu
.etaxonomy
.cdm
.model
.term
.TermNode
;
71 import eu
.etaxonomy
.cdm
.model
.term
.TermTree
;
72 import eu
.etaxonomy
.cdm
.model
.term
.TermType
;
73 import eu
.etaxonomy
.cdm
.model
.term
.TermVocabulary
;
74 import eu
.etaxonomy
.cdm
.model
.term
.VocabularyEnum
;
75 import eu
.etaxonomy
.cdm
.persistence
.dto
.CharacterDto
;
76 import eu
.etaxonomy
.cdm
.persistence
.dto
.CharacterNodeDto
;
77 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermDto
;
78 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermNodeDto
;
79 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermTreeDto
;
80 import eu
.etaxonomy
.taxeditor
.editor
.AppModelId
;
81 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.TermTreeViewerComparator
;
82 import eu
.etaxonomy
.taxeditor
.editor
.l10n
.Messages
;
83 import eu
.etaxonomy
.taxeditor
.event
.EventUtility
;
84 import eu
.etaxonomy
.taxeditor
.event
.WorkbenchEventConstants
;
85 import eu
.etaxonomy
.taxeditor
.model
.AbstractUtility
;
86 import eu
.etaxonomy
.taxeditor
.model
.IDirtyMarkable
;
87 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasDetails
;
88 import eu
.etaxonomy
.taxeditor
.model
.IPartContentHasSupplementalData
;
89 import eu
.etaxonomy
.taxeditor
.model
.ImageResources
;
90 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
91 import eu
.etaxonomy
.taxeditor
.operation
.AbstractPostOperation
;
92 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
93 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySession
;
94 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
95 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
96 import eu
.etaxonomy
.taxeditor
.termtree
.CharacterTransfer
;
97 import eu
.etaxonomy
.taxeditor
.termtree
.TermTreeContentProvider
;
98 import eu
.etaxonomy
.taxeditor
.termtree
.TermTreeLabelProvider
;
99 import eu
.etaxonomy
.taxeditor
.termtree
.e4
.ICharacterEditor
;
100 import eu
.etaxonomy
.taxeditor
.termtree
.e4
.TermNodeDtoDragListener
;
101 import eu
.etaxonomy
.taxeditor
.termtree
.e4
.TermTreeDtoDropAdapter
;
102 import eu
.etaxonomy
.taxeditor
.termtree
.e4
.TermTreeDtoEditorComposite
;
103 import eu
.etaxonomy
.taxeditor
.termtree
.e4
.TermTreeEditor
;
104 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
.FeatureTreeSelectionDialog
;
105 import eu
.etaxonomy
.taxeditor
.ui
.dialog
.selection
.TermVocabularySelectionDialog
;
106 import eu
.etaxonomy
.taxeditor
.workbench
.part
.IE4SavablePart
;
107 import eu
.etaxonomy
.taxeditor
.workbench
.part
.IE4ViewerPart
;
110 * Editor for combining structure and property terms to characters.
114 public class CharacterEditor
implements ICharacterEditor
, ISelectionChangedListener
,
115 ModifyListener
, IE4ViewerPart
, IPartContentHasDetails
, IPartContentHasSupplementalData
,
116 IDirtyMarkable
, IE4SavablePart
{
118 private TermTreeDtoEditorComposite characterTreeEditorComposite
;
119 private final FormToolkit formToolkit
= new FormToolkit(Display
.getDefault());
122 private ESelectionService selService
;
125 private UISynchronize sync
;
128 private MDirtyable dirty
;
130 private ICdmEntitySession cdmEntitySession
;
132 private TermVocabulary vocabulary
;
133 private TreeViewer structureViewer
;
134 private TreeViewer propertyViewer
;
135 private Button btnAddCharacter
;
136 private Button btnAddRatioTo
;
138 private List
<AbstractPostOperation
> operations
= new ArrayList
<>();
140 private List
<CharacterNodeDto
> nodesToUpdate
= new ArrayList
<>();
142 private Map
<Character
, CharacterNodeDto
> nodesToSave
= new HashMap
<>();
144 public CharacterEditor() {
148 * Create contents of the view part.
151 public void createControls(Composite parent
, EMenuService menuService
) {
152 if (CdmStore
.isActive()){
153 // if(conversation == null){
154 // conversation = CdmStore.createConversation();
156 if(cdmEntitySession
==null){
157 cdmEntitySession
= CdmStore
.getCurrentSessionManager().newSession(this, true);
163 parent
.setLayout(new GridLayout(1, false));
165 Composite vocChooserComposite
= new Composite(parent
, SWT
.NONE
);
166 vocChooserComposite
.setLayout(new GridLayout(4, false));
167 vocChooserComposite
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.FILL
, false, false, 2, 1));
168 Label lblVocImport
= new Label(vocChooserComposite
, SWT
.NONE
);
169 lblVocImport
.setText("Character vocabulary:");
170 Text txtVocabulary
= new Text(vocChooserComposite
, SWT
.NONE
);
171 txtVocabulary
.setEditable(false);
172 Button btnChooseVoc
= new Button(vocChooserComposite
, SWT
.PUSH
);
173 btnChooseVoc
.setImage(ImageResources
.getImage(ImageResources
.BROWSE_ICON
));
174 btnChooseVoc
.addSelectionListener(new SelectionAdapter() {
177 public void widgetSelected(SelectionEvent e
) {
178 // hard-coded filter for "built-in" vocabularies Feature and Name Feature
179 Set
<TermVocabulary
> vocabulariesToBeFiltered
= new HashSet
<>();
180 vocabulariesToBeFiltered
.add(CdmStore
.getService(IVocabularyService
.class).load(VocabularyEnum
.Feature
.getUuid()));
181 vocabulariesToBeFiltered
.add(CdmStore
.getService(IVocabularyService
.class).load(VocabularyEnum
.NameFeature
.getUuid()));
182 if(vocabulary
!=null){
183 vocabulariesToBeFiltered
.add(vocabulary
);
185 vocabulary
= TermVocabularySelectionDialog
.select("Select vocabulary for characters", btnChooseVoc
.getShell(), vocabulariesToBeFiltered
, TermType
.Character
);
186 if(vocabulary
!=null){
187 txtVocabulary
.setText(vocabulary
.getLabel());
192 SashForm sashForm
= new SashForm(parent
, SWT
.NONE
);
193 sashForm
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
194 formToolkit
.adapt(sashForm
);
195 formToolkit
.paintBordersFor(sashForm
);
197 Composite composite
= new Composite(sashForm
, SWT
.NONE
);
198 formToolkit
.adapt(composite
);
199 formToolkit
.paintBordersFor(composite
);
200 GridLayout gl_composite
= new GridLayout(1, false);
201 gl_composite
.marginWidth
= 0;
202 composite
.setLayout(gl_composite
);
204 structureViewer
= createTreeViewer(composite
, TermType
.Structure
, Messages
.CharacterEditor_STRUCTURES
);
206 Composite composite_1
= new Composite(sashForm
, SWT
.NONE
);
207 formToolkit
.adapt(composite_1
);
208 formToolkit
.paintBordersFor(composite_1
);
209 GridLayout gl_composite_1
= new GridLayout(1, false);
210 gl_composite_1
.marginWidth
= 0;
211 composite_1
.setLayout(gl_composite_1
);
213 propertyViewer
= createTreeViewer(composite_1
, TermType
.Property
, Messages
.CharacterEditor_PROPERTIES
);
214 propertyViewer
.addSelectionChangedListener(this);
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
));
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
);
227 Composite composite_4
= new Composite(composite_3
, SWT
.NONE
);
228 formToolkit
.adapt(composite_4
);
229 formToolkit
.paintBordersFor(composite_4
);
230 GridLayout gl_composite_4
= new GridLayout(1, false);
231 gl_composite_4
.marginWidth
= 0;
232 composite_4
.setLayout(gl_composite_4
);
234 btnAddCharacter
= new Button(composite_4
, SWT
.NONE
);
235 btnAddCharacter
.setText(">>"); //$NON-NLS-1$
236 formToolkit
.adapt(btnAddCharacter
, true, true);
237 btnAddCharacter
.addSelectionListener(new SelectionAdapter() {
239 public void widgetSelected(SelectionEvent e
) {
240 if(!isVocabularySet()){
243 if (confirmSaveDirty()){
246 ISelection structureTreeSelection
= structureViewer
.getSelection();
247 ISelection propertyTreeSelection
= propertyViewer
.getSelection();
248 if(structureTreeSelection
==null || propertyTreeSelection
==null || characterTreeEditorComposite
.getFeatureTree()==null){
249 MessagingUtils
.warningDialog(Messages
.CharacterEditor_CANNOT_PERFORM_TITLE
, CharacterEditor
.this,
250 Messages
.CharacterEditor_CANNOT_PERFORM_MESSAGE
);
253 Collection
<Character
> characters
= createCharacters((TreeSelection
)structureTreeSelection
, (TreeSelection
)propertyTreeSelection
);
254 TermNodeDto parent
= characterTreeEditorComposite
.getFeatureTree().getRoot();
255 ISelection sel
= characterTreeEditorComposite
.getViewer().getSelection();
257 TermNodeDto parentNode
= parent
;
258 if (sel
instanceof TreeSelection
){
259 TreeSelection treeSel
= (TreeSelection
)sel
;
260 Object o
= treeSel
.getFirstElement();
261 if (o
instanceof CharacterNodeDto
){
262 parentNode
= (TermNodeDto
)o
;
266 for (Character character
: characters
) {
267 //add new Character to feature tree
268 CharacterNodeDto nodeDto
= new CharacterNodeDto(CharacterDto
.fromCharacter(character
), parentNode
, 0, parent
.getTree(), null, 0, null, null);
269 nodesToSave
.put(character
, nodeDto
);
271 // result = CdmStore.getService(ITermNodeService.class).createChildFeatureNode(parent.getUuid(), character, vocabulary.getUuid());
279 btnAddCharacter
.setEnabled(false);
281 btnAddRatioTo
= new Button(composite_4
, SWT
.NONE
);
282 btnAddRatioTo
.setText("ratio to"); //$NON-NLS-1$
284 btnAddRatioTo
.setSize(btnAddCharacter
.getSize());
285 btnAddRatioTo
.setEnabled(false);
287 formToolkit
.adapt(btnAddRatioTo
, true, true);
288 btnAddRatioTo
.addSelectionListener(new SelectionAdapter() {
290 public void widgetSelected(SelectionEvent e
) {
292 if (confirmSaveDirty()){
295 ISelection structureTreeSelection
= structureViewer
.getSelection();
296 ISelection characterSelection
= characterTreeEditorComposite
.getViewer().getSelection();
297 if(structureTreeSelection
==null || characterSelection
==null){
298 MessagingUtils
.warningDialog(Messages
.CharacterEditor_CANNOT_PERFORM_TITLE
, CharacterEditor
.this,
299 Messages
.CharacterEditor_CANNOT_PERFORM_MESSAGE
);
303 CharacterNodeDto character
= (CharacterNodeDto
)((TreeSelection
)characterSelection
).getFirstElement();
304 TermNode ratioToNode
= (TermNode
)((TreeSelection
)structureTreeSelection
).getFirstElement();
305 if (character
== null){
308 TermDto termDto
= character
.getTerm();
309 TermNodeDto structure
= null;
310 TermNodeDto property
= null;
311 Representation structureRepresentation
= null;
312 Representation propertyRepresentation
= null;
313 Representation ratioToRepresentation
= ratioToNode
.getTerm().getRepresentation(CdmStore
.getDefaultLanguage());
314 if (termDto
instanceof CharacterDto
){
315 CharacterDto dto
= (CharacterDto
)termDto
;
316 dto
.setRatioTo(TermNodeDto
.fromNode(ratioToNode
, null));
317 structure
= dto
.getStructure();
318 structureRepresentation
= structure
.getTerm().getPreferredRepresentation(CdmStore
.getDefaultLanguage());
319 property
= dto
.getProperty();
320 propertyRepresentation
= property
.getTerm().getPreferredRepresentation(CdmStore
.getDefaultLanguage());
324 String abbrevLabel
= null;
326 if(structureRepresentation
!=null && propertyRepresentation
!=null){
327 if(structureRepresentation
.getLabel() != null && propertyRepresentation
.getLabel() != null && ratioToRepresentation
.getLabel() != null){
328 label
= propertyRepresentation
.getLabel() + " ratio " +structureRepresentation
.getLabel()+" to " +ratioToRepresentation
.getLabel() ;
330 if(structureRepresentation
.getAbbreviatedLabel()!=null && propertyRepresentation
.getAbbreviatedLabel()!=null && ratioToRepresentation
.getAbbreviatedLabel() != null){
331 abbrevLabel
= propertyRepresentation
.getAbbreviatedLabel() + " ratio " +structureRepresentation
.getAbbreviatedLabel()+ " to " + ratioToRepresentation
.getAbbreviatedLabel();
336 label
= property
.getTerm().getRepresentation_L10n()+ " ratio " +structure
.getTerm().getRepresentation_L10n()+ " to " + ratioToNode
.getTerm().getLabel() ;
338 character
.getTerm().getRepresentation(CdmStore
.getDefaultLanguage()).setLabel(label
);
339 character
.getTerm().getRepresentation(CdmStore
.getDefaultLanguage()).setAbbreviatedLabel(abbrevLabel
);
342 nodesToUpdate
.add(character
);
346 characterTreeEditorComposite
.getViewer().setSelection(new StructuredSelection(character
));
347 EventUtility
.postEvent(WorkbenchEventConstants
.REFRESH_DETAILS
, true);
351 characterTreeEditorComposite
= addFeatureTreeEditor(composite_3
);
352 initFeatureTreeComposite(TermType
.Character
, characterTreeEditorComposite
, new TermNodeDtoDragListener(characterTreeEditorComposite
.getViewer()),
353 new TermTreeDtoDropAdapter(this, characterTreeEditorComposite
.getViewer(), sync
),
356 characterTreeEditorComposite
.getLabel_title().setText(Messages
.CharacterEditor_CHARACTERS
);
358 //add context menu to character viewer
359 menuService
.registerContextMenu(characterTreeEditorComposite
.getViewer().getControl(),
360 AppModelId
.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_EDITOR_POPUPMENU_CHARACTEREDITOR
);
364 private TreeViewer
createTreeViewer(Composite parent
, TermType termType
, String labelString
) {
365 Composite composite
= new Composite(parent
, SWT
.NONE
);
366 composite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
367 composite
.setLayout(new GridLayout(2, false));
368 Label label
= new Label(composite
, SWT
.NONE
);
369 label
.setText(labelString
);
370 Button btnRefresh
= new Button(composite
, SWT
.PUSH
);
371 btnRefresh
.setImage(ImageResources
.getImage(ImageResources
.REFRESH
));
372 btnRefresh
.setToolTipText("Refresh");
375 TreeViewer viewer
= new TreeViewer(composite
);
376 viewer
.getControl().setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 2, 1));
377 viewer
.setContentProvider(new TermTreeContentProvider());
378 viewer
.setLabelProvider(new TermTreeLabelProvider());
379 viewer
.setComparator(new TermTreeViewerComparator());
380 viewer
.addSelectionChangedListener(this);
381 viewer
.setInput(CdmStore
.getService(ITermTreeService
.class).list(termType
, null, null, null, TermTreeEditor
.TREE_PROPERTY_PATH
));
382 btnRefresh
.addSelectionListener(new SelectionAdapter() {
385 public void widgetSelected(SelectionEvent e
) {
386 viewer
.setInput(CdmStore
.getService(ITermTreeService
.class).list(termType
, null, null, null, TermTreeEditor
.TREE_PROPERTY_PATH
));
393 private <T
extends DefinedTermBase
> TermTreeDtoEditorComposite
<T
> addFeatureTreeEditor(Composite composite_3
) {
394 TermTreeDtoEditorComposite
<T
> TermTreeEditorComposite
= new TermTreeDtoEditorComposite
<>(composite_3
, SWT
.NONE
);
395 TermTreeEditorComposite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1));
396 return TermTreeEditorComposite
;
399 private void initFeatureTreeComposite(
401 TermTreeDtoEditorComposite TermTreeEditorComposite
,
402 TermNodeDtoDragListener featureNodeDragListener
,
403 TermTreeDtoDropAdapter featureNodeDropAdapter
,
404 Transfer
[] transfers
) {
406 TermTreeEditorComposite
.init(
407 featureNodeDragListener
,
408 featureNodeDropAdapter
,
411 new FeatureTreeChooserListener(TermTreeEditorComposite
, termType
),
417 if(characterTreeEditorComposite
!=null){
418 characterTreeEditorComposite
.getViewer().getControl().setFocus();
420 if(cdmEntitySession
!= null) {
421 cdmEntitySession
.bind();
425 public static Collection
<Character
> createCharacters(TreeSelection structureTreeSelection
, TreeSelection propertyTreeSelection
){
426 Set
<Character
> characters
= new HashSet
<>();
427 //get selected structures and properties
428 Iterator
<TermNode
<DefinedTerm
>> structureIterator
= structureTreeSelection
.iterator();
430 //create all combinations of structures and properties
431 while(structureIterator
.hasNext()){
432 Object o
= structureIterator
.next();
433 TermNode
<DefinedTerm
> structureNode
= null;
434 if (o
instanceof TermNode
){
435 structureNode
= (TermNode
<DefinedTerm
>) o
;
441 Iterator
<TermNode
<DefinedTerm
>> propertiesIterator
= propertyTreeSelection
.iterator();
442 while(propertiesIterator
.hasNext()){
443 TermNode
<DefinedTerm
> propertyNode
= propertiesIterator
.next();
444 Representation structureRepresentation
= structureNode
.getTerm().getRepresentation(PreferencesUtil
.getGlobalLanguage());
445 if(structureRepresentation
==null){
446 structureRepresentation
= structureNode
.getTerm().getRepresentation(Language
.DEFAULT());
448 Representation propertyRepresentation
= propertyNode
.getTerm().getRepresentation(PreferencesUtil
.getGlobalLanguage());
449 if(propertyRepresentation
==null){
450 propertyRepresentation
= propertyNode
.getTerm().getRepresentation(Language
.DEFAULT());
453 String abbrevLabel
= null;
454 if(structureRepresentation
!=null && propertyRepresentation
!=null){
455 if(structureRepresentation
.getLabel()!=null && propertyRepresentation
.getLabel()!=null){
456 label
= structureRepresentation
.getLabel()+" "+propertyRepresentation
.getLabel();
458 if(structureRepresentation
.getAbbreviatedLabel()!=null && propertyRepresentation
.getAbbreviatedLabel()!=null){
459 abbrevLabel
= structureRepresentation
.getAbbreviatedLabel()+" "+propertyRepresentation
.getAbbreviatedLabel();
464 label
= structureNode
.getTerm().getLabel()+" "+propertyNode
.getTerm().getLabel();
466 Character character
= Character
.NewInstance(structureNode
, propertyNode
, null, label
, abbrevLabel
);
467 CharacterLabelBuilder labelBuilder
= CharacterLabelBuilder
.NewDefaultInstance();
468 character
.setLabel(labelBuilder
.buildLabel(character
, CdmStore
.getDefaultLanguage()));
469 character
.setAvailableForTaxon(true);
470 character
.setAvailableForOccurrence(true);
471 characters
.add(character
);
480 public void save(IProgressMonitor monitor
){
482 UpdateResult result
= new UpdateResult();
483 if (nodesToSave
!= null && this.getVocabulary() != null) {
484 result
.includeResult(CdmStore
.getService(ITermNodeService
.class).saveNewCharacterNodeDtoMap(this.nodesToSave
, this.getVocabulary().getUuid()));
487 TermTreeDto featureTree
= characterTreeEditorComposite
.getFeatureTree();
488 if (operations
!= null && !operations
.isEmpty()){
489 for (AbstractPostOperation
<TermNode
> operation
: operations
){
490 AbstractUtility
.executeOperation(operation
, sync
);
495 // TODO: implement update method for dto
497 result
.includeResult(CdmStore
.getService(ITermNodeService
.class).saveCharacterNodeDtoList(this.nodesToUpdate
));
498 nodesToUpdate
.clear();
499 // commit the conversation and start a new transaction immediately
500 //conversation.commit(true);
501 if (result
.getUpdatedObjects() != null && !result
.getUpdatedObjects().isEmpty()){
502 Object o
= result
.getUpdatedObjects().iterator().next();
503 if (o
instanceof TermNode
){
504 TermNode node
= (TermNode
)o
;
505 TermTree updateTree
= (TermTree
)node
.getGraph();
506 if (updateTree
!= null){
507 characterTreeEditorComposite
.setSelectedTree(updateTree
);
513 // initializeTrees();
515 dirty
.setDirty(false);
518 private void initializeTrees() {
519 Object
[] expandedElements
= characterTreeEditorComposite
.getViewer().getExpandedElements();
520 characterTreeEditorComposite
.getViewer().getTree().removeAll();
521 characterTreeEditorComposite
.getViewer().setExpandedElements(expandedElements
);
525 public boolean isDirty() {
526 return dirty
.isDirty();
530 public void dispose(){
532 if(cdmEntitySession
!= null) {
533 cdmEntitySession
.dispose();
534 cdmEntitySession
= null;
536 dirty
.setDirty(false);
539 public boolean isVocabularySet() {
540 if(vocabulary
==null){
541 MessagingUtils
.warningDialog("Character creation not possible", this.getClass(), "Please select a vocabulary for the characters.");
543 return vocabulary
!=null;
546 public boolean confirmSaveDirty(){
547 return StoreUtil
.promptCheckIsDirty(this);
550 public TermVocabulary
getVocabulary() {
555 public Map
<Object
, List
<String
>> getPropertyPathsMap() {
556 List
<String
> propertyPaths
= Arrays
.asList(new String
[] {
557 "children", //$NON-NLS-1$
558 "feature", //$NON-NLS-1$
559 "featureTree", //$NON-NLS-1$
561 Map
<Object
, List
<String
>> propertyPathMap
=
562 new HashMap
<Object
, List
<String
>>();
563 propertyPathMap
.put(TermNode
.class,propertyPaths
);
564 return propertyPathMap
;
568 public List
<TermTreeDto
> getRootEntities() {
569 List
<TermTreeDto
> root
= new ArrayList
<>();
570 root
.add(characterTreeEditorComposite
.getFeatureTree());
575 public ICdmEntitySession
getCdmEntitySession() {
576 return cdmEntitySession
;
581 public void setFocus() {
586 public void selectionChanged(SelectionChangedEvent event
) {
587 //propagate selection
588 selService
.setSelection(event
.getSelection());
589 ISelection selStructure
= null;
590 ISelection selProperty
= null;
591 selStructure
= structureViewer
.getSelection();
592 selProperty
= propertyViewer
.getSelection();
594 if (selStructure
!= null && selProperty
!= null && selStructure
instanceof TreeSelection
&& selProperty
instanceof TreeSelection
&& ((TreeSelection
)selStructure
).getFirstElement() instanceof TermNode
&& ((TreeSelection
)selProperty
).getFirstElement() instanceof TermNode
&& this.vocabulary
!= null) {
595 btnAddCharacter
.setEnabled(true);
597 btnAddCharacter
.setEnabled(false);
599 ISelection selCharacter
= this.characterTreeEditorComposite
.getViewer().getSelection();
600 if (selStructure
!= null && selCharacter
!= null && selStructure
instanceof TreeSelection
&& selCharacter
instanceof TreeSelection
&& ((TreeSelection
)selStructure
).getFirstElement() instanceof TermNode
&& ((TreeSelection
)selCharacter
).getFirstElement() instanceof CharacterNodeDto
) {
601 btnAddRatioTo
.setEnabled(true);
603 btnAddRatioTo
.setEnabled(false);
609 public void modifyText(ModifyEvent e
) {
610 characterTreeEditorComposite
.getFeatureTree().setTitleCache(((Text
) e
.widget
).getText());
617 public void setDirty() {
618 dirty
.setDirty(true);
622 public IStructuredSelection
getSelection() {
623 return (IStructuredSelection
) characterTreeEditorComposite
.getViewer().getSelection();
628 public TermType
getTermType() {
629 return TermType
.Character
;
632 public TermTreeDto
getCharacterTree(){
633 return characterTreeEditorComposite
.getFeatureTree();
637 public void refresh(TreeViewer viewer
){
640 characterTreeEditorComposite
.getViewer().setInput(characterTreeEditorComposite
.getViewer().getInput());
643 private class FeatureTreeChooserListener
extends SelectionAdapter
{
644 private TermTreeDtoEditorComposite
<Feature
> TermTreeEditorComposite
;
645 private TermType termType
;
647 public FeatureTreeChooserListener(TermTreeDtoEditorComposite
<Feature
> TermTreeEditorComposite
, TermType termType
) {
649 this.TermTreeEditorComposite
= TermTreeEditorComposite
;
650 this.termType
= termType
;
654 public void widgetSelected(SelectionEvent e
) {
655 TermTree tree
= FeatureTreeSelectionDialog
.select(TermTreeEditorComposite
.getDisplay().getActiveShell(), null, termType
);
657 cdmEntitySession
.load(tree
, true);
658 TermTreeEditorComposite
.setSelectedTree(tree
);
666 public void changed(Object element
) {
668 characterTreeEditorComposite
.getViewer().refresh();
672 public void forceDirty() {
677 public boolean postOperation(Object objectAffectedByOperation
) {
678 characterTreeEditorComposite
.getViewer().refresh();
679 if(objectAffectedByOperation
instanceof TermNode
){
680 StructuredSelection selection
= new StructuredSelection(objectAffectedByOperation
);
681 characterTreeEditorComposite
.getViewer().setSelection(selection
);
687 public boolean onComplete() {
692 public void refresh() {
693 structureViewer
.refresh();
694 propertyViewer
.refresh();
695 characterTreeEditorComposite
.refresh();
700 public TermNodeDto
getNodeDtoForUuid(UUID nodeUuid
){
701 return (TermNodeDto
)this.characterTreeEditorComposite
.getNodeUuidMap().get(nodeUuid
);
706 public void addOperation(AbstractPostOperation operation
) {
707 operations
.add(operation
);
713 private void addSaveCandidate(@UIEventTopic(WorkbenchEventConstants
.ADD_SAVE_CHARACTER
) CharacterNodeDto characterNodeDto
) {
715 if (characterNodeDto
!= null){
716 if (nodesToUpdate
.contains(characterNodeDto
)){
717 nodesToUpdate
.remove(characterNodeDto
);
719 nodesToUpdate
.add(characterNodeDto
);
725 public TreeViewer
getViewer() {
726 return this.characterTreeEditorComposite
.getViewer();
730 public TermTreeDto
getTreeDtoForUuid(UUID treeUuid
) {
731 if (this.characterTreeEditorComposite
.getFeatureTree().getUuid().equals(treeUuid
)){
732 return this.characterTreeEditorComposite
.getFeatureTree();
738 public boolean checkDuplicates(UUID termUuid
, UUID treeUuid
) {
739 for (TermDto dto
: characterTreeEditorComposite
.getFeatureTree().getTerms()){
740 if (dto
!= null && dto
.getUuid().equals(termUuid
)){
748 public void setNodeDtoForUuid(TermNodeDto node
) {
749 // TODO Auto-generated method stub
754 public void setTreeDtoForUuid(TermTreeDto tree
) {
755 // TODO Auto-generated method stub