-/**
- *
- */
-package eu.etaxonomy.taxeditor.ui.combo;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-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.SelectionEvent;
-import org.eclipse.swt.widgets.Listener;
-
-import eu.etaxonomy.cdm.model.term.DefinedTermBase;
-import eu.etaxonomy.cdm.model.term.TermType;
-import eu.etaxonomy.cdm.model.term.TermVocabulary;
-import eu.etaxonomy.taxeditor.model.MessagingUtils;
-import eu.etaxonomy.taxeditor.preference.IPreferenceKeys;
-import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
-import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.store.TermManager;
-import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
-import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
-import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
-
-/**
- * @author n.hoffmann
- * @created Nov 5, 2009
- * @version 1.0
- * @param <T>
- */
-public class TermComboElement<T extends DefinedTermBase>
- extends AbstractComboElement<T> {
-
- private T emptyElement;
- private static String EMPTY_ELEMENT_LABEL = "";
-
- private ArrayList<T> terms;
-
- private Comparator<T> termComparator;
-
- public Comparator<T> getTermComparator() {
- return termComparator;
- }
-
- public void setTermComparator(Comparator<T> termComparator) {
- this.termComparator = termComparator;
- List<T> termsWithoutNull = terms.subList(1, terms.size());
-
- populateTerms(termsWithoutNull);
-
- }
-
- private final TermType termType;
- private final TermVocabulary termVocabulary;
- private final Class<T> termClass;
-
- private List<T> customPreferredTerms;
-
- private boolean useAbbrevLabel = false;
- private boolean addEmptyElement;
-
- public TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, TermType termType, String labelString, T selection, boolean addEmptyElement,
- int style, boolean useAbbrevLabel, Comparator<T> comparator) {
- this(formFactory, parentElement, null, termType, null, null, labelString, selection, addEmptyElement, style, useAbbrevLabel, comparator);
- }
-
- public TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, TermVocabulary<?> termVocabulary, String labelString, T selection, boolean addEmptyElement,
- int style, boolean useAbbrevLabel, Comparator<T> comparator) {
- this(formFactory, parentElement, null, null, termVocabulary, null,labelString, selection, addEmptyElement, style, useAbbrevLabel, comparator);
- }
-
- public TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, Class<T> termClass, String labelString, T selection, boolean addEmptyElement,
- int style) {
- this(formFactory, parentElement, termClass, null, null, null, labelString, selection, addEmptyElement, style, false, null);
- }
- public TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, Class<T> termClass, String labelString, T selection, boolean addEmptyElement,
- int style, boolean useAbbrevLabel) {
- this(formFactory, parentElement, termClass, null, null, null,labelString, selection, addEmptyElement, style, useAbbrevLabel, null);
-
- }
-
- public TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, List<T> terms, String labelString, T selection, boolean addEmptyElement,
- int style, boolean useAbbrevLabel) {
- this(formFactory, parentElement, null, null, null, terms,labelString, selection, addEmptyElement, style, useAbbrevLabel, null);
-
- }
-
- private TermComboElement(CdmFormFactory formFactory,
- ICdmFormElement parentElement, Class<T> termClass, TermType termType, TermVocabulary<?> termVocabulary, List<T> terms,String labelString, T selection, boolean addEmptyElement,
- int style, boolean useAbbrevLabel, Comparator<T> comparator) {
- super(formFactory, parentElement);
-
- this.termType = termType;
- this.termVocabulary = termVocabulary;
- this.termClass = termClass;
- this.addEmptyElement = addEmptyElement;
- this.useAbbrevLabel = useAbbrevLabel;
- this.termComparator = comparator;
- if (labelString != null) {
- label.setText(labelString);
- }
-
- if(termType!=null){
- //TODO try to remove generic T and avoid classes to be used
- populateTerms((List<T>) getTermManager().getPreferredTerms(termType));
- }
- else if(termVocabulary!=null){
- populateTerms((List<T>) getTermManager().getPreferredTerms(termVocabulary));
- }
- else if(this.termClass!=null){
- populateTerms(getPreferredTerms());
- }else if (terms != null){
- populateTerms(terms);
- }
-
- combo.addSelectionListener(this);
- combo.addDisposeListener(this);
- PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
-
- if (selection != null) {
- setSelection(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
- */
- @Override
- public void setSelection(T 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
- */
- protected void populateTerms(List<T> preferredTerms) {
-
- combo.removeAll();
-
- terms = new ArrayList<T>();
-
- int i = 1;
- int index = 0;
-
- if(addEmptyElement){
- // 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();
- MessagingUtils.warn(getClass(),
- "Term does not have a default language representation: " + label
- + ", " + term.getUuid());
- } else {
- label = "Unknown";
- MessagingUtils.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);
-
- }
-
- protected List<T> getPreferredTerms(){
- List<T> preferredTerms = new ArrayList<T>();
- if (customPreferredTerms != null){
- return customPreferredTerms;
- }
- else if(termType!=null){
- preferredTerms = getTermManager().getPreferredTerms(termType);
- }
- else if(termVocabulary!=null){
- preferredTerms = getTermManager().getPreferredTerms(termVocabulary);
- }
- if(termClass!=null){
- preferredTerms = getTermManager().getPreferredTerms(termClass);
- }
- return preferredTerms;
- }
-
- /**
- * 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) {
- if (term == null){
- return "";
- }else{
- String termLabel = null;
- if (useAbbrevLabel){
- termLabel = term.getIdInVocabulary();
- }else{
- termLabel = term.getLabel(CdmStore.getDefaultLanguage());
- }
- if (termLabel == null){
- termLabel = term.getLabel();
- }
- if(PreferencesUtil.getBooleanValue(IPreferenceKeys.SHOW_VOCABULARY_ID_FOR_TERM_LABELS)
- && term.getVocabulary()!=null){
- String vocLabel = term.getVocabulary().getLabel(CdmStore.getDefaultLanguage());
- if (vocLabel == null){
- vocLabel = term.getVocabulary().getLabel();
- }
- termLabel += " ["+vocLabel+"]";
- }
- return termLabel;
- }
- }
-
- /**
- *
- *
- * @param term
- */
- private void createTermNotInPreferredTerms(T term) {
- List<T> preferredTerms = getPreferredTerms();
-
- preferredTerms.add(term);
-
- populateTerms(preferredTerms);
- }
-
- /** {@inheritDoc} */
- @Override
- public void widgetSelected(SelectionEvent e) {
- selection = terms.get(combo.getSelectionIndex());
- firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e));
- }
-
- /** {@inheritDoc} */
- @Override
- public void propertyChange(PropertyChangeEvent event) {
- super.propertyChange(event);
- if (event != null
- && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event
- .getProperty())) {
- populateTerms(getPreferredTerms());
- }
- }
-
- protected TermManager getTermManager() {
- return CdmStore.getTermManager();
- }
-
- public int getVisibleItemCount(){
- return combo.getVisibleItemCount();
- }
-
- /**
- * <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);
- }
-
- public void removeEmptyElement(){
- if(addEmptyElement){
- if(terms.contains(emptyElement)){
- terms.remove(emptyElement);
- }
- if(Arrays.asList(combo.getItems()).contains(EMPTY_ELEMENT_LABEL)){
- combo.remove(EMPTY_ELEMENT_LABEL);
- }
- }
- }
-
-}
+/**\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