From a49946db7d85a502f6c4125d0c22783ccc51152d Mon Sep 17 00:00:00 2001 From: Patric Plitzner Date: Mon, 27 Apr 2015 09:35:04 +0000 Subject: [PATCH] - imlemente vocabulary combo selection element (#4448) --- .gitattributes | 1 + .../ui/combo/VocabularyComboElement.java | 381 ++++++++++++++++++ 2 files changed, 382 insertions(+) create mode 100644 eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/VocabularyComboElement.java diff --git a/.gitattributes b/.gitattributes index 1f9d15e6b..8799c507c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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/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 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 index 000000000..6ee853a8c --- /dev/null +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/combo/VocabularyComboElement.java @@ -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; + +/** + *

+ * Abstract AbstractTermComboElement class. + *

+ * + * @author n.hoffmann + * @created Nov 5, 2009 + * @version 1.0 + * @param + */ +public class VocabularyComboElement> + 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 terms; + + private Comparator vocComparator; + + private final Class vocClass; + + public VocabularyComboElement(CdmFormFactory formFactory, + ICdmFormElement parentElement, Class termClass, String labelString, VOC selection, + int style) { + super(formFactory, parentElement); + + if(termClass!=null){ + this.vocClass = termClass; + } + else{ + this.vocClass = (Class) 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); + } + } + + /** + *

+ * Getter for the field selection. + *

+ * + * @return a T object. + */ + public VOC getSelection() { + return selection; + } + + /** + *

Sets the selection of the combo to the given T object.

+ *

Passing null to this method will set the selection to + * the empty element and effectively clear the selection

+ * + * @param selection + * a T object or null 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 preferredTerms) { + + combo.removeAll(); + + terms = new ArrayList(); + + 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(); + } + + /** + *

+ * preferredTerms + *

+ * + * @return a {@link java.util.List} object. + */ + protected List 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 preferredTerms = getVocabularies(); + + preferredTerms.add(term); + + populateTerms(preferredTerms); + } + + /** + *

+ * addSelectionListener + *

+ * + * @param listener + * a {@link org.eclipse.swt.events.SelectionListener} object. + */ + public void addSelectionListener(SelectionListener listener) { + combo.addSelectionListener(listener); + } + + /** + *

+ * removeSelectionListener + *

+ * + * @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); + } + +} -- 2.34.1