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
.DisposeEvent
;
14 import org
.eclipse
.swt
.events
.DisposeListener
;
15 import org
.eclipse
.swt
.events
.SelectionEvent
;
16 import org
.eclipse
.swt
.events
.SelectionListener
;
17 import org
.eclipse
.swt
.graphics
.Color
;
18 import org
.eclipse
.swt
.widgets
.Combo
;
19 import org
.eclipse
.swt
.widgets
.Label
;
20 import org
.eclipse
.swt
.widgets
.Listener
;
22 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
23 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
24 import eu
.etaxonomy
.cdm
.model
.common
.TermType
;
25 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
26 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
27 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
28 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
29 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
30 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
31 import eu
.etaxonomy
.taxeditor
.store
.TermManager
;
32 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
33 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
34 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
35 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
36 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
37 import eu
.etaxonomy
.taxeditor
.ui
.element
.ISelectable
;
38 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
42 * Abstract AbstractTermComboElement class.
46 * @created Nov 5, 2009
50 public class VocabularyComboElement
<TERM
extends DefinedTermBase
<TERM
>, VOC
extends TermVocabulary
<TERM
>>
51 extends AbstractCdmFormElement
implements SelectionListener
,
52 DisposeListener
, IEnableableFormElement
, ISelectable
{
54 private static final int DEFAULT_VISIBLE_ITEMS
= 10;
56 private VOC selection
;
58 private VOC emptyElement
;
59 private static String EMPTY_ELEMENT_LABEL
= "";
61 protected Label label
;
62 private final Combo combo
;
64 private ArrayList
<VOC
> terms
;
66 private Comparator
<VOC
> vocComparator
;
68 private final TermType termType
;
70 public VocabularyComboElement(CdmFormFactory formFactory
,
71 ICdmFormElement parentElement
, TermType termType
, String labelString
, VOC selection
,
73 super(formFactory
, parentElement
);
75 this.termType
= termType
;
77 if (labelString
!= null) {
78 label
= formFactory
.createLabel(getLayoutComposite(), labelString
);
83 combo
= new Combo(getLayoutComposite(), SWT
.BORDER
| SWT
.READ_ONLY
);//FIXME: removed this parameter seems break windows version: | style
85 combo
.setLayoutData(LayoutConstants
.FILL_HORIZONTALLY());
86 combo
.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS
);
88 populateTerms(getVocabularies());
90 combo
.addSelectionListener(this);
91 combo
.addDisposeListener(this);
92 PreferencesUtil
.getPreferenceStore().addPropertyChangeListener(this);
94 if (selection
!= null) {
95 setSelection(selection
);
101 * Getter for the field <code>selection</code>.
104 * @return a T object.
106 public VOC
getSelection() {
111 * <p>Sets the selection of the combo to the given T object.</p>
112 * <p>Passing <code>null</code> to this method will set the selection to
113 * the empty element and effectively clear the selection</p>
116 * a T object or <code>null</code> to clear the selection
118 public void setSelection(VOC selection
) {
119 this.selection
= selection
;
121 this.selection
= selection
;
123 Listener
[] listeners
= combo
.getListeners(SWT
.Selection
);
125 for (Listener listener
: listeners
) {
126 combo
.removeListener(SWT
.Selection
, listener
);
129 if(selection
== null){
130 // set selection to the emptyElement
133 selectedIndex
= terms
.indexOf(selection
);
134 if (selectedIndex
== -1) {
135 createTermNotInPreferredTerms(selection
);
136 selectedIndex
= terms
.indexOf(selection
);
139 combo
.select(selectedIndex
);
141 for (Listener listener
: listeners
) {
142 combo
.addListener(SWT
.Selection
, listener
);
147 * Fills the combo with elements and sets up the convenience functions
148 * for selection index
150 * @param preferredTerms
152 private void populateTerms(List
<VOC
> preferredTerms
) {
156 terms
= new ArrayList
<VOC
>();
161 // Add an empty element for when nothing was selected yet
162 combo
.add(EMPTY_ELEMENT_LABEL
);
163 terms
.add(emptyElement
);
165 if (vocComparator
!= null) {
166 Collections
.sort(preferredTerms
, vocComparator
);
168 for (VOC term
: preferredTerms
) {
169 String label
= getLabel(term
);
171 if (term
.getTitleCache() != null) {
172 label
= term
.getTitleCache();
173 MessagingUtils
.warn(getClass(),
174 "Term does not have a default language representation: " + label
175 + ", " + term
.getUuid());
178 MessagingUtils
.warn(getClass(),
179 "Representation Label and TitleCache empty for term: "
180 + term
+ ", " + term
.getUuid());
189 if (selection
!= null) {
190 if (selection
.equals(term
)) {
196 if (selection
!= null && index
== 0) {
197 createTermNotInPreferredTerms(selection
);
205 * @see eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
209 public void setEnabled(boolean enabled
) {
210 combo
.setEnabled(enabled
);
214 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
217 public boolean isEnabled() {
218 return combo
.isEnabled();
226 * @return a {@link java.util.List} object.
228 protected List
<VOC
> getVocabularies(){
229 List
<TermVocabulary
<TERM
>> list
= CdmStore
.getService(IVocabularyService
.class).<TERM
>findByTermType(termType
);
230 return (List
<VOC
>) list
;
234 * May be overridden by derived classes if the desired label string does not
235 * reside in term.getLabel();
239 * @return a {@link java.lang.String} object.
241 protected String
getLabel(VOC term
) {
245 return term
.getLabel(CdmStore
.getDefaultLanguage());
254 private void createTermNotInPreferredTerms(VOC term
) {
255 List
<VOC
> preferredTerms
= getVocabularies();
257 preferredTerms
.add(term
);
259 populateTerms(preferredTerms
);
264 * addSelectionListener
268 * a {@link org.eclipse.swt.events.SelectionListener} object.
270 public void addSelectionListener(SelectionListener listener
) {
271 combo
.addSelectionListener(listener
);
276 * removeSelectionListener
280 * a {@link org.eclipse.swt.events.SelectionListener} object.
282 public void removeSelectionListener(SelectionListener listener
) {
283 combo
.removeSelectionListener(listener
);
290 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
291 * .events.SelectionEvent)
295 public void widgetSelected(SelectionEvent e
) {
296 selection
= terms
.get(combo
.getSelectionIndex());
297 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e
));
303 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
304 * PropertyChangeEvent)
308 public void propertyChange(PropertyChangeEvent event
) {
309 super.propertyChange(event
);
311 && PreferencesUtil
.PREFERRED_TERMS_CHANGE
.equals(event
313 populateTerms(getVocabularies());
319 public void setSelected(boolean selected
) {
320 setBackground(selected ? SELECTED
: getPersistentBackground());
325 public void widgetDisposed(DisposeEvent e
) {
326 PreferencesUtil
.getPreferenceStore().removePropertyChangeListener(this);
332 public void widgetDefaultSelected(SelectionEvent e
) {
337 public void setIrrelevant(boolean irrelevant
) {
338 String colorId
= irrelevant ? Resources
.COLOR_COMPOSITE_IRRELEVANT
339 : Resources
.COLOR_COMPOSITE_BACKGROUND
;
341 Color color
= StoreUtil
.getColor(colorId
);
342 combo
.setBackground(color
);
347 public void setBackground(Color color
) {
349 label
.setBackground(color
);
356 protected TermManager
getTermManager() {
357 return CdmStore
.getTermManager();
364 public int getVisibleItemCount(){
365 return combo
.getVisibleItemCount();
372 public void setVisibleItemCount(int count
){
373 combo
.setVisibleItemCount(count
);
376 public void removeEmptyElement(){
377 terms
.remove(emptyElement
);
378 combo
.remove(EMPTY_ELEMENT_LABEL
);