3 * Copyright (C) 2013 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.ui
.campanula
.basicFields
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Collections
;
14 import java
.util
.Comparator
;
15 import java
.util
.List
;
17 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
18 import org
.eclipse
.swt
.SWT
;
19 import org
.eclipse
.swt
.events
.DisposeEvent
;
20 import org
.eclipse
.swt
.events
.DisposeListener
;
21 import org
.eclipse
.swt
.events
.SelectionEvent
;
22 import org
.eclipse
.swt
.events
.SelectionListener
;
23 import org
.eclipse
.swt
.graphics
.Color
;
24 import org
.eclipse
.swt
.widgets
.Combo
;
25 import org
.eclipse
.swt
.widgets
.Listener
;
27 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
28 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
29 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
30 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
31 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
32 import eu
.etaxonomy
.taxeditor
.store
.TermManager
;
33 import eu
.etaxonomy
.taxeditor
.ui
.campanula
.compatibility
.ICdmFormElement
;
34 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
35 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
36 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
37 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
38 import eu
.etaxonomy
.taxeditor
.ui
.element
.ISelectable
;
45 public class ComboFieldController
<T
extends DefinedTermBase
> extends AbstractCdmFormElement
implements SelectionListener
, DisposeListener
, IEnableableFormElement
, ISelectable
{
47 private static final int DEFAULT_VISIBLE_ITEMS
= 10;
51 private T emptyElement
;
52 private static String EMPTY_ELEMENT_LABEL
= "";
54 // protected Label label;
57 private ArrayList
<T
> terms
;
59 private Comparator
<T
> termComparator
;
61 private Class
<T
> termClass
;
63 private List
<T
> customPreferredTerms
;
67 * Constructor for AbstractTermComboElement.
70 * @param parentElement
71 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
76 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
79 * a {@link java.lang.String} object.
87 public ComboFieldController(Combo combo
, CdmFormFactory formFactory
, ICdmFormElement parentElement
, Class
<T
> termClass
, T selection
, int style
) {
88 super(formFactory
, parentElement
);
90 this.termClass
= termClass
;
91 setPropertyChangeListeners(formFactory
.getPropertyChangeListeners());
92 formFactory
.addPropertyChangeListener(this);
93 // if (labelString != null) {
94 // label = formFactory.createLabel(getLayoutComposite(), labelString);
99 this.combo
= combo
;//new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
101 // combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
102 combo
.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS
);
104 populateTerms(getPreferredTerms());
106 combo
.addSelectionListener(this);
107 combo
.addDisposeListener(this);
108 PreferencesUtil
.getPreferenceStore().addPropertyChangeListener(this);
110 if (selection
!= null) {
111 setSelection(selection
);
117 * Getter for the field <code>selection</code>.
120 * @return a T object.
122 public T
getSelection() {
128 * Sets the selection of the combo to the given T object.
131 * Passing <code>null</code> to this method will set the selection to the
132 * empty element and effectively clear the selection
136 * a T object or <code>null</code> to clear the selection
138 public void setSelection(T selection
) {
139 this.selection
= selection
;
141 this.selection
= selection
;
143 Listener
[] listeners
= combo
.getListeners(SWT
.Selection
);
145 for (Listener listener
: listeners
) {
146 combo
.removeListener(SWT
.Selection
, listener
);
149 if (selection
== null) {
150 // set selection to the emptyElement
153 selectedIndex
= terms
.indexOf(selection
);
154 if (selectedIndex
== -1) {
155 createTermNotInPreferredTerms(selection
);
156 selectedIndex
= terms
.indexOf(selection
);
159 combo
.select(selectedIndex
);
161 for (Listener listener
: listeners
) {
162 combo
.addListener(SWT
.Selection
, listener
);
167 * Fills the combo with elements and sets up the convenience functions for
170 * @param preferredTerms
172 private void populateTerms(List
<T
> preferredTerms
) {
176 terms
= new ArrayList
<T
>();
181 // Add an empty element for when nothing was selected yet
182 combo
.add(EMPTY_ELEMENT_LABEL
);
183 terms
.add(emptyElement
);
185 if (termComparator
!= null) {
186 Collections
.sort(preferredTerms
, termComparator
);
188 for (T term
: preferredTerms
) {
189 String label
= getLabel(term
);
191 if (term
.getTitleCache() != null) {
192 label
= term
.getTitleCache();
193 StoreUtil
.warn(getClass(), "Term does not have a representation: " + term
+ ", " + term
.getUuid());
196 StoreUtil
.warn(getClass(), "Representation Label and TitleCache empty for term: " + term
+ ", " + term
.getUuid());
205 if (selection
!= null) {
206 if (selection
.equals(term
)) {
212 if (selection
!= null && index
== 0) {
213 createTermNotInPreferredTerms(selection
);
223 * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
227 public void setEnabled(boolean enabled
) {
228 combo
.setEnabled(enabled
);
236 * @return a {@link java.util.List} object.
238 protected List
<T
> getPreferredTerms() {
239 if (customPreferredTerms
!= null) {
240 return customPreferredTerms
;
242 return getTermManager().getPreferredTerms(termClass
);
246 * May be overridden by derived classes if the desired label string does not
247 * reside in term.getLabel();
251 * @return a {@link java.lang.String} object.
253 protected String
getLabel(T term
) {
254 return term
.getLabel(CdmStore
.getDefaultLanguage());
262 private void createTermNotInPreferredTerms(T term
) {
263 List
<T
> preferredTerms
= getPreferredTerms();
265 preferredTerms
.add(term
);
267 populateTerms(preferredTerms
);
272 * addSelectionListener
276 * a {@link org.eclipse.swt.events.SelectionListener} object.
278 public void addSelectionListener(SelectionListener listener
) {
279 combo
.addSelectionListener(listener
);
284 * removeSelectionListener
288 * a {@link org.eclipse.swt.events.SelectionListener} object.
290 public void removeSelectionListener(SelectionListener listener
) {
291 combo
.removeSelectionListener(listener
);
298 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
299 * .events.SelectionEvent)
303 public void widgetSelected(SelectionEvent e
) {
304 selection
= terms
.get(combo
.getSelectionIndex());
305 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e
));
311 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
312 * PropertyChangeEvent)
316 public void propertyChange(PropertyChangeEvent event
) {
317 super.propertyChange(event
);
318 if (event
!= null && PreferencesUtil
.PREFERRED_TERMS_CHANGE
.equals(event
.getProperty())) {
319 populateTerms(getPreferredTerms());
325 public void setSelected(boolean selected
) {
326 setBackground(selected ? SELECTED
: getPersistentBackground());
331 public void widgetDisposed(DisposeEvent e
) {
332 PreferencesUtil
.getPreferenceStore().removePropertyChangeListener(this);
338 public void widgetDefaultSelected(SelectionEvent e
) {
343 public void setIrrelevant(boolean irrelevant
) {
344 String colorId
= irrelevant ? Resources
.COLOR_COMPOSITE_IRRELEVANT
: Resources
.COLOR_COMPOSITE_BACKGROUND
;
346 Color color
= StoreUtil
.getColor(colorId
);
347 combo
.setBackground(color
);
350 // /** {@inheritDoc} */
352 // public void setBackground(Color color) {
353 // if (label != null)
354 // label.setBackground(color);
360 protected TermManager
getTermManager() {
361 return CdmStore
.getTermManager();
368 public int getVisibleItemCount() {
369 return combo
.getVisibleItemCount();
376 public void setVisibleItemCount(int count
) {
377 combo
.setVisibleItemCount(count
);
382 * A {@link List} of term objects may be passed to this combo box. In this
383 * case, the default behaviour of displaying the preferred terms for the T
384 * type will be overridden and the combo will only display the given terms.
385 * Also, any previous selection will be reseted.
389 * To return to the default of displaying the preferred terms, simply pass
394 * a {@link List} of T objects or <code>null</code> for default
397 public void setTerms(List
<T
> terms
) {
399 customPreferredTerms
= terms
;
400 populateTerms(customPreferredTerms
);