4 package eu
.etaxonomy
.taxeditor
.forms
.term
;
7 import java
.util
.ArrayList
;
8 import java
.util
.Collections
;
9 import java
.util
.Comparator
;
10 import java
.util
.List
;
12 import org
.apache
.log4j
.Logger
;
13 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
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
.Composite
;
22 import org
.eclipse
.swt
.widgets
.Label
;
23 import org
.eclipse
.swt
.widgets
.Listener
;
25 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
26 import eu
.etaxonomy
.taxeditor
.editor
.EditorUtil
;
27 import eu
.etaxonomy
.taxeditor
.forms
.AbstractCdmFormElement
;
28 import eu
.etaxonomy
.taxeditor
.forms
.CdmFormFactory
;
29 import eu
.etaxonomy
.taxeditor
.forms
.CdmPropertyChangeEvent
;
30 import eu
.etaxonomy
.taxeditor
.forms
.ICdmFormElement
;
31 import eu
.etaxonomy
.taxeditor
.forms
.IEnableableFormElement
;
32 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
33 import eu
.etaxonomy
.taxeditor
.preference
.Resources
;
34 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
37 * <p>Abstract AbstractTermComboElement class.</p>
40 * @created Nov 5, 2009
44 public abstract class AbstractTermComboElement
<T
extends DefinedTermBase
> extends AbstractCdmFormElement
implements SelectionListener
, DisposeListener
, IEnableableFormElement
{
46 private static final Logger logger
= Logger
.getLogger(AbstractTermComboElement
.class);
50 private static String EMPTY_ELEMENT_LABEL
= "";
53 protected Label label
;
56 private ArrayList
<T
> terms
;
58 private Comparator
<T
> termComparator
;
60 private Composite msgComposite
;
63 * <p>Constructor for AbstractTermComboElement.</p>
65 * @param parentElement a {@link eu.etaxonomy.taxeditor.forms.ICdmFormElement} object.
67 * @param formFactory a {@link eu.etaxonomy.taxeditor.forms.CdmFormFactory} object.
68 * @param labelString a {@link java.lang.String} object.
69 * @param selection a T object.
70 * @param visibleItems a int.
71 * @param <T> a T object.
73 public AbstractTermComboElement(CdmFormFactory formFactory
, ICdmFormElement parentElement
, String labelString
, T selection
, int visibleItems
, int style
) {
74 super(formFactory
, parentElement
);
76 if(labelString
!= null){
77 label
= formFactory
.createLabel(getLayoutComposite(), labelString
);
82 combo
= new Combo(getLayoutComposite(), SWT
.BORDER
| SWT
.READ_ONLY
);
84 combo
.setLayoutData(CdmFormFactory
.FILL_HORIZONTALLY());
85 combo
.setVisibleItemCount(visibleItems
);
89 combo
.addSelectionListener(this);
90 combo
.addDisposeListener(this);
91 PreferencesUtil
.getPreferenceStore().addPropertyChangeListener(this);
93 if(selection
!= null){
94 setSelection(selection
);
99 * <p>Getter for the field <code>selection</code>.</p>
101 * @return a T object.
103 public T
getSelection(){
108 * <p>Setter for the field <code>selection</code>.</p>
110 * @param selection a T object.
112 public void setSelection(T selection
){
113 Listener
[] listeners
= combo
.getListeners(SWT
.Selection
);
115 for (Listener listener
: listeners
){
116 combo
.removeListener(SWT
.Selection
, listener
);
119 int index
= terms
.indexOf(selection
);
121 createTermNotInPreferredTerms(selection
);
126 for (Listener listener
: listeners
){
127 combo
.addListener(SWT
.Selection
, listener
);
131 private void populateTerms(){
132 List
<T
> preferredTerms
= preferredTerms();
136 terms
= new ArrayList
<T
>();
141 // Add an empty element for when nothing was selected already
142 combo
.add(EMPTY_ELEMENT_LABEL
);
143 terms
.add(emptyElement
);
145 if(termComparator
!= null)
146 Collections
.sort(preferredTerms
, termComparator
);
147 for (T term
: preferredTerms
) {
148 String label
= getLabel(term
);
150 if(term
.getTitleCache() != null){
151 label
= term
.getTitleCache();
152 logger
.error("Term does not have a representation: " + term
+ ", " + term
.getUuid());
155 logger
.error("Representation Label and TitleCache empty for term: " + term
+ ", " + term
.getUuid());
164 if (selection
!= null) {
165 if (selection
.equals(term
)) {
169 // TODO isn't it better to put the last language at the top of the menu, not automatically select?
170 // if (lastLanguage != null && lastLanguage.equals(language)) {
176 // Check whether language is in menu
177 if (msgComposite
!= null) {
178 msgComposite
.dispose();
181 if (selection
!= null && index
== 0) {
182 createTermNotInPreferredTerms(selection
);
190 * @see eu.etaxonomy.taxeditor.forms.IEnableableFormElement#setEnabled(boolean)
193 public void setEnabled(boolean enabled
) {
194 combo
.setEnabled(enabled
);
198 * <p>preferredTerms</p>
200 * @return a {@link java.util.List} object.
202 protected abstract List
<T
> preferredTerms();
205 * May be overridden by derived classes if the desired label string does not
206 * reside in term.getLabel();
208 * @param term a T object.
209 * @return a {@link java.lang.String} object.
211 protected String
getLabel(T term
){
212 return term
.getLabel(CdmStore
.getDefaultLanguage());
215 private void createTermNotInPreferredTerms(T term
) {
217 // PreferencesUtil.addTermToPreferredTerms(term);
219 // msgComposite = formFactory.createComposite(getLayoutComposite());
220 // msgComposite.setLayout(LAYOUT());
221 // msgComposite.setLayoutData(FILL_GRID_HORIZONTALLY(2, 1));
223 // String langText = term.getDescription() == null ? term.getLabel() : term.getDescription();
224 // langText += " is used here, but was not in your list of preferred terms.";
225 // Label label = formFactory.createLabel(msgComposite, langText, SWT.WRAP);
228 // msgComposite.moveBelow(combo);
230 // getLayoutComposite().layout();
232 // setSelection(term);
236 * <p>addSelectionListener</p>
238 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
240 public void addSelectionListener(SelectionListener listener
){
241 combo
.addSelectionListener(listener
);
245 * <p>removeSelectionListener</p>
247 * @param listener a {@link org.eclipse.swt.events.SelectionListener} object.
249 public void removeSelectionListener(SelectionListener listener
){
250 combo
.removeSelectionListener(listener
);
254 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
257 public void widgetSelected(SelectionEvent e
) {
258 selection
= terms
.get(combo
.getSelectionIndex());
259 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, e
));
263 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
266 public void propertyChange(PropertyChangeEvent event
) {
267 super.propertyChange(event
);
268 if (event
!= null && PreferencesUtil
.PREFERRED_TERMS_CHANGE
.equals(event
.getProperty())) {
274 public void setSelected(boolean selected
) {
275 label
.setBackground(getColor(selected
));
279 public void widgetDisposed(DisposeEvent e
) {
280 PreferencesUtil
.getPreferenceStore().removePropertyChangeListener(this);
285 public void widgetDefaultSelected(SelectionEvent e
) {}
288 public void setIrrelevant(boolean irrelevant
) {
289 String colorId
= irrelevant ? Resources
.COLOR_COMPOSITE_IRRELEVANT
: Resources
.COLOR_COMPOSITE_BACKGROUND
;
291 Color color
= EditorUtil
.getColor(colorId
);
292 combo
.setBackground(color
);
297 public void setBackground(Color color
) {
299 label
.setBackground(color
);