ref #8774: adapt term tree editors to usage of termDtos
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / section / feature / FeatureStateWizardPage.java
1 /**
2 * Copyright (C) 2019 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.ui.section.feature;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.Collections;
14 import java.util.List;
15 import java.util.Set;
16 import java.util.UUID;
17
18 import org.eclipse.core.runtime.IStatus;
19 import org.eclipse.jface.util.PropertyChangeEvent;
20 import org.eclipse.jface.wizard.WizardDialog;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.events.SelectionAdapter;
23 import org.eclipse.swt.events.SelectionEvent;
24 import org.eclipse.swt.layout.GridData;
25 import org.eclipse.swt.layout.GridLayout;
26 import org.eclipse.swt.widgets.Button;
27 import org.eclipse.swt.widgets.Composite;
28 import org.eclipse.swt.widgets.Label;
29 import org.eclipse.swt.widgets.Text;
30
31 import eu.etaxonomy.cdm.api.service.ITermNodeService;
32 import eu.etaxonomy.cdm.model.description.Feature;
33 import eu.etaxonomy.cdm.model.description.FeatureState;
34 import eu.etaxonomy.cdm.model.description.State;
35 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
36 import eu.etaxonomy.cdm.model.term.TermNode;
37 import eu.etaxonomy.cdm.model.term.TermVocabulary;
38 import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
39 import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
40 import eu.etaxonomy.taxeditor.featuretree.AvailableFeaturesWizard;
41 import eu.etaxonomy.taxeditor.model.ImageResources;
42 import eu.etaxonomy.taxeditor.store.CdmStore;
43 import eu.etaxonomy.taxeditor.ui.AbstractEntityCollectionElementWizardPage;
44 import eu.etaxonomy.taxeditor.ui.combo.term.TermComboElement;
45 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
46 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
47
48 /**
49 * @author pplitzner
50 * @since Aug 16, 2019
51 *
52 */
53 public class FeatureStateWizardPage extends AbstractEntityCollectionElementWizardPage {
54
55 private TermComboElement<Feature> comboFeature;
56 private Button btnSelectState;
57
58 private TermNodeDto<? extends Feature> termNode;
59 private State selectedState = null;
60 private List<TermVocabularyDto> stateVocabulariesDtos = new ArrayList<>();
61 private Text text;
62
63 protected FeatureStateWizardPage(String pageName, TermNodeDto<? extends Feature> termNode, CdmFormFactory formFactory) {
64 super(pageName, formFactory);
65 this.termNode = termNode;
66 setTitle("Create Feature State");
67 setDescription("Select Feature and State");
68 }
69
70 @Override
71 public void createControl(Composite parent) {
72 super.createControl(parent);
73
74 comboFeature = formFactory.createDefinedTermComboElement(Collections.EMPTY_LIST, rootElement, "Parent Feature", null, SWT.NONE);
75
76 Label label = new Label(rootElement.getLayoutComposite(), SWT.NONE);
77 label.setText("State");
78 Composite buttonTextComposite = new Composite(rootElement.getLayoutComposite(), SWT.NONE);
79 buttonTextComposite.setLayoutData(LayoutConstants.FILL(1, 1));
80 buttonTextComposite.setLayout(new GridLayout(2, false));
81 text = new Text(buttonTextComposite, SWT.NONE);
82 text.setEditable(false);
83 text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
84 btnSelectState = new Button(buttonTextComposite, SWT.PUSH);
85 btnSelectState.setImage(ImageResources.getImage(ImageResources.BROWSE_ICON));
86 btnSelectState.addSelectionListener(new SelectionAdapter() {
87
88 @Override
89 public void widgetSelected(SelectionEvent e) {
90 AvailableFeaturesWizard wizard = new AvailableFeaturesWizard(stateVocabulariesDtos);
91 wizard.setSingleSelection(true);
92 WizardDialog dialog = new WizardDialog(getShell(), wizard);
93
94 if (dialog.open() == IStatus.OK) {
95 Collection<DefinedTermBase> additionalTerms = wizard.getAdditionalFeatures();
96 if(additionalTerms.size()==1){
97 selectedState = (State) additionalTerms.iterator().next();
98 text.setText(selectedState.getLabel());
99 FeatureStateWizardPage.this.getWizard().getContainer().updateButtons();
100 }
101 }
102 }
103 });
104
105 formFactory.addPropertyChangeListener(this);
106
107 updateFeatureCombo();
108 }
109
110 FeatureState getFeatureState(){
111 return FeatureState.NewInstance(comboFeature.getSelection(), selectedState);
112 }
113
114 private void updateFeatureCombo(){
115 List<Feature> features = new ArrayList<>();
116 UUID parentUuid = termNode.getParentUuid();
117 if (parentUuid != null){
118 TermNode<? extends Feature> parent = CdmStore.getService(ITermNodeService.class).load(parentUuid);
119 while(parent!=null){
120 Feature parentTerm = parent.getTerm();
121 if(parentTerm!=null
122 && parentTerm.isSupportsCategoricalData()
123 && !parentTerm.getSupportedCategoricalEnumerations().isEmpty()){
124 features.add(parentTerm);
125 }
126 parent = parent.getParent();
127 }
128 }
129 comboFeature.setTerms(features);
130 if(features.size()==1){
131 Feature feature = features.get(0);
132 comboFeature.setSelection(feature);
133 updateStateCombo(feature);
134 comboFeature.removeEmptyElement();
135 }
136 }
137
138 private void updateStateCombo(Feature feature){
139 stateVocabulariesDtos.clear();
140 text.setText("");
141 selectedState = null;
142 if(feature!=null){
143 Set<TermVocabulary<State>> stateVocabularies = feature.getSupportedCategoricalEnumerations();
144 for (TermVocabulary<State> termVocabulary : stateVocabularies) {
145 stateVocabulariesDtos.add(new TermVocabularyDto(termVocabulary.getUuid(), termVocabulary.getRepresentations(), termVocabulary.getTermType(), termVocabulary.getTitleCache(), termVocabulary.isAllowDuplicates(), termVocabulary.isOrderRelevant(), termVocabulary.isFlat()));
146 }
147 }
148 }
149
150 @Override
151 public boolean isPageComplete() {
152 return comboFeature.getSelection()!=null && selectedState!=null;
153 }
154
155 @Override
156 public void propertyChange(PropertyChangeEvent event) {
157 if(event.getSource()==comboFeature){
158 Feature feature = comboFeature.getSelection();
159 updateStateCombo(feature);
160 comboFeature.removeEmptyElement();
161 }
162 getWizard().getContainer().updateButtons();
163 }
164
165 }