-/**
- *
- */
-package eu.etaxonomy.taxeditor.ui.combo;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-
-import eu.etaxonomy.cdm.model.common.DefinedTerm;
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.cdm.model.common.TermType;
-import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
-import eu.etaxonomy.taxeditor.preference.Resources;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
-import eu.etaxonomy.taxeditor.store.TermManager;
-import eu.etaxonomy.taxeditor.ui.campanula.compatibility.ICdmFormElement;
-import eu.etaxonomy.taxeditor.ui.element.AbstractCdmFormElement;
-import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
-import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
-import eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement;
-import eu.etaxonomy.taxeditor.ui.element.ISelectable;
-import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
-
-/**
- * <p>
- * Abstract AbstractTermComboElement class.
- * </p>
- *
- * @author n.hoffmann
- * @created Nov 5, 2009
- * @version 1.0
- * @param <T>
- */
-public class TermComboElement<T extends DefinedTermBase>
- extends AbstractCdmFormElement implements SelectionListener,
- DisposeListener, IEnableableFormElement, ISelectable {
-
- private static final int DEFAULT_VISIBLE_ITEMS = 10;
-
- private T selection;
-
- private T emptyElement;
- private static String EMPTY_ELEMENT_LABEL = "";
-
- protected Label label;
- private Combo combo;
-
- private ArrayList<T> terms;
-
- private Comparator<T> termComparator;
-
- private Class<T> termClass;
-
- private List<T> customPreferredTerms;
-
- /**
- * <p>
- * Constructor for AbstractTermComboElement.
- * </p>
- *
- * @param parentElement
- * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
- * object.
- * @param style
- * a int.
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param labelString
- * a {@link java.lang.String} object.
- * @param selection
- * a T object.
- * @param visibleItems
- * a int.
- * @param <T>
- * a T object.
- */
- public TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, TermType termType, String labelString, T selection,
- int style) {
- super(formFactory, parentElement);
-
- this.termClass = (Class<T>) DefinedTerm.class;
-
- if (labelString != null) {
- label = formFactory.createLabel(getLayoutComposite(), labelString);
- addControl(label);
- }
-
- // create combo
- combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
- addControl(combo);
- combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
- combo.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
-
- populateTerms(filterDefinedTermByTermType(getPreferredTerms(), termType));
-
- combo.addSelectionListener(this);
- combo.addDisposeListener(this);
- PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
-
- if (selection != null) {
- setSelection(selection);
- }
- }
-
- /**
- * <p>
- * Constructor for AbstractTermComboElement.
- * </p>
- *
- * @param parentElement
- * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
- * object.
- * @param style
- * a int.
- * @param formFactory
- * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
- * object.
- * @param labelString
- * a {@link java.lang.String} object.
- * @param selection
- * a T object.
- * @param visibleItems
- * a int.
- * @param <T>
- * a T object.
- */
- public TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, Class<T> termClass, String labelString, T selection,
- int style) {
- super(formFactory, parentElement);
-
- this.termClass = termClass;
-
- if (labelString != null) {
- label = formFactory.createLabel(getLayoutComposite(), labelString);
- addControl(label);
- }
-
- // create combo
- combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY);
- addControl(combo);
- combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
- combo.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
-
- populateTerms(getPreferredTerms());
-
- combo.addSelectionListener(this);
- combo.addDisposeListener(this);
- PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
-
- if (selection != null) {
- setSelection(selection);
- }
- }
-
- /**
- * <p>
- * Getter for the field <code>selection</code>.
- * </p>
- *
- * @return a T object.
- */
- public T getSelection() {
- return selection;
- }
-
- /**
- * <p>Sets the selection of the combo to the given T object.</p>
- * <p>Passing <code>null</code> to this method will set the selection to
- * the empty element and effectively clear the selection</p>
- *
- * @param selection
- * a T object or <code>null</code> to clear the selection
- */
- public void setSelection(T selection) {
- this.selection = selection;
-
- this.selection = selection;
-
- Listener[] listeners = combo.getListeners(SWT.Selection);
-
- for (Listener listener : listeners) {
- combo.removeListener(SWT.Selection, listener);
- }
- int selectedIndex;
- if(selection == null){
- // set selection to the emptyElement
- selectedIndex = 0;
- }else{
- selectedIndex = terms.indexOf(selection);
- if (selectedIndex == -1) {
- createTermNotInPreferredTerms(selection);
- selectedIndex = terms.indexOf(selection);
- }
- }
- combo.select(selectedIndex);
-
- for (Listener listener : listeners) {
- combo.addListener(SWT.Selection, listener);
- }
- }
-
- /**
- * Fills the combo with elements and sets up the convenience functions
- * for selection index
- *
- * @param preferredTerms
- */
- private void populateTerms(List<T> preferredTerms) {
-
- combo.removeAll();
-
- terms = new ArrayList<T>();
-
- int i = 1;
- int index = 0;
-
- // Add an empty element for when nothing was selected yet
- combo.add(EMPTY_ELEMENT_LABEL);
- terms.add(emptyElement);
-
- if (termComparator != null) {
- Collections.sort(preferredTerms, termComparator);
- }
- for (T term : preferredTerms) {
- String label = getLabel(term);
- if (label == null) {
- if (term.getTitleCache() != null) {
- label = term.getTitleCache();
- StoreUtil.warn(getClass(),
- "Term does not have a representation: " + term
- + ", " + term.getUuid());
- } else {
- label = "Unknown";
- StoreUtil.warn(getClass(),
- "Representation Label and TitleCache empty for term: "
- + term + ", " + term.getUuid());
- }
-
- }
-
- combo.add(label);
- terms.add(term);
-
- i++;
- if (selection != null) {
- if (selection.equals(term)) {
- index = i;
- }
- }
- }
-
- if (selection != null && index == 0) {
- createTermNotInPreferredTerms(selection);
- }
-
- combo.select(index);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
- */
- /** {@inheritDoc} */
- public void setEnabled(boolean enabled) {
- combo.setEnabled(enabled);
- }
-
- /**
- * <p>
- * preferredTerms
- * </p>
- *
- * @return a {@link java.util.List} object.
- */
- protected List<T> getPreferredTerms(){
- if (customPreferredTerms != null){
- return customPreferredTerms;
- }
- return getTermManager().getPreferredTerms(termClass);
- }
-
- /**
- * May be overridden by derived classes if the desired label string does not
- * reside in term.getLabel();
- *
- * @param term
- * a T object.
- * @return a {@link java.lang.String} object.
- */
- protected String getLabel(T term) {
- return term.getLabel(CdmStore.getDefaultLanguage());
- }
-
- /**
- *
- *
- * @param term
- */
- private void createTermNotInPreferredTerms(T term) {
- List<T> preferredTerms = getPreferredTerms();
-
- preferredTerms.add(term);
-
- populateTerms(preferredTerms);
- }
-
- /**
- * <p>
- * addSelectionListener
- * </p>
- *
- * @param listener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- */
- public void addSelectionListener(SelectionListener listener) {
- combo.addSelectionListener(listener);
- }
-
- /**
- * <p>
- * removeSelectionListener
- * </p>
- *
- * @param listener
- * a {@link org.eclipse.swt.events.SelectionListener} object.
- */
- public void removeSelectionListener(SelectionListener listener) {
- combo.removeSelectionListener(listener);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
- * .events.SelectionEvent)
- */
- /** {@inheritDoc} */
- public void widgetSelected(SelectionEvent e) {
- selection = terms.get(combo.getSelectionIndex());
- firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
- * PropertyChangeEvent)
- */
- /** {@inheritDoc} */
- public void propertyChange(PropertyChangeEvent event) {
- super.propertyChange(event);
- if (event != null
- && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event
- .getProperty())) {
- populateTerms(getPreferredTerms());
- }
- }
-
- /** {@inheritDoc} */
- public void setSelected(boolean selected) {
- setBackground(selected ? SELECTED : getPersistentBackground());
- }
-
- /** {@inheritDoc} */
- public void widgetDisposed(DisposeEvent e) {
- PreferencesUtil.getPreferenceStore().removePropertyChangeListener(this);
- }
-
- // not used
- /** {@inheritDoc} */
- public void widgetDefaultSelected(SelectionEvent e) {
- }
-
- /** {@inheritDoc} */
- public void setIrrelevant(boolean irrelevant) {
- String colorId = irrelevant ? Resources.COLOR_COMPOSITE_IRRELEVANT
- : Resources.COLOR_COMPOSITE_BACKGROUND;
-
- Color color = StoreUtil.getColor(colorId);
- combo.setBackground(color);
- }
-
- /** {@inheritDoc} */
- @Override
- public void setBackground(Color color) {
- if (label != null)
- label.setBackground(color);
- }
-
- /**
- *
- */
- protected TermManager getTermManager() {
- return CdmStore.getTermManager();
- }
-
- /**
- *
- * @return
- */
- public int getVisibleItemCount(){
- return combo.getVisibleItemCount();
- }
-
- /**
- *
- * @param count
- */
- public void setVisibleItemCount(int count){
- combo.setVisibleItemCount(count);
- }
-
- /**
- * <p>A {@link List} of term objects may be passed to this combo box. In this case, the default behaviour
- * of displaying the preferred terms for the T type will be overridden and the combo will only display the
- * given terms. Also, any previous selection will be reseted.</p>
- *
- * <p>To return to the default of displaying the preferred terms, simply pass <code>null</code>.</p>
- *
- * @param terms a {@link List} of T objects or <code>null</code> for default preferred terms
- */
- public void setTerms(List<T> terms) {
- setSelection(null);
- customPreferredTerms = terms;
- populateTerms(customPreferredTerms);
- }
-
- private List<T> filterDefinedTermByTermType(List<T> terms, TermType termType) {
- List<T> definedTerms = new ArrayList<T>();
- for(T term : terms){
- if(term.getTermType().equals(termType)) {
- definedTerms.add(term);
- }
- }
- return definedTerms;
- }
-}
+/**\r
+ *\r
+ */\r
+package eu.etaxonomy.taxeditor.ui.combo;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.eclipse.jface.util.PropertyChangeEvent;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.widgets.Listener;\r
+\r
+import eu.etaxonomy.cdm.model.term.DefinedTermBase;\r
+import eu.etaxonomy.cdm.model.term.TermType;\r
+import eu.etaxonomy.cdm.model.term.TermVocabulary;\r
+import eu.etaxonomy.taxeditor.model.MessagingUtils;\r
+import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;\r
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;\r
+import eu.etaxonomy.taxeditor.store.CdmStore;\r
+import eu.etaxonomy.taxeditor.store.TermManager;\r
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;\r
+import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;\r
+import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;\r
+\r
+/**\r
+ * @author n.hoffmann\r
+ * @created Nov 5, 2009\r
+ * @version 1.0\r
+ * @param <T>\r
+ */\r
+public class TermComboElement<T extends DefinedTermBase>\r
+ extends AbstractComboElement<T> {\r
+\r
+ private T emptyElement;\r
+ private static String EMPTY_ELEMENT_LABEL = "";\r
+\r
+ private ArrayList<T> terms;\r
+\r
+ private Comparator<T> termComparator;\r
+\r
+ public Comparator<T> getTermComparator() {\r
+ return termComparator;\r
+ }\r
+\r
+ public void setTermComparator(Comparator<T> termComparator) {\r
+ this.termComparator = termComparator;\r
+ List<T> termsWithoutNull = terms.subList(1, terms.size());\r
+\r
+ populateTerms(termsWithoutNull);\r
+\r
+ }\r
+\r
+ private final TermType termType;\r
+ private final TermVocabulary termVocabulary;\r
+ private final Class<T> termClass;\r
+\r
+ private List<T> customPreferredTerms;\r
+\r
+ private boolean useAbbrevLabel = false;\r
+ private boolean addEmptyElement;\r
+\r
+ public TermComboElement(CdmFormFactory formFactory,\r
+ ICdmFormElement parentElement, TermType termType, String labelString, T selection, boolean addEmptyElement,\r
+ int style, boolean useAbbrevLabel, Comparator<T> comparator) {\r
+ this(formFactory, parentElement, null, termType, null, null, labelString, selection, addEmptyElement, style, useAbbrevLabel, comparator);\r
+ }\r
+\r
+ public TermComboElement(CdmFormFactory formFactory,\r
+ ICdmFormElement parentElement, TermVocabulary<?> termVocabulary, String labelString, T selection, boolean addEmptyElement,\r
+ int style, boolean useAbbrevLabel, Comparator<T> comparator) {\r
+ this(formFactory, parentElement, null, null, termVocabulary, null,labelString, selection, addEmptyElement, style, useAbbrevLabel, comparator);\r
+ }\r
+\r
+ public TermComboElement(CdmFormFactory formFactory,\r
+ ICdmFormElement parentElement, Class<T> termClass, String labelString, T selection, boolean addEmptyElement,\r
+ int style) {\r
+ this(formFactory, parentElement, termClass, null, null, null, labelString, selection, addEmptyElement, style, false, null);\r
+ }\r
+ public TermComboElement(CdmFormFactory formFactory,\r
+ ICdmFormElement parentElement, Class<T> termClass, String labelString, T selection, boolean addEmptyElement,\r
+ int style, boolean useAbbrevLabel) {\r
+ this(formFactory, parentElement, termClass, null, null, null,labelString, selection, addEmptyElement, style, useAbbrevLabel, null);\r
+\r
+ }\r
+\r
+ public TermComboElement(CdmFormFactory formFactory,\r
+ ICdmFormElement parentElement, List<T> terms, String labelString, T selection, boolean addEmptyElement,\r
+ int style, boolean useAbbrevLabel) {\r
+ this(formFactory, parentElement, null, null, null, terms,labelString, selection, addEmptyElement, style, useAbbrevLabel, null);\r
+\r
+ }\r
+\r
+ private TermComboElement(CdmFormFactory formFactory,\r
+ ICdmFormElement parentElement, Class<T> termClass, TermType termType, TermVocabulary<?> termVocabulary, List<T> terms,String labelString, T selection, boolean addEmptyElement,\r
+ int style, boolean useAbbrevLabel, Comparator<T> comparator) {\r
+ super(formFactory, parentElement);\r
+\r
+ this.termType = termType;\r
+ this.termVocabulary = termVocabulary;\r
+ this.termClass = termClass;\r
+ this.addEmptyElement = addEmptyElement;\r
+ this.useAbbrevLabel = useAbbrevLabel;\r
+ this.termComparator = comparator;\r
+ if (labelString != null) {\r
+ label.setText(labelString);\r
+ }\r
+ this.selection = selection;\r
+\r
+ if(termType!=null){\r
+ //TODO try to remove generic T and avoid classes to be used\r
+ populateTerms((List<T>) getTermManager().getPreferredTerms(termType));\r
+ }\r
+ else if(termVocabulary!=null){\r
+ populateTerms((List<T>) getTermManager().getPreferredTerms(termVocabulary));\r
+ }\r
+ else if(this.termClass!=null){\r
+ populateTerms(getPreferredTerms());\r
+ }else if (terms != null){\r
+ populateTerms(terms);\r
+ }\r
+\r
+ combo.addSelectionListener(this);\r
+ combo.addDisposeListener(this);\r
+ PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);\r
+\r
+ if (selection != null) {\r
+ setSelection(selection);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * <p>Sets the selection of the combo to the given T object.</p>\r
+ * <p>Passing <code>null</code> to this method will set the selection to\r
+ * the empty element and effectively clear the selection</p>\r
+ *\r
+ * @param selection\r
+ * a T object or <code>null</code> to clear the selection\r
+ */\r
+ @Override\r
+ public void setSelection(T selection) {\r
+ this.selection = selection;\r
+\r
+ Listener[] listeners = combo.getListeners(SWT.Selection);\r
+\r
+ for (Listener listener : listeners) {\r
+ combo.removeListener(SWT.Selection, listener);\r
+ }\r
+ int selectedIndex;\r
+ if(selection == null){\r
+ // set selection to the emptyElement\r
+ selectedIndex = 0;\r
+ }else{\r
+ selectedIndex = terms.indexOf(selection);\r
+ if (selectedIndex == -1) {\r
+ createTermNotInPreferredTerms(selection, this.terms);\r
+ selectedIndex = terms.indexOf(selection);\r
+ }\r
+ }\r
+ combo.select(selectedIndex);\r
+\r
+ for (Listener listener : listeners) {\r
+ combo.addListener(SWT.Selection, listener);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Fills the combo with elements and sets up the convenience functions\r
+ * for selection index\r
+ *\r
+ * @param preferredTerms\r
+ */\r
+ protected void populateTerms(List<T> preferredTerms) {\r
+\r
+ combo.removeAll();\r
+\r
+ terms = new ArrayList<T>();\r
+\r
+ int i = 1;\r
+ int index = 0;\r
+\r
+ if(addEmptyElement){\r
+ // Add an empty element for when nothing was selected yet\r
+ combo.add(EMPTY_ELEMENT_LABEL);\r
+ terms.add(emptyElement);\r
+ }\r
+\r
+ if (termComparator != null) {\r
+ Collections.sort(preferredTerms, termComparator);\r
+ }\r
+ for (T term : preferredTerms) {\r
+ String label = getLabel(term);\r
+ if (label == null) {\r
+ if (term.getTitleCache() != null) {\r
+ label = term.getTitleCache();\r
+ MessagingUtils.warn(getClass(),\r
+ "Term does not have a default language representation: " + label\r
+ + ", " + term.getUuid());\r
+ } else {\r
+ label = "Unknown";\r
+ MessagingUtils.warn(getClass(),\r
+ "Representation Label and TitleCache empty for term: "\r
+ + term + ", " + term.getUuid());\r
+ }\r
+\r
+ }\r
+\r
+ combo.add(label);\r
+ terms.add(term);\r
+\r
+ i++;\r
+ if (selection != null) {\r
+ if (selection.equals(term)) {\r
+ index = i;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (selection != null && index == 0) {\r
+ createTermNotInPreferredTerms(selection, preferredTerms);\r
+ }\r
+\r
+ combo.select(index);\r
+\r
+ }\r
+\r
+ protected List<T> getPreferredTerms(){\r
+ List<T> preferredTerms = new ArrayList<T>();\r
+ if (customPreferredTerms != null){\r
+ return customPreferredTerms;\r
+ }\r
+ else if(termType!=null){\r
+ preferredTerms = getTermManager().getPreferredTerms(termType);\r
+ }\r
+ else if(termVocabulary!=null){\r
+ preferredTerms = getTermManager().getPreferredTerms(termVocabulary);\r
+ }\r
+ if(termClass!=null){\r
+ preferredTerms = getTermManager().getPreferredTerms(termClass);\r
+ }\r
+ return preferredTerms;\r
+ }\r
+\r
+ /**\r
+ * May be overridden by derived classes if the desired label string does not\r
+ * reside in term.getLabel();\r
+ *\r
+ * @param term\r
+ * a T object.\r
+ * @return a {@link java.lang.String} object.\r
+ */\r
+ protected String getLabel(T term) {\r
+ if (term == null){\r
+ return "";\r
+ }else{\r
+ String termLabel = null;\r
+ if (useAbbrevLabel){\r
+ if (!StringUtils.isBlank(term.getIdInVocabulary())){\r
+ termLabel = term.getIdInVocabulary();\r
+ }\r
+ }\r
+ if (termLabel == null){\r
+ termLabel = term.getLabel(CdmStore.getDefaultLanguage());\r
+ }\r
+ if (termLabel == null){\r
+ termLabel = term.getLabel();\r
+ }\r
+ if(PreferencesUtil.getBooleanValue(IPreferenceKeys.SHOW_VOCABULARY_ID_FOR_TERM_LABELS)\r
+ && term.getVocabulary()!=null){\r
+ String vocLabel = term.getVocabulary().getLabel(CdmStore.getDefaultLanguage());\r
+ if (vocLabel == null){\r
+ vocLabel = term.getVocabulary().getLabel();\r
+ }\r
+ termLabel += " ["+vocLabel+"]";\r
+ }\r
+ return termLabel;\r
+ }\r
+ }\r
+\r
+ /**\r
+ *\r
+ *\r
+ * @param term\r
+ */\r
+ private void createTermNotInPreferredTerms(T term, List<T> preferredTerms) {\r
+ //List<T> preferredTerms = getPreferredTerms();\r
+\r
+ preferredTerms.add(term);\r
+\r
+ populateTerms(preferredTerms);\r
+ }\r
+\r
+ /** {@inheritDoc} */\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ selection = terms.get(combo.getSelectionIndex());\r
+ firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));\r
+ }\r
+\r
+ /** {@inheritDoc} */\r
+ @Override\r
+ public void propertyChange(PropertyChangeEvent event) {\r
+ super.propertyChange(event);\r
+ T selection = this.selection;\r
+ if (event != null\r
+ && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event\r
+ .getProperty())) {\r
+ populateTerms(getPreferredTerms());\r
+ }\r
+ this.setSelection(selection);\r
+ }\r
+\r
+ protected TermManager getTermManager() {\r
+ return CdmStore.getTermManager();\r
+ }\r
+\r
+ public int getVisibleItemCount(){\r
+ return combo.getVisibleItemCount();\r
+ }\r
+\r
+ /**\r
+ * <p>A {@link List} of term objects may be passed to this combo box. In this case, the default behaviour\r
+ * of displaying the preferred terms for the T type will be overridden and the combo will only display the\r
+ * given terms. Also, any previous selection will be reseted.</p>\r
+ *\r
+ * <p>To return to the default of displaying the preferred terms, simply pass <code>null</code>.</p>\r
+ *\r
+ * @param terms a {@link List} of T objects or <code>null</code> for default preferred terms\r
+ */\r
+ public void setTerms(List<T> terms) {\r
+ setSelection(null);\r
+ customPreferredTerms = terms;\r
+ populateTerms(customPreferredTerms);\r
+ }\r
+\r
+ public void removeEmptyElement(){\r
+ if(addEmptyElement){\r
+ if(terms.contains(emptyElement)){\r
+ terms.remove(emptyElement);\r
+ }\r
+ if(Arrays.asList(combo.getItems()).contains(EMPTY_ELEMENT_LABEL)){\r
+ combo.remove(EMPTY_ELEMENT_LABEL);\r
+ }\r
+ }\r
+ }\r
+\r
+}\r