6c7d48f51874cb5bd3cc098856c39026c85d9665
[taxeditor.git] / taxeditor-editor / src / main / java / eu / etaxonomy / taxeditor / forms / AbstractTermComboComposite.java
1 /**
2 *
3 */
4 package eu.etaxonomy.taxeditor.forms;
5
6 import java.util.ArrayList;
7 import java.util.Collections;
8 import java.util.Comparator;
9 import java.util.List;
10
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;
26
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;
31
32 /**
33 * @author nho
34 *
35 */
36 public abstract class AbstractTermComboComposite<T extends DefinedTermBase> extends AbstractFormComposite implements SelectionListener, IPropertyChangeListener{
37
38 private static final Logger logger = Logger.getLogger(AbstractTermComboComposite.class);
39
40 T selection;
41
42 private Label label;
43 private Combo combo;
44
45 private ArrayList<T> terms;
46
47 private Comparator<T> termComparator;
48
49 private Composite msgComposite;
50
51 /**
52 * @param parent
53 * @param style
54 */
55 public AbstractTermComboComposite(Composite parent, String labelString, T selection, int visibleItems, int style) {
56 super(parent, style);
57
58 label = toolkit.createLabel(this, labelString);
59 label.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
60
61 // create combo
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);
65
66 populateTerms();
67
68 combo.addSelectionListener(this);
69 PreferencesUtil.getPreferenceStore().addPropertyChangeListener(this);
70 }
71
72 public T getSelection(){
73 return selection;
74 }
75
76 public void setSelection(T selection){
77 Listener[] listeners = combo.getListeners(SWT.Selection);
78
79 for (Listener listener : listeners){
80 combo.removeListener(SWT.Selection, listener);
81 }
82
83 combo.select(terms.indexOf(selection));
84
85 for (Listener listener : listeners){
86 combo.addListener(SWT.Selection, listener);
87 }
88 }
89
90 private void populateTerms(){
91 List<T> preferredTerms = preferredTerms();
92
93 combo.removeAll();
94
95 terms = new ArrayList<T>();
96
97 int i = 0;
98 int index = 0;
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");
105 continue;
106 }
107 combo.add(description);
108 terms.add(term);
109
110 i++;
111 if (selection != null) {
112 if (selection.equals(term)) {
113 index = i;
114 }
115 } else {
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)) {
118 // index = i;
119 // }
120 }
121 }
122
123 // Check whether language is in menu
124 if (msgComposite != null) {
125 msgComposite.dispose();
126 msgComposite = null;
127 }
128 if (selection != null && index == 0) {
129 createTermNotInPreferredTerms(selection);
130 }
131
132 combo.select(index);
133 }
134
135 /**
136 * @return
137 */
138 protected abstract List<T> preferredTerms();
139
140 private void createTermNotInPreferredTerms(T term) {
141
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));
149
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));
156
157 Hyperlink linkEdit = toolkit.createHyperlink(msgComposite, "Edit preferences", SWT.WRAP);
158 linkEdit.addHyperlinkListener(new HyperlinkAdapter() {
159 /* (non-Javadoc)
160 * @see org.eclipse.ui.forms.events.HyperlinkAdapter#linkActivated(org.eclipse.ui.forms.events.HyperlinkEvent)
161 */
162 @Override
163 public void linkActivated(HyperlinkEvent e) {
164 org.eclipse.ui.dialogs.PreferencesUtil.createPreferenceDialogOn(EditorUtil.getShell(),
165 LanguageMenuPreferences.ID, null, null).open();
166 }
167 });
168
169 msgComposite.moveBelow(combo);
170
171 pack(true);
172 layout();
173 }
174
175 public void addSelectionListener(SelectionListener listener){
176 combo.addSelectionListener(listener);
177 }
178
179 public void removeSelectionListener(SelectionListener listener){
180 combo.removeSelectionListener(listener);
181 }
182
183 /* (non-Javadoc)
184 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
185 */
186 public void widgetSelected(SelectionEvent e) {
187 selection = terms.get(combo.getSelectionIndex());
188 }
189
190 /* (non-Javadoc)
191 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
192 */
193 public void propertyChange(PropertyChangeEvent event) {
194 if (PreferencesUtil.PREFERRED_TERMS_CHANGE.equals(event.getProperty())) {
195 populateTerms();
196 }
197 }
198
199 /* (non-Javadoc)
200 * @see eu.etaxonomy.taxeditor.forms.AbstractFormComposite#dispose()
201 */
202 @Override
203 public void dispose() {
204 super.dispose();
205 PreferencesUtil.getPreferenceStore().removePropertyChangeListener(this);
206 }
207
208 // not used
209 public void widgetDefaultSelected(SelectionEvent e) {}
210 }