Project

General

Profile

Download (7.82 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(2-2/28)