Project

General

Profile

Download (5.5 KB) Statistics
| Branch: | Tag: | Revision:
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.SelectionEvent;
14
import org.eclipse.swt.widgets.Listener;
15

    
16
import eu.etaxonomy.cdm.api.service.IVocabularyService;
17
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
18
import eu.etaxonomy.cdm.model.common.TermType;
19
import eu.etaxonomy.cdm.model.common.TermVocabulary;
20
import eu.etaxonomy.taxeditor.model.MessagingUtils;
21
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
22
import eu.etaxonomy.taxeditor.store.CdmStore;
23
import eu.etaxonomy.taxeditor.store.TermManager;
24
import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
25
import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
26
import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
27

    
28
/**
29
 * @author n.hoffmann
30
 * @created Nov 5, 2009
31
 * @version 1.0
32
 * @param <VOC>
33
 */
34
public class VocabularyComboElement<TERM extends DefinedTermBase<TERM>, VOC extends TermVocabulary<TERM>>
35
		extends AbstractComboElement<VOC> {
36

    
37
	private VOC emptyElement;
38
	private static String EMPTY_ELEMENT_LABEL = "";
39

    
40
	private ArrayList<VOC> terms;
41

    
42
	private Comparator<VOC> vocComparator;
43

    
44
    private final TermType termType;
45

    
46
	public VocabularyComboElement(CdmFormFactory formFactory,
47
	        ICdmFormElement parentElement, TermType termType, String labelString, VOC selection,
48
	        int style) {
49
        super(formFactory, parentElement);
50

    
51
        this.termType = termType;
52

    
53
        populateTerms(getVocabularies());
54

    
55
        combo.addSelectionListener(this);
56
        combo.addDisposeListener(this);
57
        PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
58

    
59
        if (selection != null) {
60
            setSelection(selection);
61
        }
62
	}
63

    
64
	/**
65
	 * <p>Sets the selection of the combo to the given T object.</p>
66
	 * <p>Passing <code>null</code> to this method will set the selection to
67
	 * the empty element and effectively clear the selection</p>
68
	 *
69
	 * @param selection
70
	 *            a T object or <code>null</code> to clear the selection
71
	 */
72
	@Override
73
    public void setSelection(VOC selection) {
74
		this.selection = selection;
75

    
76
		this.selection = selection;
77

    
78
		Listener[] listeners = combo.getListeners(SWT.Selection);
79

    
80
		for (Listener listener : listeners) {
81
			combo.removeListener(SWT.Selection, listener);
82
		}
83
		int selectedIndex;
84
		if(selection == null){
85
			// set selection to the emptyElement
86
			selectedIndex = 0;
87
		}else{
88
			selectedIndex = terms.indexOf(selection);
89
			if (selectedIndex == -1) {
90
				createTermNotInPreferredTerms(selection);
91
				selectedIndex = terms.indexOf(selection);
92
			}
93
		}
94
		combo.select(selectedIndex);
95

    
96
		for (Listener listener : listeners) {
97
			combo.addListener(SWT.Selection, listener);
98
		}
99
	}
100

    
101
	/**
102
	 * Fills the combo with elements and sets up the convenience functions
103
	 * for selection index
104
	 *
105
	 * @param preferredTerms
106
	 */
107
	private void populateTerms(List<VOC> preferredTerms) {
108

    
109
		combo.removeAll();
110

    
111
		terms = new ArrayList<VOC>();
112

    
113
		int i = 1;
114
		int index = 0;
115

    
116
		// Add an empty element for when nothing was selected yet
117
		combo.add(EMPTY_ELEMENT_LABEL);
118
		terms.add(emptyElement);
119

    
120
		if (vocComparator != null) {
121
			Collections.sort(preferredTerms, vocComparator);
122
		}
123
		for (VOC term : preferredTerms) {
124
			String label = getLabel(term);
125
			if (label == null) {
126
				if (term.getTitleCache() != null) {
127
					label = term.getTitleCache();
128
					MessagingUtils.warn(getClass(),
129
							"Term does not have a default language representation: " + label
130
									+ ", " + term.getUuid());
131
				} else {
132
					label = "Unknown";
133
					MessagingUtils.warn(getClass(),
134
							"Representation Label and TitleCache empty for term: "
135
									+ term + ", " + term.getUuid());
136
				}
137

    
138
			}
139

    
140
			combo.add(label);
141
			terms.add(term);
142

    
143
			i++;
144
			if (selection != null) {
145
				if (selection.equals(term)) {
146
					index = i;
147
				}
148
			}
149
		}
150

    
151
		if (selection != null && index == 0) {
152
			createTermNotInPreferredTerms(selection);
153
		}
154

    
155
		combo.select(index);
156
	}
157

    
158
	protected List<VOC> getVocabularies(){
159
	    List<TermVocabulary<TERM>> list = CdmStore.getService(IVocabularyService.class).<TERM>findByTermType(termType, null);
160
		return (List<VOC>) list;
161
	}
162

    
163
	/**
164
	 * May be overridden by derived classes if the desired label string does not
165
	 * reside in term.getLabel();
166
	 *
167
	 * @param term
168
	 *            a T object.
169
	 * @return a {@link java.lang.String} object.
170
	 */
171
	protected String getLabel(VOC term) {
172
		if (term == null){
173
			return "";
174
		}else{
175
			return term.getLabel(CdmStore.getDefaultLanguage());
176
		}
177
	}
178

    
179
	private void createTermNotInPreferredTerms(VOC term) {
180
		List<VOC> preferredTerms = getVocabularies();
181

    
182
		preferredTerms.add(term);
183

    
184
		populateTerms(preferredTerms);
185
	}
186

    
187
	/** {@inheritDoc} */
188
	@Override
189
    public void widgetSelected(SelectionEvent e) {
190
		selection = terms.get(combo.getSelectionIndex());
191
		firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
192
	}
193

    
194
	/** {@inheritDoc} */
195
	@Override
196
    public void propertyChange(PropertyChangeEvent event) {
197
		super.propertyChange(event);
198
		if (event != null
199
				&& PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event
200
						.getProperty())) {
201
			populateTerms(getVocabularies());
202
		}
203
	}
204

    
205
	protected TermManager getTermManager() {
206
		return CdmStore.getTermManager();
207
	}
208

    
209
	public int getVisibleItemCount(){
210
		return combo.getVisibleItemCount();
211
	}
212

    
213
    public void removeEmptyElement(){
214
        terms.remove(emptyElement);
215
        combo.remove(EMPTY_ELEMENT_LABEL);
216
    }
217

    
218
}
(4-4/4)