4571ba76001bbcedbd836652f7b0f3be3cd29217
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / element / RepresentationElement.java
1 // $Id$
2 /**
3 * Copyright (C) 2016 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.taxeditor.ui.element;
11
12 /**
13 * @author k.luther
14 * @date 22.06.2016
15 *
16 */
17
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.Collections;
21 import java.util.List;
22
23 import org.eclipse.jface.util.PropertyChangeEvent;
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.events.SelectionAdapter;
26 import org.eclipse.swt.events.SelectionEvent;
27 import org.eclipse.swt.events.SelectionListener;
28 import org.eclipse.swt.widgets.Button;
29
30 import eu.etaxonomy.cdm.model.common.Language;
31 import eu.etaxonomy.cdm.model.common.Representation;
32 import eu.etaxonomy.cdm.model.common.TermBase;
33 import eu.etaxonomy.cdm.model.common.TermType;
34 import eu.etaxonomy.taxeditor.model.DefaultTermComparator;
35 import eu.etaxonomy.taxeditor.model.ImageResources;
36 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
37 import eu.etaxonomy.taxeditor.store.CdmStore;
38 import eu.etaxonomy.taxeditor.ui.combo.TermComboElement;
39
40
41 public class RepresentationElement extends AbstractCdmFormElement implements
42 SelectionListener{
43
44 protected TermComboElement<Language> combo_language;
45
46 protected TextWithLabelElement element_Label;
47 protected TextWithLabelElement element_abbrevLabel;
48 protected TextWithLabelElement element_text;
49
50 protected Button button;
51
52 protected Representation selectedRepresentation;
53 protected TermBase term;
54
55 private Button removeRepresentation;
56
57 // protected final boolean isTranslationWizard;
58
59
60 /**
61 * <p>
62 * Constructor for MultilanguageTextElement.
63 * </p>
64 *
65 * @param formFactory
66 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
67 * object.
68 * @param formElement
69 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
70 * object.
71 *
72 * @param term
73 * a {@link eu.etaxonomy.cdm.model.common.TermBase} object.
74 * @param textHeight
75 * a {@link java.lang.Integer} object.
76 * @param style
77 * a int.
78 */
79 public RepresentationElement(CdmFormFactory formFactory,
80 ICdmFormElement formElement, TermBase term,
81 Integer textHeight, int style, boolean fill) {
82 super(formFactory, formElement);
83
84 formFactory.addPropertyChangeListener(this);
85
86 element_Label = this.formFactory.createTextWithLabelElement(formElement, "Label", null, style);
87 element_abbrevLabel = this.formFactory
88 .createTextWithLabelElement(formElement, "abbrev. Label",
89 null, style);
90 element_text = this.formFactory.createMultiLineTextWithLabel(formElement, "Description", textHeight, style);
91 if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
92 createRepresentationEditingElements(formElement, style);
93 }
94 setTerm(term, fill);
95
96 }
97
98 /**
99 * <p>
100 * Constructor for MultilanguageTextElement.
101 * </p>
102 *
103 * @param formFactory
104 * a {@link eu.etaxonomy.taxeditor.ui.element.CdmFormFactory}
105 * object.
106 * @param formElement
107 * a {@link eu.etaxonomy.taxeditor.ui.element.ICdmFormElement}
108 * object.
109 * @param representation
110 * a {@link eu.etaxonomy.cdm.model.common.Representation} object.
111 * @param term
112 * a {@link eu.etaxonomy.cdm.model.common.TermBase} object.
113 * @param textHeight
114 * a {@link java.lang.Integer} object.
115 * @param style
116 * a int.
117 */
118 public RepresentationElement(CdmFormFactory formFactory,
119 ICdmFormElement formElement, Representation representation, TermBase term,
120 Integer textHeight, int style, boolean fill) {
121 super(formFactory, formElement);
122
123 formFactory.addPropertyChangeListener(this);
124
125 element_Label = this.formFactory.createTextWithLabelElement(formElement, "Label", null, style);
126 element_abbrevLabel = this.formFactory
127 .createTextWithLabelElement(formElement, "abbrev. Label",
128 null, style);
129 element_text = this.formFactory.createMultiLineTextWithLabel(formElement, "Description", textHeight, style);
130 if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
131 createRepresentationEditingElements(formElement, style);
132 }
133 setTerm(term, fill);
134 setSelectedRepresentation(representation);
135
136
137 }
138
139 protected void createRepresentationEditingElements(
140 ICdmFormElement formElement, int style) {
141 removeRepresentation = formFactory.createButton(getLayoutComposite(), null,
142 SWT.PUSH);
143 removeRepresentation.setImage(ImageResources
144 .getImage(ImageResources.TRASH_ICON));
145 removeRepresentation.setToolTipText("Remove representation");
146 removeRepresentation.addSelectionListener(new DeleteListener(this));
147 addControl(removeRepresentation);
148
149 combo_language = formFactory.createDefinedTermComboElement(TermType.Language, formElement,
150 "", null, false, style);
151
152 combo_language.addSelectionListener(this);
153
154 //addControl(formFactory.createLabel(getLayoutComposite(), ""));
155 }
156
157 public List<Language> getLanguages() {
158
159 ArrayList<Language> languageList = new ArrayList<Language>();
160 for (Representation rep: term.getRepresentations()){
161 languageList.add(rep.getLanguage());
162 }
163
164 Collections.sort(languageList, new DefaultTermComparator<Language>());
165
166 return languageList;
167 }
168
169 /*
170 * (non-Javadoc)
171 *
172 * @see
173 * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
174 * .events.SelectionEvent)
175 */
176 /** {@inheritDoc} */
177 @Override
178 public void widgetSelected(SelectionEvent e) {
179 Language selectedLanguage = combo_language.getSelection();
180 if (selectedLanguage != null) {
181 selectedRepresentation = getTerm().getRepresentation(
182 selectedLanguage);
183 if (selectedRepresentation == null){
184 selectedRepresentation = Representation.NewInstance("", "", "", selectedLanguage);
185 }
186 element_Label.setText(selectedRepresentation.getLabel());
187 element_abbrevLabel.setText(selectedRepresentation.getAbbreviatedLabel());
188 element_text.setText(selectedRepresentation.getDescription());
189
190 }else {
191
192 element_Label.setEnabled(false);
193 element_abbrevLabel.setEnabled(false);
194 element_text.setEnabled(false);
195 }
196
197 }
198
199 /*
200 * (non-Javadoc)
201 *
202 * @see
203 * org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
204 * .swt.events.SelectionEvent)
205 */
206 /** {@inheritDoc} */
207 @Override
208 public void widgetDefaultSelected(SelectionEvent e) {
209 }
210
211 /**
212 * <p>
213 * Setter for the field <code>multilanguageText</code>.
214 * </p>
215 *
216 * @param multilanguageText
217 * the multilanguageText to set
218 */
219 public void setTerm(
220 TermBase term, boolean update) {
221 this.term = term;
222 if (term.getRepresentations().isEmpty()){
223 //if the term has no representation at all, create a default one.
224 Representation rep = Representation.NewInstance("", "empty representation", "", PreferencesUtil.getGlobalLanguage());
225 term.addRepresentation(rep);
226 }
227
228 if (selectedRepresentation != null) {
229 combo_language.setTerms(getLanguages());
230
231 } else{
232 element_Label.setEnabled(false);
233 element_abbrevLabel.setEnabled(false);
234 element_text.setEnabled(false);
235 removeRepresentation.setEnabled(false);
236 }
237 if (update){
238 updateControls();
239 }
240 }
241
242 /**
243 *
244 */
245 protected void updateControls() {
246 Representation preferredRepresentation = term
247 .getPreferredRepresentation(PreferencesUtil.getGlobalLanguage() );
248
249 element_Label.setText(preferredRepresentation.getLabel());
250 element_abbrevLabel.setText(preferredRepresentation.getAbbreviatedLabel());
251 element_text.setText(preferredRepresentation.getDescription());
252 selectedRepresentation = preferredRepresentation;
253 if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
254 combo_language.setSelection(preferredRepresentation == null?CdmStore.getDefaultLanguage():preferredRepresentation.getLanguage());
255 boolean removePossible = term.getRepresentations().size() > 1 ;
256 removeRepresentation.setEnabled(removePossible);
257
258 }
259 }
260
261 /**
262 * <p>
263 * Getter for the field <code>multilanguageText</code>.
264 * </p>
265 *
266 * @return the multilanguageText
267 */
268 public TermBase getTerm() {
269 return term;
270 }
271
272 /*
273 * (non-Javadoc)
274 *
275 * @see
276 * eu.etaxonomy.taxeditor.forms.AbstractCdmFormElement#propertyChange(org
277 * .eclipse.jface.util.PropertyChangeEvent)
278 */
279 /** {@inheritDoc} */
280 @Override
281 public void propertyChange(PropertyChangeEvent event) {
282 if (event == null) {
283 return;
284 }
285 Object eventSource = event.getSource();
286
287 if (eventSource == element_abbrevLabel) {
288 String abbrevLabel = ((TextWithLabelElement) eventSource)
289 .getText();
290 selectedRepresentation.setAbbreviatedLabel(abbrevLabel);
291 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
292 } else if (eventSource == element_Label){
293 String label = ((TextWithLabelElement) eventSource)
294 .getText();
295 selectedRepresentation.setLabel(label);
296 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
297 } else if (eventSource == element_text){
298 String text = ((TextWithLabelElement) eventSource)
299 .getText();
300 selectedRepresentation.setText(text);
301 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
302 } else if (eventSource == button){
303 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
304 } else if (eventSource == combo_language){
305 if (combo_language.getSelection() != null){
306 element_Label.setEnabled(true);
307 element_abbrevLabel.setEnabled(true);
308 element_text.setEnabled(true);
309 boolean removePossible = term.getRepresentations().size() > 1 ;
310 removeRepresentation.setEnabled(removePossible);
311 } else{
312 element_Label.setEnabled(false);
313 element_abbrevLabel.setEnabled(false);
314 element_text.setEnabled(false);
315 removeRepresentation.setEnabled(false);
316 }
317 firePropertyChangeEvent(new CdmPropertyChangeEvent(this, event));
318 }
319 }
320
321 /**
322 * @return the selectedRepresentation
323 */
324 public Representation getSelectedRepresentation() {
325 return selectedRepresentation;
326 }
327
328 /**
329 * @param selectedRepresentation the selectedRepresentation to set
330 */
331 public void setSelectedRepresentation(Representation selectedRepresentation) {
332 if (selectedRepresentation == null){
333 selectedRepresentation = Representation.NewInstance("", "", "", null);
334 }
335 this.selectedRepresentation = selectedRepresentation;
336 }
337
338 private class DeleteListener extends SelectionAdapter {
339
340 private final RepresentationElement element;
341
342 public DeleteListener(RepresentationElement element) {
343 this.element = element;
344 }
345
346 @Override
347 public void widgetSelected(SelectionEvent e) {
348 term.removeRepresentation(selectedRepresentation);
349 firePropertyChangeEvent(new CdmPropertyChangeEvent(
350 this, e));
351 updateControls();
352 }
353 }
354 }
355
356