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