4 package eu
.etaxonomy
.taxeditor
.ui
.combo
;
6 import java
.util
.ArrayList
;
7 import java
.util
.Arrays
;
8 import java
.util
.Collections
;
9 import java
.util
.Comparator
;
10 import java
.util
.List
;
12 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
13 import org
.eclipse
.jface
.viewers
.ComboViewer
;
14 import org
.eclipse
.swt
.SWT
;
15 import org
.eclipse
.swt
.events
.DisposeEvent
;
16 import org
.eclipse
.swt
.events
.DisposeListener
;
17 import org
.eclipse
.swt
.events
.SelectionEvent
;
18 import org
.eclipse
.swt
.events
.SelectionListener
;
19 import org
.eclipse
.swt
.graphics
.Color
;
20 import org
.eclipse
.swt
.widgets
.Combo
;
21 import org
.eclipse
.swt
.widgets
.Label
;
22 import org
.eclipse
.swt
.widgets
.Listener
;
23 import org
.eclipse
.ui
.forms
.widgets
.TableWrapData
;
25 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
26 import eu
.etaxonomy
.cdm
.model
.common
.TermType
;
27 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
28 import eu
.etaxonomy
.taxeditor
.model
.MessagingUtils
;
29 import eu
.etaxonomy
.taxeditor
.preference
.IPreferenceKeys
;
30 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
31 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
32 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
33 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
34 import eu
.etaxonomy
.taxeditor
.store
.TermManager
;
35 import eu
.etaxonomy
.taxeditor
.ui
.element
.AbstractCdmFormElement
;
36 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmFormFactory
;
37 import eu
.etaxonomy
.taxeditor
.ui
.element
.CdmPropertyChangeEvent
;
38 import eu
.etaxonomy
.taxeditor
.ui
.element
.ICdmFormElement
;
39 import eu
.etaxonomy
.taxeditor
.ui
.element
.IEnableableFormElement
;
40 import eu
.etaxonomy
.taxeditor
.ui
.element
.ISelectable
;
41 import eu
.etaxonomy
.taxeditor
.ui
.element
.LayoutConstants
;
45 * Abstract AbstractTermComboElement class.
49 * @created Nov 5, 2009
53 public class TermComboElement
<T
extends DefinedTermBase
>
54 extends AbstractCdmFormElement
implements SelectionListener
,
55 DisposeListener
, IEnableableFormElement
, ISelectable
{
57 private static final int DEFAULT_VISIBLE_ITEMS
= 10;
61 private T emptyElement
;
62 private static String EMPTY_ELEMENT_LABEL
= "";
64 protected Label label
;
65 private final Combo combo
;
67 private ArrayList
<T
> terms
;
69 private Comparator
<T
> termComparator
;
71 private final TermType termType
;
72 private final TermVocabulary termVocabulary
;
73 private final Class
<T
> termClass
;
75 private List
<T
> customPreferredTerms
;
77 private boolean addEmptyElement
;
79 public TermComboElement(CdmFormFactory formFactory
,
80 ICdmFormElement parentElement
, TermType termType
, String labelString
, T selection
, boolean addEmptyElement
,
82 this(formFactory
, parentElement
, null, termType
, null, labelString
, selection
, addEmptyElement
, style
);
85 public TermComboElement(CdmFormFactory formFactory
,
86 ICdmFormElement parentElement
, TermVocabulary
<?
> termVocabulary
, String labelString
, T selection
, boolean addEmptyElement
,
88 this(formFactory
, parentElement
, null, null, termVocabulary
, labelString
, selection
, addEmptyElement
, style
);
91 public TermComboElement(CdmFormFactory formFactory
,
92 ICdmFormElement parentElement
, Class
<T
> termClass
, String labelString
, T selection
, boolean addEmptyElement
,
94 this(formFactory
, parentElement
, termClass
, null, null, labelString
, selection
, addEmptyElement
, style
);
97 private TermComboElement(CdmFormFactory formFactory
,
98 ICdmFormElement parentElement
, Class
<T
> termClass
, TermType termType
, TermVocabulary
<?
> termVocabulary
, String labelString
, T selection
, boolean addEmptyElement
,
100 super(formFactory
, parentElement
);
102 this.termType
= termType
;
103 this.termVocabulary
= termVocabulary
;
104 this.termClass
= termClass
;
105 this.addEmptyElement
= addEmptyElement
;
107 if (labelString
!= null) {
108 label
= formFactory
.createLabel(getLayoutComposite(), labelString
);
113 ComboViewer viewer
= new ComboViewer(getLayoutComposite(), SWT
.BORDER
| SWT
.READ_ONLY
);
114 combo
= viewer
.getCombo();
116 TableWrapData fill_HORIZONTALLY
= LayoutConstants
.FILL_HORIZONTALLY();
117 combo
.setLayoutData(fill_HORIZONTALLY
);
118 fill_HORIZONTALLY
.maxWidth
= 50;
119 combo
.setVisibleItemCount(DEFAULT_VISIBLE_ITEMS
);
123 //TODO try to remove generic T and avoid classes to be used
124 populateTerms((List
<T
>) getTermManager().getPreferredTerms(termType
));
126 else if(termVocabulary
!=null){
127 populateTerms((List
<T
>) getTermManager().getPreferredTerms(termVocabulary
));
129 else if(this.termClass
!=null){
130 populateTerms(getPreferredTerms());
133 combo
.addSelectionListener(this);
134 combo
.addDisposeListener(this);
135 PreferencesUtil
.getPreferenceStore().addPropertyChangeListener(this);
137 if (selection
!= null) {
138 setSelection(selection
);
144 * Getter for the field <code>selection</code>.
147 * @return a T object.
149 public T
getSelection() {
154 * <p>Sets the selection of the combo to the given T object.</p>
155 * <p>Passing <code>null</code> to this method will set the selection to
156 * the empty element and effectively clear the selection</p>
159 * a T object or <code>null</code> to clear the selection
161 public void setSelection(T selection
) {
162 this.selection
= selection
;
164 Listener
[] listeners
= combo
.getListeners(SWT
.Selection
);
166 for (Listener listener
: listeners
) {
167 combo
.removeListener(SWT
.Selection
, listener
);
170 if(selection
== null){
171 // set selection to the emptyElement
174 selectedIndex
= terms
.indexOf(selection
);
175 if (selectedIndex
== -1) {
176 createTermNotInPreferredTerms(selection
);
177 selectedIndex
= terms
.indexOf(selection
);
180 combo
.select(selectedIndex
);
182 for (Listener listener
: listeners
) {
183 combo
.addListener(SWT
.Selection
, listener
);
188 * Fills the combo with elements and sets up the convenience functions
189 * for selection index
191 * @param preferredTerms
193 private void populateTerms(List
<T
> preferredTerms
) {
197 terms
= new ArrayList
<T
>();
203 // Add an empty element for when nothing was selected yet
204 combo
.add(EMPTY_ELEMENT_LABEL
);
205 terms
.add(emptyElement
);
208 if (termComparator
!= null) {
209 Collections
.sort(preferredTerms
, termComparator
);
211 for (T term
: preferredTerms
) {
212 String label
= getLabel(term
);
214 if (term
.getTitleCache() != null) {
215 label
= term
.getTitleCache();
216 MessagingUtils
.warn(getClass(),
217 "Term does not have a default language representation: " + label
218 + ", " + term
.getUuid());
221 MessagingUtils
.warn(getClass(),
222 "Representation Label and TitleCache empty for term: "
223 + term
+ ", " + term
.getUuid());
232 if (selection
!= null) {
233 if (selection
.equals(term
)) {
239 if (selection
!= null && index
== 0) {
240 createTermNotInPreferredTerms(selection
);
248 * @see eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
252 public void setEnabled(boolean enabled
) {
253 combo
.setEnabled(enabled
);
257 * @see eu.etaxonomy.taxeditor.ui.element.IEnableableFormElement#isEnabled()
260 public boolean isEnabled() {
261 return combo
.isEnabled();
269 * @return a {@link java.util.List} object.
271 protected List
<T
> getPreferredTerms(){
272 List
<T
> preferredTerms
= new ArrayList
<T
>();
273 if (customPreferredTerms
!= null){
274 return customPreferredTerms
;
276 else if(termType
!=null){
277 preferredTerms
= getTermManager().getPreferredTerms(termType
);
279 else if(termVocabulary
!=null){
280 preferredTerms
= getTermManager().getPreferredTerms(termVocabulary
);
283 preferredTerms
= getTermManager().getPreferredTerms(termClass
);
285 return preferredTerms
;
289 * May be overridden by derived classes if the desired label string does not
290 * reside in term.getLabel();
294 * @return a {@link java.lang.String} object.
296 protected String
getLabel(T term
) {
300 String termLabel
= term
.getLabel(CdmStore
.getDefaultLanguage());
301 if (termLabel
== null){
302 termLabel
= term
.getLabel();
304 if(PreferencesUtil
.getPreferenceStore().getBoolean(IPreferenceKeys
.SHOW_VOCABULARY_ID_FOR_TERM_LABELS
)
305 && term
.getVocabulary()!=null){
306 String vocLabel
= term
.getVocabulary().getLabel(CdmStore
.getDefaultLanguage());
307 if (vocLabel
== null){
308 vocLabel
= term
.getVocabulary().getLabel();
310 termLabel
+= " ["+vocLabel
+"]";
321 private void createTermNotInPreferredTerms(T term
) {
322 List
<T
> preferredTerms
= getPreferredTerms();
324 preferredTerms
.add(term
);
326 populateTerms(preferredTerms
);
331 * addSelectionListener
335 * a {@link org.eclipse.swt.events.SelectionListener} object.
337 public void addSelectionListener(SelectionListener listener
) {
338 combo
.addSelectionListener(listener
);
343 * removeSelectionListener
347 * a {@link org.eclipse.swt.events.SelectionListener} object.
349 public void removeSelectionListener(SelectionListener listener
) {
350 combo
.removeSelectionListener(listener
);
357 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
358 * .events.SelectionEvent)
362 public void widgetSelected(SelectionEvent e
) {
363 selection
= terms
.get(combo
.getSelectionIndex());
364 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e
));
370 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
371 * PropertyChangeEvent)
375 public void propertyChange(PropertyChangeEvent event
) {
376 super.propertyChange(event
);
378 && PreferencesUtil
.PREFERRED_TERMS_CHANGE
.equals(event
380 populateTerms(getPreferredTerms());
386 public void setSelected(boolean selected
) {
387 setBackground(selected ? SELECTED
: getPersistentBackground());
392 public void widgetDisposed(DisposeEvent e
) {
393 PreferencesUtil
.getPreferenceStore().removePropertyChangeListener(this);
399 public void widgetDefaultSelected(SelectionEvent e
) {
404 public void setIrrelevant(boolean irrelevant
) {
405 String colorId
= irrelevant ? Resources
.COLOR_COMPOSITE_IRRELEVANT
406 : Resources
.COLOR_COMPOSITE_BACKGROUND
;
408 Color color
= StoreUtil
.getColor(colorId
);
409 combo
.setBackground(color
);
414 public void setBackground(Color color
) {
416 label
.setBackground(color
);
423 protected TermManager
getTermManager() {
424 return CdmStore
.getTermManager();
431 public int getVisibleItemCount(){
432 return combo
.getVisibleItemCount();
439 public void setVisibleItemCount(int count
){
440 combo
.setVisibleItemCount(count
);
444 * <p>A {@link List} of term objects may be passed to this combo box. In this case, the default behaviour
445 * of displaying the preferred terms for the T type will be overridden and the combo will only display the
446 * given terms. Also, any previous selection will be reseted.</p>
448 * <p>To return to the default of displaying the preferred terms, simply pass <code>null</code>.</p>
450 * @param terms a {@link List} of T objects or <code>null</code> for default preferred terms
452 public void setTerms(List
<T
> terms
) {
454 customPreferredTerms
= terms
;
455 populateTerms(customPreferredTerms
);
458 public void removeEmptyElement(){
460 if(terms
.contains(emptyElement
)){
461 terms
.remove(emptyElement
);
463 if(Arrays
.asList(combo
.getItems()).contains(EMPTY_ELEMENT_LABEL
)){
464 combo
.remove(EMPTY_ELEMENT_LABEL
);