4 package eu
.etaxonomy
.taxeditor
.forms
;
6 import java
.util
.ArrayList
;
7 import java
.util
.Collections
;
8 import java
.util
.Comparator
;
11 import org
.apache
.log4j
.Logger
;
12 import org
.eclipse
.jface
.util
.IPropertyChangeListener
;
13 import org
.eclipse
.jface
.util
.PropertyChangeEvent
;
14 import org
.eclipse
.swt
.SWT
;
15 import org
.eclipse
.swt
.events
.SelectionEvent
;
16 import org
.eclipse
.swt
.events
.SelectionListener
;
17 import org
.eclipse
.swt
.layout
.GridData
;
18 import org
.eclipse
.swt
.layout
.GridLayout
;
19 import org
.eclipse
.swt
.widgets
.Combo
;
20 import org
.eclipse
.swt
.widgets
.Composite
;
21 import org
.eclipse
.swt
.widgets
.Label
;
22 import org
.eclipse
.swt
.widgets
.Listener
;
23 import org
.eclipse
.ui
.forms
.events
.HyperlinkAdapter
;
24 import org
.eclipse
.ui
.forms
.events
.HyperlinkEvent
;
25 import org
.eclipse
.ui
.forms
.widgets
.Hyperlink
;
27 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
28 import eu
.etaxonomy
.taxeditor
.editor
.EditorUtil
;
29 import eu
.etaxonomy
.taxeditor
.preference
.LanguageMenuPreferences
;
30 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
36 public abstract class AbstractTermComboComposite
<T
extends DefinedTermBase
> extends AbstractFormComposite
implements SelectionListener
, IPropertyChangeListener
{
38 private static final Logger logger
= Logger
.getLogger(AbstractTermComboComposite
.class);
45 private ArrayList
<T
> terms
;
47 private Comparator
<T
> termComparator
;
49 private Composite msgComposite
;
55 public AbstractTermComboComposite(Composite parent
, String labelString
, T selection
, int visibleItems
, int style
) {
58 label
= toolkit
.createLabel(this, labelString
);
59 label
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, false));
62 combo
= new Combo(this, SWT
.BORDER
| SWT
.READ_ONLY
);
63 combo
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, false));
64 combo
.setVisibleItemCount(visibleItems
);
68 combo
.addSelectionListener(this);
69 PreferencesUtil
.getPreferenceStore().addPropertyChangeListener(this);
72 public T
getSelection(){
76 public void setSelection(T selection
){
77 Listener
[] listeners
= combo
.getListeners(SWT
.Selection
);
79 for (Listener listener
: listeners
){
80 combo
.removeListener(SWT
.Selection
, listener
);
83 combo
.select(terms
.indexOf(selection
));
85 for (Listener listener
: listeners
){
86 combo
.addListener(SWT
.Selection
, listener
);
90 private void populateTerms(){
91 List
<T
> preferredTerms
= preferredTerms();
95 terms
= new ArrayList
<T
>();
99 if(termComparator
!= null)
100 Collections
.sort(preferredTerms
, termComparator
);
101 for (T term
: preferredTerms
) {
102 String description
= term
.getDescription();
103 if (description
== null) {
104 logger
.warn("No description for " + term
+ " - not added to combo");
107 combo
.add(description
);
111 if (selection
!= null) {
112 if (selection
.equals(term
)) {
116 // TODO isn't it better to put the last language at the top of the menu, not automatically select?
117 // if (lastLanguage != null && lastLanguage.equals(language)) {
123 // Check whether language is in menu
124 if (msgComposite
!= null) {
125 msgComposite
.dispose();
128 if (selection
!= null && index
== 0) {
129 createTermNotInPreferredTerms(selection
);
138 protected abstract List
<T
> preferredTerms();
140 private void createTermNotInPreferredTerms(T term
) {
142 msgComposite
= toolkit
.createComposite(this);
143 GridLayout layout
= new GridLayout();
144 layout
.numColumns
= 2;
145 msgComposite
.setLayout(layout
);
146 msgComposite
.setLayoutData(new GridData(GridData
.GRAB_HORIZONTAL
147 | GridData
.GRAB_VERTICAL
| GridData
.HORIZONTAL_ALIGN_FILL
148 | GridData
.VERTICAL_ALIGN_CENTER
));
150 String langText
= term
.getDescription() == null ? term
.getLabel() : term
.getDescription();
151 langText
+= " is not one of your preferred " + term
.getClass().getSimpleName().toLowerCase() + "s. ";
152 Label label
= toolkit
.createLabel(msgComposite
, langText
, SWT
.WRAP
);
153 label
.setLayoutData(new GridData(GridData
.GRAB_HORIZONTAL
154 | GridData
.GRAB_VERTICAL
| GridData
.HORIZONTAL_ALIGN_FILL
155 | GridData
.VERTICAL_ALIGN_CENTER
));
157 Hyperlink linkEdit
= toolkit
.createHyperlink(msgComposite
, "Edit preferences", SWT
.WRAP
);
158 linkEdit
.addHyperlinkListener(new HyperlinkAdapter() {
160 * @see org.eclipse.ui.forms.events.HyperlinkAdapter#linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent)
163 public void linkActivated(HyperlinkEvent e
) {
164 org
.eclipse
.ui
.dialogs
.PreferencesUtil
.createPreferenceDialogOn(EditorUtil
.getShell(),
165 LanguageMenuPreferences
.ID
, null, null).open();
169 msgComposite
.moveBelow(combo
);
175 public void addSelectionListener(SelectionListener listener
){
176 combo
.addSelectionListener(listener
);
179 public void removeSelectionListener(SelectionListener listener
){
180 combo
.removeSelectionListener(listener
);
184 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
186 public void widgetSelected(SelectionEvent e
) {
187 selection
= terms
.get(combo
.getSelectionIndex());
191 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
193 public void propertyChange(PropertyChangeEvent event
) {
194 if (PreferencesUtil
.PREFERRED_TERMS_CHANGE
.equals(event
.getProperty())) {
200 * @see eu.etaxonomy.taxeditor.forms.AbstractFormComposite#dispose()
203 public void dispose() {
205 PreferencesUtil
.getPreferenceStore().removePropertyChangeListener(this);
209 public void widgetDefaultSelected(SelectionEvent e
) {}