Project

General

Profile

Download (8.18 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * 
3
 */
4
package eu.etaxonomy.taxeditor.forms.term;
5

    
6

    
7
import java.util.ArrayList;
8
import java.util.Collections;
9
import java.util.Comparator;
10
import java.util.List;
11

    
12
import org.apache.log4j.Logger;
13
import org.eclipse.jface.util.PropertyChangeEvent;
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.events.DisposeEvent;
16
import org.eclipse.swt.events.DisposeListener;
17
import org.eclipse.swt.events.SelectionEvent;
18
import org.eclipse.swt.events.SelectionListener;
19
import org.eclipse.swt.graphics.Color;
20
import org.eclipse.swt.widgets.Combo;
21
import org.eclipse.swt.widgets.Composite;
22
import org.eclipse.swt.widgets.Label;
23
import org.eclipse.swt.widgets.Listener;
24

    
25
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
26
import eu.etaxonomy.taxeditor.editor.EditorUtil;
27
import eu.etaxonomy.taxeditor.forms.AbstractCdmFormElement;
28
import eu.etaxonomy.taxeditor.forms.CdmFormFactory;
29
import eu.etaxonomy.taxeditor.forms.CdmPropertyChangeEvent;
30
import eu.etaxonomy.taxeditor.forms.ICdmFormElement;
31
import eu.etaxonomy.taxeditor.forms.IEnableableFormElement;
32
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
33
import eu.etaxonomy.taxeditor.preference.Resources;
34
import eu.etaxonomy.taxeditor.store.CdmStore;
35

    
36
/**
37
 * <p>Abstract AbstractTermComboElement class.</p>
38
 *
39
 * @author n.hoffmann
40
 * @created Nov 5, 2009
41
 * @version 1.0
42
 * @param <T>
43
 */
44
public abstract class AbstractTermComboElement<T extends DefinedTermBase> extends AbstractCdmFormElement implements SelectionListener, DisposeListener, IEnableableFormElement{
45

    
46
	private static final Logger logger = Logger.getLogger(AbstractTermComboElement.class);
47
	
48
	T selection;
49
	
50
	private static String EMPTY_ELEMENT_LABEL = "";
51
	T emptyElement;
52
	
53
	protected Label label;
54
	private Combo combo;
55

    
56
	private ArrayList<T> terms;
57

    
58
	private Comparator<T> termComparator;
59

    
60
	private Composite msgComposite;
61
	
62
	/**
63
	 * <p>Constructor for AbstractTermComboElement.</p>
64
	 *
65
	 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
66
	 * @param style a int.
67
	 * @param formFactory a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory} object.
68
	 * @param labelString a {@link java.lang.String} object.
69
	 * @param selection a T object.
70
	 * @param visibleItems a int.
71
	 * @param <T> a T object.
72
	 */
73
	public AbstractTermComboElement(CdmFormFactory formFactory, ICdmFormElement parentElement, String labelString, T selection, int visibleItems, int style) {
74
		super(formFactory, parentElement);
75
		
76
		if(labelString != null){
77
			label = formFactory.createLabel(getLayoutComposite(), labelString);
78
			addControl(label);
79
		}
80
		
81
        // create combo
82
        combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
83
		addControl(combo);
84
        combo.setLayoutData(CdmFormFactory.FILL_HORIZONTALLY());
85
        combo.setVisibleItemCount(visibleItems);
86
        
87
        populateTerms();
88
        
89
        combo.addSelectionListener(this);
90
        combo.addDisposeListener(this);
91
        PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
92
        
93
        if(selection != null){
94
        	setSelection(selection);
95
        }
96
	}
97

    
98
	/**
99
	 * <p>Getter for the field <code>selection</code>.</p>
100
	 *
101
	 * @return a T object.
102
	 */
103
	public T getSelection(){
104
		return selection;
105
	}
106
	
107
	/**
108
	 * <p>Setter for the field <code>selection</code>.</p>
109
	 *
110
	 * @param selection a T object.
111
	 */
112
	public void setSelection(T selection){
113
		Listener[] listeners = combo.getListeners(SWT.Selection);
114
		
115
		for (Listener listener : listeners){
116
			combo.removeListener(SWT.Selection, listener);
117
		}
118
		
119
		int index = terms.indexOf(selection);
120
		if(index == -1){
121
			createTermNotInPreferredTerms(selection);
122
		}else{
123
			combo.select(index);
124
		}
125
		
126
		for (Listener listener : listeners){
127
			combo.addListener(SWT.Selection, listener);
128
		}
129
	}
130
	
131
	private void populateTerms(){
132
		List<T> preferredTerms = preferredTerms();
133
		
134
		combo.removeAll();
135
		
136
		terms = new ArrayList<T>();
137
		
138
		int i = 1;
139
		int index = 0;
140
		
141
		// Add an empty element for when nothing was selected already
142
		combo.add(EMPTY_ELEMENT_LABEL);
143
		terms.add(emptyElement);
144
		
145
		if(termComparator != null)
146
			Collections.sort(preferredTerms, termComparator);
147
		for (T term : preferredTerms) {
148
			String label = getLabel(term); 
149
			if (label == null) {
150
				if(term.getTitleCache() != null){
151
					label = term.getTitleCache();
152
					logger.error("Term does not have a representation: " + term + ", " + term.getUuid());
153
				}else{
154
					label = "Unknown";
155
					logger.error("Representation Label and TitleCache empty for term: " + term + ", " + term.getUuid());
156
				}
157
				
158
			}
159
							
160
			combo.add(label);
161
			terms.add(term);
162

    
163
			i++;
164
			if (selection != null) {
165
				if (selection.equals(term)) {
166
			 		index = i;
167
				}
168
			} else {
169
				// TODO isn't it better to put the last language at the top of the menu, not automatically select?
170
//					if (lastLanguage != null && lastLanguage.equals(language)) {
171
//						index = i;  
172
//					}
173
			}
174
		}
175
		
176
		// Check whether language is in menu
177
		if (msgComposite != null) {
178
			msgComposite.dispose();
179
			msgComposite = null;
180
		}
181
		if (selection != null && index == 0) {
182
			createTermNotInPreferredTerms(selection);
183
		}
184
		
185
		combo.select(index);	
186
	}
187
	
188
	/*
189
	 * (non-Javadoc)
190
	 * @see eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
191
	 */
192
	/** {@inheritDoc} */
193
	public void setEnabled(boolean enabled) {
194
		combo.setEnabled(enabled);
195
	}
196
	
197
	/**
198
	 * <p>preferredTerms</p>
199
	 *
200
	 * @return a {@link java.util.List} object.
201
	 */
202
	protected abstract List<T> preferredTerms();
203
	
204
	/**
205
	 * May be overridden by derived classes if the desired label string does not
206
	 * reside in term.getLabel();
207
	 *
208
	 * @param term a T object.
209
	 * @return a {@link java.lang.String} object.
210
	 */
211
	protected String getLabel(T term){
212
		return term.getLabel(CdmStore.getDefaultLanguage());
213
	}
214

    
215
	private void createTermNotInPreferredTerms(T term) {
216
		
217
//		PreferencesUtil.addTermToPreferredTerms(term);
218
//	
219
//		msgComposite = formFactory.createComposite(getLayoutComposite());
220
//		msgComposite.setLayout(LAYOUT());
221
//		msgComposite.setLayoutData(FILL_GRID_HORIZONTALLY(2, 1));
222
//		
223
//		String langText = term.getDescription() == null ? term.getLabel() : term.getDescription();
224
//		langText += " is used here, but was not in your list of preferred terms.";
225
//		Label label = formFactory.createLabel(msgComposite, langText, SWT.WRAP);
226
//
227
//		
228
//		msgComposite.moveBelow(combo);
229
//		
230
//		getLayoutComposite().layout();
231
		
232
//		setSelection(term);
233
	}
234
	
235
	/**
236
	 * <p>addSelectionListener</p>
237
	 *
238
	 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
239
	 */
240
	public void addSelectionListener(SelectionListener listener){
241
		combo.addSelectionListener(listener);
242
	}
243
	
244
	/**
245
	 * <p>removeSelectionListener</p>
246
	 *
247
	 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
248
	 */
249
	public void removeSelectionListener(SelectionListener listener){
250
		combo.removeSelectionListener(listener);
251
	}
252

    
253
	/* (non-Javadoc)
254
	 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
255
	 */
256
	/** {@inheritDoc} */
257
	public void widgetSelected(SelectionEvent e) {
258
		selection = terms.get(combo.getSelectionIndex());
259
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
260
	}
261
	
262
	/* (non-Javadoc)
263
	 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
264
	 */
265
	/** {@inheritDoc} */
266
	public void propertyChange(PropertyChangeEvent event) {
267
		super.propertyChange(event);
268
		if (event != null && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event.getProperty())) {
269
			populateTerms();
270
		}
271
	}
272
	
273
	/** {@inheritDoc} */
274
	public void setSelected(boolean selected) {
275
		label.setBackground(getColor(selected));
276
	}
277
	
278
	/** {@inheritDoc} */
279
	public void widgetDisposed(DisposeEvent e) {
280
		PreferencesUtil.getPreferenceStore().removePropertyChangeListener(this);
281
	}
282
	
283
	// not used
284
	/** {@inheritDoc} */
285
	public void widgetDefaultSelected(SelectionEvent e) {}
286
	
287
	/** {@inheritDoc} */
288
	public void setIrrelevant(boolean irrelevant) {
289
		String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT : Resources.COLOR_COMPOSITE_BACKGROUND;
290
		
291
		Color color = EditorUtil.getColor(colorId);
292
		combo.setBackground(color);
293
	}
294
	
295
	/** {@inheritDoc} */
296
	@Override
297
	public void setBackground(Color color) {
298
		if(label != null)
299
			label.setBackground(color);
300
	}
301
}
(2-2/27)