4 package eu
.etaxonomy
.taxeditor
.ui
.term
;
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
.Composite
;
20 import org
.eclipse
.swt
.widgets
.Label
;
21 import org
.eclipse
.swt
.widgets
.Listener
;
23 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
24 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
25 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
26 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
27 import eu
.etaxonomy
.taxeditor
.store
.StoreUtil
;
28 import eu
.etaxonomy
.taxeditor
.store
.TermManager
;
29 import eu
.etaxonomy
.taxeditor
.ui
.forms
.AbstractCdmFormElement
;
30 import eu
.etaxonomy
.taxeditor
.ui
.forms
.CdmFormFactory
;
31 import eu
.etaxonomy
.taxeditor
.ui
.forms
.CdmPropertyChangeEvent
;
32 import eu
.etaxonomy
.taxeditor
.ui
.forms
.ICdmFormElement
;
33 import eu
.etaxonomy
.taxeditor
.ui
.forms
.IEnableableFormElement
;
34 import eu
.etaxonomy
.taxeditor
.ui
.forms
.ISelectable
;
38 * Abstract AbstractTermComboElement class.
42 * @created Nov 5, 2009
46 public abstract class AbstractTermComboElement
<T
extends DefinedTermBase
>
47 extends AbstractCdmFormElement
implements SelectionListener
,
48 DisposeListener
, IEnableableFormElement
, ISelectable
{
52 private static String EMPTY_ELEMENT_LABEL
= "";
55 protected Label label
;
58 private ArrayList
<T
> terms
;
60 private Comparator
<T
> termComparator
;
62 private Composite msgComposite
;
66 * Constructor for AbstractTermComboElement.
69 * @param parentElement
70 * a {@link eu.etaxonomy.taxeditor.ui.forms.ICdmFormElement}
75 * a {@link eu.etaxonomy.taxeditor.ui.forms.CdmFormFactory}
78 * a {@link java.lang.String} object.
86 public AbstractTermComboElement(CdmFormFactory formFactory
,
87 ICdmFormElement parentElement
, String labelString
, T selection
,
88 int visibleItems
, int style
) {
89 super(formFactory
, parentElement
);
91 if (labelString
!= null) {
92 label
= formFactory
.createLabel(getLayoutComposite(), labelString
);
97 combo
= new Combo(getLayoutComposite(), SWT
.BORDER
| SWT
.READ_ONLY
);
99 combo
.setLayoutData(CdmFormFactory
.FILL_HORIZONTALLY());
100 combo
.setVisibleItemCount(visibleItems
);
102 populateTerms(preferredTerms());
104 combo
.addSelectionListener(this);
105 combo
.addDisposeListener(this);
106 PreferencesUtil
.getPreferenceStore().addPropertyChangeListener(this);
108 if (selection
!= null) {
109 setSelection(selection
);
115 * Getter for the field <code>selection</code>.
118 * @return a T object.
120 public T
getSelection() {
126 * Setter for the field <code>selection</code>.
132 public void setSelection(T selection
) {
133 Listener
[] listeners
= combo
.getListeners(SWT
.Selection
);
135 for (Listener listener
: listeners
) {
136 combo
.removeListener(SWT
.Selection
, listener
);
139 int index
= terms
.indexOf(selection
);
141 createTermNotInPreferredTerms(selection
);
142 index
= terms
.indexOf(selection
);
146 for (Listener listener
: listeners
) {
147 combo
.addListener(SWT
.Selection
, listener
);
151 private void populateTerms(List
<T
> preferredTerms
) {
155 terms
= new ArrayList
<T
>();
160 // Add an empty element for when nothing was selected yet
161 combo
.add(EMPTY_ELEMENT_LABEL
);
162 terms
.add(emptyElement
);
164 if (termComparator
!= null) {
165 Collections
.sort(preferredTerms
, termComparator
);
167 for (T term
: preferredTerms
) {
168 String label
= getLabel(term
);
170 if (term
.getTitleCache() != null) {
171 label
= term
.getTitleCache();
172 StoreUtil
.error(getClass(),
173 "Term does not have a representation: " + term
174 + ", " + term
.getUuid(), null);
177 StoreUtil
.error(getClass(),
178 "Representation Label and TitleCache empty for term: "
179 + term
+ ", " + term
.getUuid(), null);
188 if (selection
!= null) {
189 if (selection
.equals(term
)) {
195 if (selection
!= null && index
== 0) {
196 createTermNotInPreferredTerms(selection
);
206 * eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
209 public void setEnabled(boolean enabled
) {
210 combo
.setEnabled(enabled
);
218 * @return a {@link java.util.List} object.
220 protected abstract List
<T
> preferredTerms();
223 * May be overridden by derived classes if the desired label string does not
224 * reside in term.getLabel();
228 * @return a {@link java.lang.String} object.
230 protected String
getLabel(T term
) {
231 return term
.getLabel(CdmStore
.getDefaultLanguage());
234 private void createTermNotInPreferredTerms(T term
) {
235 List
<T
> preferredTerms
= preferredTerms();
237 preferredTerms
.add(term
);
239 populateTerms(preferredTerms
);
244 * addSelectionListener
248 * a {@link org.eclipse.swt.events.SelectionListener} object.
250 public void addSelectionListener(SelectionListener listener
) {
251 combo
.addSelectionListener(listener
);
256 * removeSelectionListener
260 * a {@link org.eclipse.swt.events.SelectionListener} object.
262 public void removeSelectionListener(SelectionListener listener
) {
263 combo
.removeSelectionListener(listener
);
270 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
271 * .events.SelectionEvent)
274 public void widgetSelected(SelectionEvent e
) {
275 selection
= terms
.get(combo
.getSelectionIndex());
276 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e
));
282 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
283 * PropertyChangeEvent)
286 public void propertyChange(PropertyChangeEvent event
) {
287 super.propertyChange(event
);
289 && PreferencesUtil
.PREFERRED_TERMS_CHANGE
.equals(event
291 populateTerms(preferredTerms());
296 public void setSelected(boolean selected
) {
297 setBackground(selected ? SELECTED
: getPersistentBackground());
301 public void widgetDisposed(DisposeEvent e
) {
302 PreferencesUtil
.getPreferenceStore().removePropertyChangeListener(this);
307 public void widgetDefaultSelected(SelectionEvent e
) {
311 public void setIrrelevant(boolean irrelevant
) {
312 String colorId
= irrelevant ? Resources
.COLOR_COMPOSITE_IRRELEVANT
313 : Resources
.COLOR_COMPOSITE_BACKGROUND
;
315 Color color
= StoreUtil
.getColor(colorId
);
316 combo
.setBackground(color
);
321 public void setBackground(Color color
) {
323 label
.setBackground(color
);
329 protected TermManager
getTermManager() {
330 return CdmStore
.getTermManager();