fix #8162 adapt terms to new package structure in TaxEditor
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / combo / VocabularyComboElement.java
1 /**
2 *
3 */
4 package eu.etaxonomy.taxeditor.ui.combo;
5
6 import java.util.ArrayList;
7 import java.util.Collections;
8 import java.util.Comparator;
9 import java.util.List;
10
11 import org.eclipse.jface.util.PropertyChangeEvent;
12 import org.eclipse.swt.SWT;
13 import org.eclipse.swt.events.SelectionEvent;
14 import org.eclipse.swt.widgets.Listener;
15
16 import eu.etaxonomy.cdm.api.service.IVocabularyService;
17 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
18 import eu.etaxonomy.cdm.model.term.TermType;
19 import eu.etaxonomy.cdm.model.term.TermVocabulary;
20 import eu.etaxonomy.taxeditor.model.MessagingUtils;
21 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
22 import eu.etaxonomy.taxeditor.store.CdmStore;
23 import eu.etaxonomy.taxeditor.store.TermManager;
24 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
25 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
26 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
27
28 /**
29 * @author n.hoffmann
30 * @created Nov 5, 2009
31 * @version 1.0
32 * @param <VOC>
33 */
34 public class VocabularyComboElement<TERM extends DefinedTermBase<TERM>, VOC extends TermVocabulary<TERM>>
35 extends AbstractComboElement<VOC> {
36
37 private VOC emptyElement;
38 private static String EMPTY_ELEMENT_LABEL = "";
39
40 private ArrayList<VOC> terms;
41
42 private Comparator<VOC> vocComparator;
43
44 private final TermType termType;
45
46 public VocabularyComboElement(CdmFormFactory formFactory,
47 ICdmFormElement parentElement, TermType termType, String labelString, VOC selection,
48 int style) {
49 super(formFactory, parentElement);
50
51 this.termType = termType;
52
53 populateTerms(getVocabularies());
54
55 combo.addSelectionListener(this);
56 combo.addDisposeListener(this);
57 PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
58
59 if (selection != null) {
60 setSelection(selection);
61 }
62 }
63
64 /**
65 * <p>Sets the selection of the combo to the given T object.</p>
66 * <p>Passing <code>null</code> to this method will set the selection to
67 * the empty element and effectively clear the selection</p>
68 *
69 * @param selection
70 * a T object or <code>null</code> to clear the selection
71 */
72 @Override
73 public void setSelection(VOC selection) {
74 this.selection = selection;
75
76 this.selection = selection;
77
78 Listener[] listeners = combo.getListeners(SWT.Selection);
79
80 for (Listener listener : listeners) {
81 combo.removeListener(SWT.Selection, listener);
82 }
83 int selectedIndex;
84 if(selection == null){
85 // set selection to the emptyElement
86 selectedIndex = 0;
87 }else{
88 selectedIndex = terms.indexOf(selection);
89 if (selectedIndex == -1) {
90 createTermNotInPreferredTerms(selection);
91 selectedIndex = terms.indexOf(selection);
92 }
93 }
94 combo.select(selectedIndex);
95
96 for (Listener listener : listeners) {
97 combo.addListener(SWT.Selection, listener);
98 }
99 }
100
101 /**
102 * Fills the combo with elements and sets up the convenience functions
103 * for selection index
104 *
105 * @param preferredTerms
106 */
107 private void populateTerms(List<VOC> preferredTerms) {
108
109 combo.removeAll();
110
111 terms = new ArrayList<VOC>();
112
113 int i = 1;
114 int index = 0;
115
116 // Add an empty element for when nothing was selected yet
117 combo.add(EMPTY_ELEMENT_LABEL);
118 terms.add(emptyElement);
119
120 if (vocComparator != null) {
121 Collections.sort(preferredTerms, vocComparator);
122 }
123 for (VOC term : preferredTerms) {
124 String label = getLabel(term);
125 if (label == null) {
126 if (term.getTitleCache() != null) {
127 label = term.getTitleCache();
128 MessagingUtils.warn(getClass(),
129 "Term does not have a default language representation: " + label
130 + ", " + term.getUuid());
131 } else {
132 label = "Unknown";
133 MessagingUtils.warn(getClass(),
134 "Representation Label and TitleCache empty for term: "
135 + term + ", " + term.getUuid());
136 }
137
138 }
139
140 combo.add(label);
141 terms.add(term);
142
143 i++;
144 if (selection != null) {
145 if (selection.equals(term)) {
146 index = i;
147 }
148 }
149 }
150
151 if (selection != null && index == 0) {
152 createTermNotInPreferredTerms(selection);
153 }
154
155 combo.select(index);
156 }
157
158 protected List<VOC> getVocabularies(){
159 List<TermVocabulary<TERM>> list = CdmStore.getService(IVocabularyService.class).<TERM>findByTermType(termType, null);
160 return (List<VOC>) list;
161 }
162
163 /**
164 * May be overridden by derived classes if the desired label string does not
165 * reside in term.getLabel();
166 *
167 * @param term
168 * a T object.
169 * @return a {@link java.lang.String} object.
170 */
171 protected String getLabel(VOC term) {
172 if (term == null){
173 return "";
174 }else{
175 return term.getLabel(CdmStore.getDefaultLanguage());
176 }
177 }
178
179 private void createTermNotInPreferredTerms(VOC term) {
180 List<VOC> preferredTerms = getVocabularies();
181
182 preferredTerms.add(term);
183
184 populateTerms(preferredTerms);
185 }
186
187 /** {@inheritDoc} */
188 @Override
189 public void widgetSelected(SelectionEvent e) {
190 selection = terms.get(combo.getSelectionIndex());
191 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
192 }
193
194 /** {@inheritDoc} */
195 @Override
196 public void propertyChange(PropertyChangeEvent event) {
197 super.propertyChange(event);
198 if (event != null
199 && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event
200 .getProperty())) {
201 populateTerms(getVocabularies());
202 }
203 }
204
205 protected TermManager getTermManager() {
206 return CdmStore.getTermManager();
207 }
208
209 public int getVisibleItemCount(){
210 return combo.getVisibleItemCount();
211 }
212
213 public void removeEmptyElement(){
214 terms.remove(emptyElement);
215 combo.remove(EMPTY_ELEMENT_LABEL);
216 }
217
218 }