- imlemente vocabulary combo selection element (#4448)
authorPatric Plitzner <p.plitzner@bgbm.org>
Mon, 27 Apr 2015 09:35:04 +0000 (09:35 +0000)
committerPatric Plitzner <p.plitzner@bgbm.org>
Mon, 27 Apr 2015 09:35:04 +0000 (09:35 +0000)
.gitattributes
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/VocabularyComboElement.java [new file with mode: 0644]

index 1f9d15e6b51bd5270cb877cca70ed1152060497a..8799c507cefaa058072d472974946c790a9f7041 100644 (file)
@@ -1419,6 +1419,7 @@ eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/internal
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/bar/AuthenticatedUserBar.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/EnumComboElement.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermComboElement.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/bar/AuthenticatedUserBar.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/EnumComboElement.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/TermComboElement.java -text
+eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/VocabularyComboElement.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/DefaultLanguageDialog.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/LoginDialog.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/UriDialog.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/DefaultLanguageDialog.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/LoginDialog.java -text
 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/UriDialog.java -text
diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/VocabularyComboElement.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/VocabularyComboElement.java
new file mode 100644 (file)
index 0000000..6ee853a
--- /dev/null
@@ -0,0 +1,381 @@
+/**
+ *
+ */
+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.api.service.IVocabularyService;
+import eu.etaxonomy.cdm.model.common.DefinedTermBase;
+import eu.etaxonomy.cdm.model.common.TermVocabulary;
+import eu.etaxonomy.taxeditor.model.MessagingUtils;
+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.element.AbstractCdmFormElement;
+import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
+import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
+import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
+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 <VOC>
+ */
+public class VocabularyComboElement<VOC extends TermVocabulary<DefinedTermBase>>
+               extends AbstractCdmFormElement implements SelectionListener,
+               DisposeListener, IEnableableFormElement, ISelectable {
+
+       private static final int DEFAULT_VISIBLE_ITEMS = 10;
+
+       private VOC selection;
+
+       private VOC emptyElement;
+       private static String EMPTY_ELEMENT_LABEL = "";
+
+       protected Label label;
+       private final Combo combo;
+
+       private ArrayList<VOC> terms;
+
+       private Comparator<VOC> vocComparator;
+
+       private final Class<VOC> vocClass;
+
+       public VocabularyComboElement(CdmFormFactory formFactory,
+               ICdmFormElement parentElement, Class<VOC> termClass, String labelString, VOC selection,
+               int style) {
+        super(formFactory, parentElement);
+
+        if(termClass!=null){
+            this.vocClass = termClass;
+        }
+        else{
+            this.vocClass =  (Class<VOC>) TermVocabulary.class;
+        }
+
+        if (labelString != null) {
+            label = formFactory.createLabel(getLayoutComposite(), labelString);
+            addControl(label);
+        }
+
+        // create combo
+        combo = new Combo(getLayoutComposite(), SWT.BORDER | SWT.READ_ONLY );//FIXME: removed this parameter seems break windows version: | style
+        addControl(combo);
+        combo.setLayoutData(LayoutConstants.FILL_HORIZONTALLY());
+        combo.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS);
+
+        if(this.vocClass!=null){
+            populateTerms(getVocabularies());
+        }
+
+        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 VOC 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(VOC 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<VOC> preferredTerms) {
+
+               combo.removeAll();
+
+               terms = new ArrayList<VOC>();
+
+               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 (vocComparator != null) {
+                       Collections.sort(preferredTerms, vocComparator);
+               }
+               for (VOC 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);
+       }
+
+       /*
+        * (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
+        */
+       /** {@inheritDoc} */
+       @Override
+    public void setEnabled(boolean enabled) {
+               combo.setEnabled(enabled);
+       }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
+        */
+       @Override
+       public boolean isEnabled() {
+           return combo.isEnabled();
+       }
+
+       /**
+        * <p>
+        * preferredTerms
+        * </p>
+        *
+        * @return a {@link java.util.List} object.
+        */
+       protected List<VOC> getVocabularies(){
+               return CdmStore.getService(IVocabularyService.class).list(vocClass, null, null, null, null);
+       }
+
+       /**
+        * 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(VOC term) {
+               if (term == null){
+                       return "";
+               }else{
+                       return term.getLabel(CdmStore.getDefaultLanguage());
+               }
+       }
+
+       /**
+        *
+        *
+        * @param term
+        */
+       private void createTermNotInPreferredTerms(VOC term) {
+               List<VOC> preferredTerms = getVocabularies();
+
+               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} */
+       @Override
+    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} */
+       @Override
+    public void propertyChange(PropertyChangeEvent event) {
+               super.propertyChange(event);
+               if (event != null
+                               && PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event
+                                               .getProperty())) {
+                       populateTerms(getVocabularies());
+               }
+       }
+
+       /** {@inheritDoc} */
+       @Override
+    public void setSelected(boolean selected) {
+               setBackground(selected ? SELECTED : getPersistentBackground());
+       }
+
+       /** {@inheritDoc} */
+       @Override
+    public void widgetDisposed(DisposeEvent e) {
+               PreferencesUtil.getPreferenceStore().removePropertyChangeListener(this);
+       }
+
+       // not used
+       /** {@inheritDoc} */
+       @Override
+    public void widgetDefaultSelected(SelectionEvent e) {
+       }
+
+       /** {@inheritDoc} */
+       @Override
+    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);
+       }
+
+}