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