4 package eu
.etaxonomy
.taxeditor
.ui
.combo
;
6 import java
.util
.ArrayList
;
7 import java
.util
.Collections
;
8 import java
.util
.Comparator
;
11 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
12 import org
.eclipse
.swt
.SWT
;
13 import org
.eclipse
.swt
.events
.SelectionEvent
;
14 import org
.eclipse
.swt
.widgets
.Listener
;
16 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
17 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
18 import eu
.etaxonomy
.cdm
.model
.common
.TermType
;
19 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
20 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
21 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
22 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
23 import eu
.etaxonomy
.taxeditor
.store
.TermManager
;
24 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
25 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
26 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
30 * @created Nov 5, 2009
34 public class VocabularyComboElement
<TERM
extends DefinedTermBase
<TERM
>, VOC
extends TermVocabulary
<TERM
>>
35 extends AbstractComboElement
<VOC
> {
37 private VOC emptyElement
;
38 private static String EMPTY_ELEMENT_LABEL
= "";
40 private ArrayList
<VOC
> terms
;
42 private Comparator
<VOC
> vocComparator
;
44 private final TermType termType
;
46 public VocabularyComboElement(CdmFormFactory formFactory
,
47 ICdmFormElement parentElement
, TermType termType
, String labelString
, VOC selection
,
49 super(formFactory
, parentElement
);
51 this.termType
= termType
;
53 populateTerms(getVocabularies());
55 combo
.addSelectionListener(this);
56 combo
.addDisposeListener(this);
57 PreferencesUtil
.getPreferenceStore().addPropertyChangeListener(this);
59 if (selection
!= null) {
60 setSelection(selection
);
65 * <p>Sets the selection of the combo to the given T object.</p>
66 * <p>Passing <code>null</code> to this method will set the selection to
67 * the empty element and effectively clear the selection</p>
70 * a T object or <code>null</code> to clear the selection
73 public void setSelection(VOC selection
) {
74 this.selection
= selection
;
76 this.selection
= selection
;
78 Listener
[] listeners
= combo
.getListeners(SWT
.Selection
);
80 for (Listener listener
: listeners
) {
81 combo
.removeListener(SWT
.Selection
, listener
);
84 if(selection
== null){
85 // set selection to the emptyElement
88 selectedIndex
= terms
.indexOf(selection
);
89 if (selectedIndex
== -1) {
90 createTermNotInPreferredTerms(selection
);
91 selectedIndex
= terms
.indexOf(selection
);
94 combo
.select(selectedIndex
);
96 for (Listener listener
: listeners
) {
97 combo
.addListener(SWT
.Selection
, listener
);
102 * Fills the combo with elements and sets up the convenience functions
103 * for selection index
105 * @param preferredTerms
107 private void populateTerms(List
<VOC
> preferredTerms
) {
111 terms
= new ArrayList
<VOC
>();
116 // Add an empty element for when nothing was selected yet
117 combo
.add(EMPTY_ELEMENT_LABEL
);
118 terms
.add(emptyElement
);
120 if (vocComparator
!= null) {
121 Collections
.sort(preferredTerms
, vocComparator
);
123 for (VOC term
: preferredTerms
) {
124 String label
= getLabel(term
);
126 if (term
.getTitleCache() != null) {
127 label
= term
.getTitleCache();
128 MessagingUtils
.warn(getClass(),
129 "Term does not have a default language representation: " + label
130 + ", " + term
.getUuid());
133 MessagingUtils
.warn(getClass(),
134 "Representation Label and TitleCache empty for term: "
135 + term
+ ", " + term
.getUuid());
144 if (selection
!= null) {
145 if (selection
.equals(term
)) {
151 if (selection
!= null && index
== 0) {
152 createTermNotInPreferredTerms(selection
);
158 protected List
<VOC
> getVocabularies(){
159 List
<TermVocabulary
<TERM
>> list
= CdmStore
.getService(IVocabularyService
.class).<TERM
>findByTermType(termType
, null);
160 return (List
<VOC
>) list
;
164 * May be overridden by derived classes if the desired label string does not
165 * reside in term.getLabel();
169 * @return a {@link java.lang.String} object.
171 protected String
getLabel(VOC term
) {
175 return term
.getLabel(CdmStore
.getDefaultLanguage());
179 private void createTermNotInPreferredTerms(VOC term
) {
180 List
<VOC
> preferredTerms
= getVocabularies();
182 preferredTerms
.add(term
);
184 populateTerms(preferredTerms
);
189 public void widgetSelected(SelectionEvent e
) {
190 selection
= terms
.get(combo
.getSelectionIndex());
191 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e
));
196 public void propertyChange(PropertyChangeEvent event
) {
197 super.propertyChange(event
);
199 && PreferencesUtil
.PREFERRED_TERMS_CHANGE
.equals(event
201 populateTerms(getVocabularies());
205 protected TermManager
getTermManager() {
206 return CdmStore
.getTermManager();
209 public int getVisibleItemCount(){
210 return combo
.getVisibleItemCount();
213 public void removeEmptyElement(){
214 terms
.remove(emptyElement
);
215 combo
.remove(EMPTY_ELEMENT_LABEL
);