fixing missing parameter
[taxeditor.git] / eu.etaxonomy.taxeditor.editor / src / main / java / eu / etaxonomy / taxeditor / editor / descriptiveDataSet / character / CharacterEditor.java
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.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;
108
109 /**
110 * Editor for combining structure and property terms to characters.
111 * @author pplitzner
112 * @date 24.05.2017
113 */
114 public class CharacterEditor implements ICharacterEditor, ISelectionChangedListener,
115 ModifyListener, IE4ViewerPart, IPartContentHasDetails, IPartContentHasSupplementalData,
116 IDirtyMarkable, IE4SavablePart {
117
118 private TermTreeDtoEditorComposite characterTreeEditorComposite;
119 private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
120
121 @Inject
122 private ESelectionService selService;
123
124 @Inject
125 private UISynchronize sync;
126
127 @Inject
128 private MDirtyable dirty;
129
130 private ICdmEntitySession cdmEntitySession;
131
132 private TermVocabulary vocabulary;
133 private TreeViewer structureViewer;
134 private TreeViewer propertyViewer;
135 private Button btnAddCharacter;
136 private Button btnAddRatioTo;
137
138 private List<AbstractPostOperation> operations = new ArrayList<>();
139
140 private List<CharacterNodeDto> nodesToUpdate = new ArrayList<>();
141
142 private Map<Character, CharacterNodeDto> nodesToSave = new HashMap<>();
143
144 public CharacterEditor() {
145 }
146
147 /**
148 * Create contents of the view part.
149 */
150 @PostConstruct
151 public void createControls(Composite parent, EMenuService menuService ) {
152 if (CdmStore.isActive()){
153 // if(conversation == null){
154 // conversation = CdmStore.createConversation();
155 // }
156 if(cdmEntitySession==null){
157 cdmEntitySession = CdmStore.getCurrentSessionManager().newSession(this, true);
158 }
159 }
160 else{
161 return;
162 }
163 parent.setLayout(new GridLayout(1, false));
164
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() {
175
176 @Override
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);
184 }
185 vocabulary = TermVocabularySelectionDialog.select("Select vocabulary for characters", btnChooseVoc.getShell(), vocabulariesToBeFiltered, TermType.Character);
186 if(vocabulary!=null){
187 txtVocabulary.setText(vocabulary.getLabel());
188 }
189 }
190 });
191
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);
196
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);
203
204 structureViewer = createTreeViewer(composite, TermType.Structure, Messages.CharacterEditor_STRUCTURES);
205
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);
212
213 propertyViewer = createTreeViewer(composite_1, TermType.Property, Messages.CharacterEditor_PROPERTIES);
214 propertyViewer.addSelectionChangedListener(this);
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 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);
233
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() {
238 @Override
239 public void widgetSelected(SelectionEvent e) {
240 if(!isVocabularySet()){
241 return;
242 }
243 if (confirmSaveDirty()){
244 return;
245 }
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);
251 return;
252 }
253 Collection<Character> characters = createCharacters((TreeSelection)structureTreeSelection, (TreeSelection)propertyTreeSelection);
254 TermNodeDto parent = characterTreeEditorComposite.getFeatureTree().getRoot();
255 ISelection sel = characterTreeEditorComposite.getViewer().getSelection();
256
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;
263 }
264 }
265
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);
270 setDirty();
271 // result = CdmStore.getService(ITermNodeService.class).createChildFeatureNode(parent.getUuid(), character, vocabulary.getUuid());
272
273 }
274
275
276 refresh();
277 }
278 });
279 btnAddCharacter.setEnabled(false);
280
281 btnAddRatioTo = new Button(composite_4, SWT.NONE);
282 btnAddRatioTo.setText("ratio to"); //$NON-NLS-1$
283
284 btnAddRatioTo.setSize(btnAddCharacter.getSize());
285 btnAddRatioTo.setEnabled(false);
286
287 formToolkit.adapt(btnAddRatioTo, true, true);
288 btnAddRatioTo.addSelectionListener(new SelectionAdapter() {
289 @Override
290 public void widgetSelected(SelectionEvent e) {
291
292 if (confirmSaveDirty()){
293 return;
294 }
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);
300 return;
301 }
302
303 CharacterNodeDto character = (CharacterNodeDto)((TreeSelection)characterSelection).getFirstElement();
304 TermNode ratioToNode = (TermNode)((TreeSelection)structureTreeSelection).getFirstElement();
305 if (character == null){
306 return;
307 }
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());
321 }
322
323 String label = null;
324 String abbrevLabel = null;
325
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() ;
329 }
330 if(structureRepresentation.getAbbreviatedLabel()!=null && propertyRepresentation.getAbbreviatedLabel()!=null && ratioToRepresentation.getAbbreviatedLabel() != null){
331 abbrevLabel = propertyRepresentation.getAbbreviatedLabel() + " ratio " +structureRepresentation.getAbbreviatedLabel()+ " to " + ratioToRepresentation.getAbbreviatedLabel();
332 }
333 }
334 if(label==null){
335 //default label
336 label = property.getTerm().getRepresentation_L10n()+ " ratio " +structure.getTerm().getRepresentation_L10n()+ " to " + ratioToNode.getTerm().getLabel() ;
337 }
338 character.getTerm().getRepresentation(CdmStore.getDefaultLanguage()).setLabel(label);
339 character.getTerm().getRepresentation(CdmStore.getDefaultLanguage()).setAbbreviatedLabel(abbrevLabel);
340
341 setDirty();
342 nodesToUpdate.add(character);
343
344 refresh();
345
346 characterTreeEditorComposite.getViewer().setSelection(new StructuredSelection(character));
347 EventUtility.postEvent(WorkbenchEventConstants.REFRESH_DETAILS, true);
348 }
349 });
350
351 characterTreeEditorComposite = addFeatureTreeEditor(composite_3);
352 initFeatureTreeComposite(TermType.Character, characterTreeEditorComposite, new TermNodeDtoDragListener(characterTreeEditorComposite.getViewer()),
353 new TermTreeDtoDropAdapter(this, characterTreeEditorComposite.getViewer(), sync),
354 null);
355
356 characterTreeEditorComposite.getLabel_title().setText(Messages.CharacterEditor_CHARACTERS);
357
358 //add context menu to character viewer
359 menuService.registerContextMenu(characterTreeEditorComposite.getViewer().getControl(),
360 AppModelId.POPUPMENU_EU_ETAXONOMY_TAXEDITOR_EDITOR_POPUPMENU_CHARACTEREDITOR);
361
362 }
363
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");
373
374
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() {
383
384 @Override
385 public void widgetSelected(SelectionEvent e) {
386 viewer.setInput(CdmStore.getService(ITermTreeService.class).list(termType, null, null, null, TermTreeEditor.TREE_PROPERTY_PATH));
387 refresh(viewer);
388 }
389 });
390 return viewer;
391 }
392
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;
397 }
398
399 private void initFeatureTreeComposite(
400 TermType termType,
401 TermTreeDtoEditorComposite TermTreeEditorComposite,
402 TermNodeDtoDragListener featureNodeDragListener,
403 TermTreeDtoDropAdapter featureNodeDropAdapter,
404 Transfer[] transfers) {
405
406 TermTreeEditorComposite.init(
407 featureNodeDragListener,
408 featureNodeDropAdapter,
409 transfers,
410 this,
411 new FeatureTreeChooserListener(TermTreeEditorComposite, termType),
412 this);
413 }
414
415 @Focus
416 public void focus(){
417 if(characterTreeEditorComposite!=null){
418 characterTreeEditorComposite.getViewer().getControl().setFocus();
419 }
420 if(cdmEntitySession != null) {
421 cdmEntitySession.bind();
422 }
423 }
424
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();
429
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;
436 }else{
437 return null;
438
439 }
440
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());
447 }
448 Representation propertyRepresentation = propertyNode.getTerm().getRepresentation(PreferencesUtil.getGlobalLanguage());
449 if(propertyRepresentation==null){
450 propertyRepresentation = propertyNode.getTerm().getRepresentation(Language.DEFAULT());
451 }
452 String label = null;
453 String abbrevLabel = null;
454 if(structureRepresentation!=null && propertyRepresentation!=null){
455 if(structureRepresentation.getLabel()!=null && propertyRepresentation.getLabel()!=null){
456 label = structureRepresentation.getLabel()+" "+propertyRepresentation.getLabel();
457 }
458 if(structureRepresentation.getAbbreviatedLabel()!=null && propertyRepresentation.getAbbreviatedLabel()!=null){
459 abbrevLabel = structureRepresentation.getAbbreviatedLabel()+" "+propertyRepresentation.getAbbreviatedLabel();
460 }
461 }
462 if(label!=null){
463 //default label
464 label = structureNode.getTerm().getLabel()+" "+propertyNode.getTerm().getLabel();
465 }
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);
472
473 }
474 }
475 return characters;
476 }
477
478 @Override
479 @Persist
480 public void save(IProgressMonitor monitor){
481
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()));
485 }
486 nodesToSave.clear();
487 TermTreeDto featureTree = characterTreeEditorComposite.getFeatureTree();
488 if (operations != null && !operations.isEmpty()){
489 for (AbstractPostOperation<TermNode> operation: operations){
490 AbstractUtility.executeOperation(operation, sync);
491 }
492 operations.clear();
493 }
494
495 // TODO: implement update method for dto
496
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);
508 }
509 }
510
511 }
512
513 // initializeTrees();
514
515 dirty.setDirty(false);
516 }
517
518 private void initializeTrees() {
519 Object[] expandedElements = characterTreeEditorComposite.getViewer().getExpandedElements();
520 characterTreeEditorComposite.getViewer().getTree().removeAll();
521 characterTreeEditorComposite.getViewer().setExpandedElements(expandedElements);
522 }
523
524 @Override
525 public boolean isDirty() {
526 return dirty.isDirty();
527 }
528
529 @PreDestroy
530 public void dispose(){
531
532 if(cdmEntitySession != null) {
533 cdmEntitySession.dispose();
534 cdmEntitySession = null;
535 }
536 dirty.setDirty(false);
537 }
538
539 public boolean isVocabularySet() {
540 if(vocabulary==null){
541 MessagingUtils.warningDialog("Character creation not possible", this.getClass(), "Please select a vocabulary for the characters.");
542 }
543 return vocabulary!=null;
544 }
545
546 public boolean confirmSaveDirty(){
547 return StoreUtil.promptCheckIsDirty(this);
548 }
549
550 public TermVocabulary getVocabulary() {
551 return vocabulary;
552 }
553
554 @Override
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$
560 });
561 Map<Object, List<String>> propertyPathMap =
562 new HashMap<Object, List<String>>();
563 propertyPathMap.put(TermNode.class,propertyPaths);
564 return propertyPathMap;
565 }
566
567 @Override
568 public List<TermTreeDto> getRootEntities() {
569 List<TermTreeDto> root = new ArrayList<>();
570 root.add(characterTreeEditorComposite.getFeatureTree());
571 return root;
572 }
573
574 @Override
575 public ICdmEntitySession getCdmEntitySession() {
576 return cdmEntitySession;
577 }
578
579
580 @Focus
581 public void setFocus() {
582
583 }
584
585 @Override
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();
593
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);
596 }else {
597 btnAddCharacter.setEnabled(false);
598 }
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);
602 }else {
603 btnAddRatioTo.setEnabled(false);
604 }
605 }
606
607
608 @Override
609 public void modifyText(ModifyEvent e) {
610 characterTreeEditorComposite.getFeatureTree().setTitleCache(((Text) e.widget).getText());
611 setDirty();
612 }
613
614
615
616 @Override
617 public void setDirty() {
618 dirty.setDirty(true);
619 }
620
621 @Override
622 public IStructuredSelection getSelection() {
623 return (IStructuredSelection) characterTreeEditorComposite.getViewer().getSelection();
624 }
625
626
627 @Override
628 public TermType getTermType() {
629 return TermType.Character;
630 }
631
632 public TermTreeDto getCharacterTree(){
633 return characterTreeEditorComposite.getFeatureTree();
634 }
635
636
637 public void refresh(TreeViewer viewer){
638 viewer.refresh();
639
640 characterTreeEditorComposite.getViewer().setInput(characterTreeEditorComposite.getViewer().getInput());
641 }
642
643 private class FeatureTreeChooserListener extends SelectionAdapter{
644 private TermTreeDtoEditorComposite<Feature> TermTreeEditorComposite;
645 private TermType termType;
646
647 public FeatureTreeChooserListener(TermTreeDtoEditorComposite<Feature> TermTreeEditorComposite, TermType termType) {
648 super();
649 this.TermTreeEditorComposite = TermTreeEditorComposite;
650 this.termType = termType;
651 }
652
653 @Override
654 public void widgetSelected(SelectionEvent e) {
655 TermTree tree = FeatureTreeSelectionDialog.select(TermTreeEditorComposite.getDisplay().getActiveShell(), null, termType);
656 if(tree!=null){
657 cdmEntitySession.load(tree, true);
658 TermTreeEditorComposite.setSelectedTree(tree);
659 }
660 }
661 }
662
663
664
665 @Override
666 public void changed(Object element) {
667 setDirty();
668 characterTreeEditorComposite.getViewer().refresh();
669 }
670
671 @Override
672 public void forceDirty() {
673 setDirty();
674 }
675
676 @Override
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);
682 }
683 return true;
684 }
685
686 @Override
687 public boolean onComplete() {
688 return false;
689 }
690
691 @Override
692 public void refresh() {
693 structureViewer.refresh();
694 propertyViewer.refresh();
695 characterTreeEditorComposite.refresh();
696
697 }
698
699 @Override
700 public TermNodeDto getNodeDtoForUuid(UUID nodeUuid){
701 return (TermNodeDto)this.characterTreeEditorComposite.getNodeUuidMap().get(nodeUuid);
702
703 }
704
705 @Override
706 public void addOperation(AbstractPostOperation operation) {
707 operations.add(operation);
708
709 }
710
711 @Inject
712 @Optional
713 private void addSaveCandidate(@UIEventTopic(WorkbenchEventConstants.ADD_SAVE_CHARACTER) CharacterNodeDto characterNodeDto) {
714
715 if (characterNodeDto != null){
716 if (nodesToUpdate.contains(characterNodeDto)){
717 nodesToUpdate.remove(characterNodeDto);
718 }
719 nodesToUpdate.add(characterNodeDto);
720 }
721
722 }
723
724 @Override
725 public TreeViewer getViewer() {
726 return this.characterTreeEditorComposite.getViewer();
727 }
728
729 @Override
730 public TermTreeDto getTreeDtoForUuid(UUID treeUuid) {
731 if (this.characterTreeEditorComposite.getFeatureTree().getUuid().equals(treeUuid)){
732 return this.characterTreeEditorComposite.getFeatureTree();
733 }
734 return null;
735 }
736
737 @Override
738 public boolean checkDuplicates(UUID termUuid, UUID treeUuid) {
739 for (TermDto dto: characterTreeEditorComposite.getFeatureTree().getTerms()){
740 if (dto != null && dto.getUuid().equals(termUuid)){
741 return true;
742 }
743 }
744 return false;
745 }
746
747 @Override
748 public void setNodeDtoForUuid(TermNodeDto node) {
749 // TODO Auto-generated method stub
750
751 }
752
753 @Override
754 public void setTreeDtoForUuid(TermTreeDto tree) {
755 // TODO Auto-generated method stub
756
757 }
758
759
760
761
762 }