Merge branch 'hotfix/5.44.1'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / ui / translation / TranslationWizardPage.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.ui.translation;
11
12 import java.util.ArrayList;
13 import java.util.Arrays;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17
18 import org.eclipse.core.runtime.Assert;
19 import org.eclipse.jface.util.IPropertyChangeListener;
20 import org.eclipse.jface.util.PropertyChangeEvent;
21 import org.eclipse.jface.wizard.WizardPage;
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.events.SelectionAdapter;
24 import org.eclipse.swt.events.SelectionEvent;
25 import org.eclipse.swt.widgets.Composite;
26 import org.eclipse.swt.widgets.Display;
27
28 import eu.etaxonomy.cdm.model.common.Language;
29 import eu.etaxonomy.cdm.model.common.LanguageString;
30 import eu.etaxonomy.cdm.model.common.MultilanguageTextHelper;
31 import eu.etaxonomy.cdm.model.term.TermType;
32 import eu.etaxonomy.taxeditor.model.MessagingUtils;
33 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
34 import eu.etaxonomy.taxeditor.store.CdmStore;
35 import eu.etaxonomy.taxeditor.ui.combo.term.TermComboElement;
36 import eu.etaxonomy.taxeditor.ui.element.CdmFormFactory;
37 import eu.etaxonomy.taxeditor.ui.element.CdmPropertyChangeEvent;
38 import eu.etaxonomy.taxeditor.ui.element.ICdmFormElement;
39 import eu.etaxonomy.taxeditor.ui.element.LanguageStringWithLabelElement;
40 import eu.etaxonomy.taxeditor.ui.element.LayoutConstants;
41 import eu.etaxonomy.taxeditor.ui.element.MultilanguageTextElement;
42 import eu.etaxonomy.taxeditor.ui.element.RootElement;
43
44 /**
45 * <p>TranslationWizardPage class.</p>
46 *
47 * @author n.hoffmann
48 * @created Sep 29, 2010
49 */
50 public class TranslationWizardPage extends WizardPage implements IPropertyChangeListener{
51
52 private static int TEXT_HEIGHT = 400;
53
54 private final Map<Language, LanguageString> multilanguageText;
55
56 MultilanguageTextElement source;
57
58 private final CdmFormFactory formFactory;
59
60 private TermComboElement<Language> combo_sourceLanguage;
61
62 private LanguageStringWithLabelElement text_source;
63
64 private TermComboElement<Language> combo_targetLanguage;
65
66 private LanguageStringWithLabelElement text_target;
67
68 private Language selectedLanguage;
69
70 /**
71 * <p>Constructor for TranslationWizardPage.</p>
72 *
73 * @param multilanguageText a {@link java.util.Map} object.
74 */
75 protected TranslationWizardPage(Map<Language, LanguageString> multilanguageText, Language selectedLanguage) {
76 super("TranslationWizardPage");
77 Assert.isNotNull(multilanguageText, "Multilanguage text may not be null");
78 setTitle("Add or edit translations.");
79 this.multilanguageText = multilanguageText;
80 this.selectedLanguage = selectedLanguage;
81 formFactory = new CdmFormFactory(Display.getCurrent());
82 setPageComplete(false);
83 }
84
85 /* (non-Javadoc)
86 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
87 */
88 /** {@inheritDoc} */
89 @Override
90 public void createControl(Composite parent) {
91 Composite control = formFactory.createComposite(parent);
92 // control.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN));
93 control.setLayout(LayoutConstants.LAYOUT(2, true));
94
95 Composite leftContainer = formFactory.createComposite(control);
96 leftContainer.setLayoutData(LayoutConstants.FILL());
97 leftContainer.setLayout(LayoutConstants.LAYOUT(1, false));
98 // leftContainer.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
99 RootElement leftRoot = new RootElement(formFactory, leftContainer);
100
101 Composite rightContainer = formFactory.createComposite(control);
102 rightContainer.setLayoutData(LayoutConstants.FILL());
103 rightContainer.setLayout(LayoutConstants.LAYOUT(1, false));
104 // rightContainer.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED));
105 RootElement rightRoot = new RootElement(formFactory, rightContainer);
106
107 createLeftControls(leftRoot);
108 createRightControls(rightRoot);
109
110
111 // initialize with default language
112 setSource(CdmStore.getDefaultLanguage());
113
114
115 setControl(control);
116 }
117
118 /**
119 * @param defaultLanguage
120 */
121 private void setSource(Language language) {
122
123 List<Language> languages = Arrays.asList(new Language[]{language});
124
125 LanguageString preferredLanguageString = MultilanguageTextHelper.getPreferredLanguageString(multilanguageText, languages);
126
127 if(preferredLanguageString != null){
128 combo_sourceLanguage.setSelection(preferredLanguageString.getLanguage());
129 text_source.setLanguageString(preferredLanguageString);
130 }
131 }
132
133
134 /**
135 *
136 * @param element
137 */
138 private void createLeftControls(ICdmFormElement element){
139
140 combo_sourceLanguage = formFactory.createDefinedTermComboElement(TermType.Language, element, null, null, false,SWT.NULL);
141
142 combo_sourceLanguage.setTerms(getLanguages());
143
144 combo_sourceLanguage.addSelectionListener(new SelectionAdapter() {
145 /* (non-Javadoc)
146 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
147 */
148 @Override
149 public void widgetSelected(SelectionEvent e) {
150 text_source.setLanguageString(multilanguageText.get(combo_sourceLanguage.getSelection()));
151 }
152 });
153
154 LanguageString preferredLanguageString = MultilanguageTextHelper.getPreferredLanguageString(multilanguageText, getLanguages());
155 if (preferredLanguageString == null){
156 preferredLanguageString = LanguageString.NewInstance("", PreferencesUtil.getGlobalLanguage());
157 }
158 text_source = formFactory.createLanguageStringWithLabelElement(element, null, preferredLanguageString, TEXT_HEIGHT, false, SWT.NULL);
159
160 // text_source.setEnabled(false);
161
162 text_source.setText(preferredLanguageString.getText());
163 }
164
165 /**
166 *
167 * @param element
168 */
169 private void createRightControls(ICdmFormElement element){
170 combo_targetLanguage = formFactory.createDefinedTermComboElement(TermType.Language, element, null, null,false, SWT.NULL);
171
172 combo_targetLanguage.addSelectionListener(new SelectionAdapter() {
173 /* (non-Javadoc)
174 * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
175 */
176 @Override
177 public void widgetSelected(SelectionEvent e) {
178 Language language = combo_targetLanguage.getSelection();
179
180 if (language == null){
181 setPageComplete(false);
182 return;
183 }
184
185 setPageComplete(true);
186 LanguageString languageString;
187
188 if(multilanguageText.containsKey(language)){
189 languageString = multilanguageText.get(language);
190 }else{
191 languageString = LanguageString.NewInstance("", language);
192 }
193
194 text_target.setLanguageString(languageString);
195 }
196 });
197
198 text_target = formFactory.createLanguageStringWithLabelElement(element, null, null, TEXT_HEIGHT, false, SWT.NULL);
199
200
201 Language lang = combo_targetLanguage.getTerms().get(0);
202 LanguageString langString;
203 LanguageString preferredLanguageString = MultilanguageTextHelper.getPreferredLanguageString(multilanguageText, null);
204 if (preferredLanguageString.getLanguage().equals(selectedLanguage)) {
205 langString = multilanguageText.get(lang);
206 if (langString == null) {
207 Set<Language> alreadyExisting = multilanguageText.keySet();
208 for (Language langExist: alreadyExisting) {
209 if (!langExist.equals(preferredLanguageString.getLanguage())) {
210 langString = multilanguageText.get(langExist);
211 lang = langExist;
212 break;
213 }
214 }
215 }
216 } else {
217 langString = multilanguageText.get(selectedLanguage);
218 lang = selectedLanguage;
219 }
220 if (langString != null) {
221 text_target.setLanguageString(langString);
222 combo_targetLanguage.setSelection(lang);
223 setPageComplete(true);
224 }
225
226
227 //
228 // The automated translation did rely on the Google Translate API. Unfortunately this service is not free anymore.
229 // See http://code.google.com/apis/language/translate/overview.html
230 //
231 // Button button_translationService = formFactory.createButton(element.getLayoutComposite(), "Translate", SWT.PUSH);
232 // button_translationService.addSelectionListener(new SelectionAdapter() {
233 // /* (non-Javadoc)
234 // * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
235 // */
236 // @Override
237 // public void widgetSelected(SelectionEvent event) {
238 // ITranslationServiceWrapper service = new GoogleLanguageApiWrapper();
239 // String translatedText;
240 // try {
241 // String text = text_source.getText();
242 // Language sourceLanguage = text_source.getLanguageString().getLanguage();
243 // Language targetLanguage = combo_targetLanguage.getSelection();
244 //
245 // if(targetLanguage == null){
246 // StoreUtil.warningDialog("Please select a target language", TranslationWizardPage.class, "Please select a language from the combo box at the right.");
247 // return;
248 // }
249 //
250 // translatedText = service.translate(text, sourceLanguage, targetLanguage);
251 // text_target.setText(translatedText);
252 // } catch (LanguageNotSupportedException e) {
253 // StoreUtil.warningDialog("Language not supported", TranslationWizardPage.class, "The chosen language is not supported by the translation service.");
254 // } catch (Exception e){
255 // StoreUtil.warningDialog("Error translating text", TranslationWizardPage.class, e.getMessage());
256 // }
257 //
258 // }
259 // });
260 }
261
262
263 /**
264 *
265 * @return
266 */
267 private List<Language> getLanguages(){
268 Set<Language> languageSet = MultilanguageTextHelper.getLanguages(multilanguageText);
269
270 List<Language> languageList = new ArrayList<Language>();
271 // protect against corrupt language sets
272 for (Language language : languageSet){
273 if (language != null){
274 languageList.add(language);
275 }else{
276 MessagingUtils.warningDialog("Empty languages", getClass(), "The multilanguage string contains invalid data. Please contact the administrator of you datasource.");
277 }
278 }
279
280 return languageList;
281 }
282
283 /* (non-Javadoc)
284 * @see org.eclipse.jface.dialogs.DialogPage#dispose()
285 */
286 /** {@inheritDoc} */
287 @Override
288 public void dispose() {
289 super.dispose();
290 }
291
292 /**
293 * @return
294 *
295 */
296 public LanguageString getTargetLanguageString() {
297 return text_target.getLanguageString();
298 }
299
300
301
302 @Override
303 public void propertyChange(PropertyChangeEvent event) {
304 if (event.getSource().equals(text_target)) {
305 setPageComplete(true);
306 }
307
308 }
309 }