ref #8385: better handling of distr preferences and term related preferences
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / GeneralTermPreference.java
1 /**
2 * Copyright (C) 2019 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 package eu.etaxonomy.taxeditor.preference;
10
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.UUID;
16
17 import org.apache.commons.lang.StringUtils;
18 import org.eclipse.jface.viewers.ISelectionChangedListener;
19 import org.eclipse.jface.viewers.SelectionChangedEvent;
20 import org.eclipse.swt.SWT;
21 import org.eclipse.swt.custom.CLabel;
22 import org.eclipse.swt.events.SelectionEvent;
23 import org.eclipse.swt.events.SelectionListener;
24 import org.eclipse.swt.layout.GridData;
25 import org.eclipse.swt.layout.GridLayout;
26 import org.eclipse.swt.widgets.Combo;
27 import org.eclipse.swt.widgets.Composite;
28 import org.eclipse.swt.widgets.Control;
29
30 import eu.etaxonomy.cdm.api.service.ITermService;
31 import eu.etaxonomy.cdm.api.service.IVocabularyService;
32 import eu.etaxonomy.cdm.model.metadata.CdmPreference;
33 import eu.etaxonomy.cdm.model.metadata.IPreferencePredicate;
34 import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
35 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
36 import eu.etaxonomy.cdm.model.term.TermType;
37 import eu.etaxonomy.cdm.model.term.TermVocabulary;
38 import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
39 import eu.etaxonomy.cdm.persistence.dto.TermDto;
40 import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
41 import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermSorter;
42 import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoContentProvider;
43 import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoLabelProvider;
44 import eu.etaxonomy.taxeditor.l10n.Messages;
45 import eu.etaxonomy.taxeditor.preference.menu.CdmPreferencePage;
46 import eu.etaxonomy.taxeditor.preference.wizard.CheckBoxTreeComposite;
47 import eu.etaxonomy.taxeditor.store.CdmStore;
48
49 /**
50 * @author k.luther
51 * @since 05.06.2019
52 *
53 */
54 abstract public class GeneralTermPreference extends CdmPreferencePage implements ISelectionChangedListener, SelectionListener{
55 protected CheckBoxTreeComposite treeComposite;
56 protected List<TermVocabularyDto> vocabularies = new ArrayList<>();
57 protected Combo useLocalOrAdmin ;
58
59 protected boolean isOverride;
60 protected boolean allowOverride;
61 protected CdmPreference pref;
62 protected IPreferencePredicate predicate;
63 protected boolean localPref;
64
65 public GeneralTermPreference(){
66 super();
67
68 }
69
70 public boolean isLocalPref() {
71 return localPref;
72 }
73
74 public void setLocalPref(boolean localPref) {
75 this.localPref = localPref;
76 }
77
78 protected TermType type;
79
80 public List<TermVocabularyDto> getVocabularies() {
81 return vocabularies;
82 }
83
84 public void setVocabularies(List<TermVocabularyDto> vocabularies) {
85 this.vocabularies = vocabularies;
86 }
87
88 public IPreferencePredicate getPredicate() {
89 return predicate;
90 }
91
92 public void setPredicate(PreferencePredicate predicate) {
93 this.predicate = predicate;
94 }
95
96 /**
97 * {@inheritDoc}
98 */
99 @Override
100 protected Control createContents(Composite parent) {
101 Composite container = new Composite(parent, SWT.NULL);
102 getPreferenceValues();
103 if (isLocalPref() && !allowOverride){
104 final CLabel description = new CLabel(parent, SWT.NULL);
105 description.setText(Messages.NameDetailsViewConfiguration_description_not_available);
106 this.setDefaultButtonActivated(false);
107 return parent;
108
109 }
110 final GridLayout gridLayout = new GridLayout();
111 gridLayout.numColumns = 2;
112 container.setLayout(gridLayout);
113 parent.setLayout(new GridLayout());
114 useLocalOrAdmin = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
115 if (localPref){
116 useLocalOrAdmin.add(LocalOrDefaultEnum.Default.getLabel(), 0);
117 useLocalOrAdmin.add(LocalOrDefaultEnum.Local.getLabel(), 1);
118
119 }else{
120 useLocalOrAdmin.add(LocalOrDefaultEnum.AllowOverride.getLabel(), 0);
121 useLocalOrAdmin.add(LocalOrDefaultEnum.Database.getLabel(), 1);
122 }
123
124
125 treeComposite = new CheckBoxTreeComposite(container, new TermDtoContentProvider(), new TermDtoLabelProvider(), SWT.NONE);
126 treeComposite.getViewer().setComparator(new DefinedTermSorter());
127 rememberCheckedValues(getCheckedValuesFromPreferences());
128
129 if (isLocalPref()){
130 if (isOverride){
131 useLocalOrAdmin.select(1);
132 }else{
133 useLocalOrAdmin.select(0);
134 treeComposite.setEnabled(false);
135 }
136 }else{
137 if (allowOverride){
138 useLocalOrAdmin.select(0);
139 }else{
140 useLocalOrAdmin.select(1);
141 }
142 }
143 useLocalOrAdmin.addSelectionListener(this);
144
145 GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
146 data.heightHint = 300;
147 treeComposite.setLayoutData(data);
148 treeComposite.getViewer().addSelectionChangedListener(this);
149
150 return container;
151
152 }
153
154 public String getCheckedValuesFromPreferences(){
155 String values;
156 if (localPref && isOverride){
157 values = PreferencesUtil.getStringValue(predicate.getKey(), true);
158 }else{
159 values = pref != null ?pref.getValue(): null;
160 }
161 return values;
162 }
163
164 protected void rememberCheckedValues(String checkedValues) {
165 initialiseVocabularies();
166 treeComposite.getViewer().getTree().deselectAll();
167 treeComposite.getViewer().refresh();
168 treeComposite.getViewer().setInput(getVocabularies());
169
170 if (checkedValues != null && checkedValues != "") { //$NON-NLS-1$
171 String[] listChecked = checkedValues.split(";"); //$NON-NLS-1$
172 String[] listCheckedComma = checkedValues.split(","); //$NON-NLS-1$
173 List<String> checked = new ArrayList<>();
174 if (listChecked != null ){
175 checked = Arrays.asList(listChecked);
176 }
177 if (listCheckedComma != null && checkedValues.contains(",")){ //$NON-NLS-1$
178 checked = Arrays.asList(listCheckedComma);
179 }
180 List<AbstractTermDto> termsFromStringValues = getTermsFromStringValues(checked);
181 treeComposite.setCheckedElements(termsFromStringValues.toArray());
182
183 }else{
184 List<AbstractTermDto> termsFromStringValues = getTermsFromStringValues(new ArrayList<String>());
185 treeComposite.setCheckedElements(termsFromStringValues.toArray());
186 treeComposite.getViewer().refresh();
187 treeComposite.redraw();
188
189 }
190 }
191
192 protected List<AbstractTermDto> getTermsFromStringValues(List<String> listValue) {
193 List<AbstractTermDto> termlist = new ArrayList<>();
194 ITermService termService = CdmStore.getService(ITermService.class);
195 for (String s : listValue) {
196 if (!StringUtils.isBlank(s)){
197 UUID uuid = UUID.fromString(s);
198
199 DefinedTermBase definedTermBase = termService.load(uuid);
200 if(definedTermBase != null){
201 termlist.add(TermDto.fromTerm(definedTermBase, true));
202 }else{
203 IVocabularyService vocabularyService = CdmStore.getService(IVocabularyService.class);
204 TermVocabulary termVocabulary = vocabularyService.load(uuid);
205 if (termVocabulary != null){
206 termlist.add(new TermVocabularyDto(uuid, termVocabulary.getRepresentations(), termVocabulary.getTermType()));
207 }
208 }
209 }
210 }
211 if (listValue.isEmpty()){
212 List<DefinedTermBase> terms = CdmStore.getTermManager().getAllTerms(type, null);
213 for (DefinedTermBase term: terms){
214 if (!(term instanceof eu.etaxonomy.cdm.model.description.Character) && term != null){
215 termlist.add(TermDto.fromTerm(term, true));
216 }
217 }
218 }
219
220 return termlist;
221 }
222
223 protected void initialiseVocabularies() {
224 if (getVocabularies() != null) {
225 getVocabularies().clear();
226 }
227 List<TermVocabularyDto> vocs = new ArrayList<>();
228 vocs = CdmStore.getService(IVocabularyService.class).findVocabularyDtoByTermType(type);
229
230 setVocabularies(vocs);
231 }
232
233 protected void getPreferenceValues(){
234 pref = PreferencesUtil.getPreferenceFromDB(predicate);
235 this.allowOverride = pref!= null?pref.isAllowOverride():true;
236 this.isOverride = PreferencesUtil.getBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()));
237 if (pref == null){
238 pref = CdmPreference.NewTaxEditorInstance(predicate, null);
239 }
240 }
241
242 /**
243 * {@inheritDoc}
244 */
245 @Override
246 public void selectionChanged(SelectionChangedEvent event) {
247 this.setApply(true);
248 }
249
250 /**
251 * {@inheritDoc}
252 */
253 @Override
254 public void widgetSelected(SelectionEvent e) {
255 if (e.getSource().equals(useLocalOrAdmin)){
256 if (useLocalOrAdmin.getText().equals(LocalOrDefaultEnum.Default.getLabel())){
257 rememberCheckedValues(getCheckedValuesFromPreferences());
258 treeComposite.setEnabled(false);
259 }else{
260 treeComposite.setEnabled(true);
261 }
262 }
263 this.setApply(true);
264 }
265
266 /**
267 * {@inheritDoc}
268 */
269 @Override
270 public void widgetDefaultSelected(SelectionEvent e) {
271 // TODO Auto-generated method stub
272
273 }
274
275 @Override
276 protected void performDefaults(){
277 if (!isLocalPref()){
278 rememberCheckedValues("");
279 treeComposite.setEnabled(true);
280 }else{
281 isOverride = false;
282 rememberCheckedValues(getCheckedValuesFromPreferences());
283 treeComposite.setEnabled(false);
284 }
285 pref = null;
286 useLocalOrAdmin.select(0);
287
288 setApply(true);
289 super.performDefaults();
290
291 }
292
293 @Override
294 public boolean performOk() {
295 if (!isApply()){
296 return true;
297 }
298 Object[] checkedElements = treeComposite.getViewer().getCheckedElements();
299 List<UUID> listUIIDChecked = new ArrayList<>();
300 Collection<TermDto> preferredTermDtos = new ArrayList<>();
301 List<DefinedTermBase> preferredTerms = new ArrayList<>();
302 for (Object o : checkedElements) {
303 if(o instanceof TermDto){
304 TermDto termDto = (TermDto) o;
305 listUIIDChecked.add(termDto.getUuid());
306 preferredTermDtos.add(termDto);
307 if (vocabularies.size() > 1){
308 preferredTerms.add(CdmStore.getService(ITermService.class).load(termDto.getUuid()));
309 }
310
311 }
312 }
313 String saveCheckedElements = StringUtils.join(listUIIDChecked, ";"); //$NON-NLS-1$
314
315 PreferencesUtil.setStringValue(predicate.getKey(), saveCheckedElements);
316 String text = this.useLocalOrAdmin.getText();
317 if (text.equals(LocalOrDefaultEnum.Database.getLabel()) || text.equals(LocalOrDefaultEnum.Default.getLabel())){
318 PreferencesUtil.setBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()), false);
319 }else if (text.equals(LocalOrDefaultEnum.Local.getLabel())){
320 PreferencesUtil.setBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()), true);
321 }
322 if (type == null){
323 CdmStore.getTermManager().setPreferredTermsByDto(preferredTermDtos, vocabularies.get(0));
324 }else{
325 CdmStore.getTermManager().setPreferredTermsByType(preferredTermDtos, type);
326 }
327 PreferencesUtil.firePreferencesChanged(this.getClass());
328 return true;
329 }
330
331 protected boolean performOkAdmin() {
332 Object[] checkedElements = treeComposite.getViewer().getCheckedElements();
333 List<UUID> listUIIDChecked = new ArrayList<>();
334 List<DefinedTermBase> preferredTerms = new ArrayList<>();
335 for (Object o : checkedElements) {
336 if(o instanceof TermDto){
337 TermDto termDto = (TermDto) o;
338 listUIIDChecked.add(termDto.getUuid());
339 preferredTerms.add(CdmStore.getService(ITermService.class).load(termDto.getUuid()));
340 }
341 }
342 String saveCheckedElements = StringUtils.join(listUIIDChecked, ";"); //$NON-NLS-1$
343 if (StringUtils.isBlank(saveCheckedElements)){
344 saveCheckedElements = null;
345 }
346 CdmPreference savePref = CdmPreference.NewTaxEditorInstance(predicate, saveCheckedElements);
347 String text = this.useLocalOrAdmin.getText();
348 if (text.equals(LocalOrDefaultEnum.Database.getLabel()) ){
349 savePref.setAllowOverride(false);
350 }else if (text.equals(LocalOrDefaultEnum.AllowOverride.getLabel())){
351 savePref.setAllowOverride(true);
352 }
353
354 PreferencesUtil.setPreferenceToDB(savePref);
355 PreferencesUtil.updateDBPreferences();
356 PreferencesUtil.firePreferencesChanged(this.getClass());
357 return true;
358 }
359
360 }