performed javacscript:fix and worked on documentation
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / forms / term / AbstractTermComboElement.java
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 }