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