Project

General

Profile

Download (12.3 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(3-3/57)