Refactoring of selection elements. Additional minor refactoring. Fixed a bug with...
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / combo / TermComboElement.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.DisposeEvent;
14 import org.eclipse.swt.events.DisposeListener;
15 import org.eclipse.swt.events.SelectionEvent;
16 import org.eclipse.swt.events.SelectionListener;
17 import org.eclipse.swt.graphics.Color;
18 import org.eclipse.swt.widgets.Combo;
19 import org.eclipse.swt.widgets.Label;
20 import org.eclipse.swt.widgets.Listener;
21
22 import eu.etaxonomy.cdm.model.common.DefinedTermBase;
23 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
24 import eu.etaxonomy.taxeditor.preference.Resources;
25 import eu.etaxonomy.taxeditor.store.CdmStore;
26 import eu.etaxonomy.taxeditor.store.StoreUtil;
27 import eu.etaxonomy.taxeditor.store.TermManager;
28 import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
29 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
30 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
31 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
32 import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
33 import eu.etaxonomy.taxeditor.ui.element.ISelectable;
34 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
35
36 /**
37 * <p>
38 * Abstract AbstractTermComboElement class.
39 * </p>
40 *
41 * @author n.hoffmann
42 * @created Nov 5, 2009
43 * @version 1.0
44 * @param <T>
45 */
46 public class TermComboElement<T extends DefinedTermBase>
47 extends AbstractCdmFormElement implements SelectionListener,
48 DisposeListener, IEnableableFormElement, ISelectable {
49
50 private static final int DEFAULT_VISIBLE_ITEMS = 10;
51
52 private T selection;
53
54 private T emptyElement;
55 private static String EMPTY_ELEMENT_LABEL = "";
56
57 protected Label label;
58 private Combo combo;
59
60 private ArrayList<T> terms;
61
62 private Comparator<T> termComparator;
63
64 private Class<T> termClass;
65
66
67 /**
68 * <p>
69 * Constructor for AbstractTermComboElement.
70 * </p>
71 *
72 * @param parentElement
73 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
74 * object.
75 * @param style
76 * a int.
77 * @param formFactory
78 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
79 * object.
80 * @param labelString
81 * a {@link java.lang.String} object.
82 * @param selection
83 * a T object.
84 * @param visibleItems
85 * a int.
86 * @param <T>
87 * a T object.
88 */
89 public TermComboElement(CdmFormFactory formFactory,
90 ICdmFormElement parentElement, Class<T> termClass, String labelString, T selection,
91 int style) {
92 super(formFactory, parentElement);
93
94 this.termClass = termClass;
95
96 if (labelString != null) {
97 label = formFactory.createLabel(getLayoutComposite(), labelString);
98 addControl(label);
99 }
100
101 // create combo
102 combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
103 addControl(combo);
104 combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
105 combo.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
106
107 populateTerms(getPreferredTerms());
108
109 combo.addSelectionListener(this);
110 combo.addDisposeListener(this);
111 PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
112
113 if (selection != null) {
114 setSelection(selection);
115 }
116 }
117
118 /**
119 * <p>
120 * Getter for the field <code>selection</code>.
121 * </p>
122 *
123 * @return a T object.
124 */
125 public T getSelection() {
126 return selection;
127 }
128
129 /**
130 * <p>
131 * Setter for the field <code>selection</code>.
132 * </p>
133 *
134 * @param selection
135 * a T object.
136 */
137 public void setSelection(T selection) {
138 Listener[] listeners = combo.getListeners(SWT.Selection);
139
140 for (Listener listener : listeners) {
141 combo.removeListener(SWT.Selection, listener);
142 }
143
144 int index = terms.indexOf(selection);
145 if (index == -1) {
146 createTermNotInPreferredTerms(selection);
147 index = terms.indexOf(selection);
148 }
149 combo.select(index);
150
151 for (Listener listener : listeners) {
152 combo.addListener(SWT.Selection, listener);
153 }
154 }
155
156 private void populateTerms(List<T> preferredTerms) {
157
158 combo.removeAll();
159
160 terms = new ArrayList<T>();
161
162 int i = 1;
163 int index = 0;
164
165 // Add an empty element for when nothing was selected yet
166 combo.add(EMPTY_ELEMENT_LABEL);
167 terms.add(emptyElement);
168
169 if (termComparator != null) {
170 Collections.sort(preferredTerms, termComparator);
171 }
172 for (T term : preferredTerms) {
173 String label = getLabel(term);
174 if (label == null) {
175 if (term.getTitleCache() != null) {
176 label = term.getTitleCache();
177 StoreUtil.error(getClass(),
178 "Term does not have a representation: " + term
179 + ", " + term.getUuid(), null);
180 } else {
181 label = "Unknown";
182 StoreUtil.error(getClass(),
183 "Representation Label and TitleCache empty for term: "
184 + term + ", " + term.getUuid(), null);
185 }
186
187 }
188
189 combo.add(label);
190 terms.add(term);
191
192 i++;
193 if (selection != null) {
194 if (selection.equals(term)) {
195 index = i;
196 }
197 }
198 }
199
200 if (selection != null && index == 0) {
201 createTermNotInPreferredTerms(selection);
202 }
203
204 combo.select(index);
205 }
206
207 /*
208 * (non-Javadoc)
209 *
210 * @see
211 * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
212 */
213 /** {@inheritDoc} */
214 public void setEnabled(boolean enabled) {
215 combo.setEnabled(enabled);
216 }
217
218 /**
219 * <p>
220 * preferredTerms
221 * </p>
222 *
223 * @return a {@link java.util.List} object.
224 */
225 protected List<T> getPreferredTerms(){
226 return getTermManager().getPreferredTerms(termClass);
227 }
228
229 /**
230 * May be overridden by derived classes if the desired label string does not
231 * reside in term.getLabel();
232 *
233 * @param term
234 * a T object.
235 * @return a {@link java.lang.String} object.
236 */
237 protected String getLabel(T term) {
238 return term.getLabel(CdmStore.getDefaultLanguage());
239 }
240
241 private void createTermNotInPreferredTerms(T term) {
242 List<T> preferredTerms = getPreferredTerms();
243
244 preferredTerms.add(term);
245
246 populateTerms(preferredTerms);
247 }
248
249 /**
250 * <p>
251 * addSelectionListener
252 * </p>
253 *
254 * @param listener
255 * a {@link org.eclipse.swt.events.SelectionListener} object.
256 */
257 public void addSelectionListener(SelectionListener listener) {
258 combo.addSelectionListener(listener);
259 }
260
261 /**
262 * <p>
263 * removeSelectionListener
264 * </p>
265 *
266 * @param listener
267 * a {@link org.eclipse.swt.events.SelectionListener} object.
268 */
269 public void removeSelectionListener(SelectionListener listener) {
270 combo.removeSelectionListener(listener);
271 }
272
273 /*
274 * (non-Javadoc)
275 *
276 * @see
277 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
278 * .events.SelectionEvent)
279 */
280 /** {@inheritDoc} */
281 public void widgetSelected(SelectionEvent e) {
282 selection = terms.get(combo.getSelectionIndex());
283 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
284 }
285
286 /*
287 * (non-Javadoc)
288 *
289 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
290 * PropertyChangeEvent)
291 */
292 /** {@inheritDoc} */
293 public void propertyChange(PropertyChangeEvent event) {
294 super.propertyChange(event);
295 if (event != null
296 && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event
297 .getProperty())) {
298 populateTerms(getPreferredTerms());
299 }
300 }
301
302 /** {@inheritDoc} */
303 public void setSelected(boolean selected) {
304 setBackground(selected ? SELECTED : getPersistentBackground());
305 }
306
307 /** {@inheritDoc} */
308 public void widgetDisposed(DisposeEvent e) {
309 PreferencesUtil.getPreferenceStore().removePropertyChangeListener(this);
310 }
311
312 // not used
313 /** {@inheritDoc} */
314 public void widgetDefaultSelected(SelectionEvent e) {
315 }
316
317 /** {@inheritDoc} */
318 public void setIrrelevant(boolean irrelevant) {
319 String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT
320 : Resources.COLOR_COMPOSITE_BACKGROUND;
321
322 Color color = StoreUtil.getColor(colorId);
323 combo.setBackground(color);
324 }
325
326 /** {@inheritDoc} */
327 @Override
328 public void setBackground(Color color) {
329 if (label != null)
330 label.setBackground(color);
331 }
332
333 /**
334 *
335 */
336 protected TermManager getTermManager() {
337 return CdmStore.getTermManager();
338 }
339
340 public int getVisibleItemCount(){
341 return combo.getVisibleItemCount();
342 }
343
344 public void setVisibleItemCount(int count){
345 combo.setVisibleItemCount(count);
346 }
347
348 public void setTerms(List<T> terms) {
349 populateTerms(terms);
350 }
351 }