Merge branch 'release/5.8.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / combo / TermComboElement.java
index 663792a260fc2669dcdd70d40c91f6186e46d1f5..a4ac4ec2ac5d255d39ce7c2806b10a29169c304e 100644 (file)
-/**
- * 
- */
-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