Project

General

Profile

Download (11.9 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.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.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
    protected CheckBoxTreeComposite treeComposite;
55
    protected List<TermVocabularyDto> vocabularies = new ArrayList<>();
56
    protected Combo useLocalOrAdmin ;
57

    
58
    protected boolean isOverride;
59
    protected boolean allowOverride;
60
    protected CdmPreference pref;
61
    protected IPreferencePredicate predicate;
62

    
63

    
64
    public AbstractGeneralTermPreference(){
65
        super();
66

    
67
    }
68

    
69
    public boolean isLocalPref() {
70
        return !isAdminPreference;
71
    }
72

    
73

    
74
    protected TermType type;
75

    
76
    public List<TermVocabularyDto> getVocabularies() {
77
        return vocabularies;
78
    }
79

    
80
    public void setVocabularies(List<TermVocabularyDto> vocabularies) {
81
        this.vocabularies = vocabularies;
82
    }
83

    
84
    public IPreferencePredicate getPredicate() {
85
        return predicate;
86
    }
87

    
88
    public void setPredicate(PreferencePredicate predicate) {
89
        this.predicate = predicate;
90
    }
91

    
92
    /**
93
     * {@inheritDoc}
94
     */
95
    @Override
96
    protected Control createContents(Composite parent) {
97
        Composite container = new Composite(parent, SWT.NULL);
98
        getPreferenceValues();
99
        if (isLocalPref() && !allowOverride){
100
            final CLabel description = new CLabel(parent, SWT.NULL);
101
            description.setText(Messages.NameDetailsViewConfiguration_description_not_available);
102
            this.setDefaultButtonActivated(false);
103
            return parent;
104

    
105
        }
106
        final GridLayout gridLayout = new GridLayout();
107
        gridLayout.numColumns = 2;
108
        container.setLayout(gridLayout);
109
        parent.setLayout(new GridLayout());
110
        useLocalOrAdmin = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
111
        if (!isAdminPreference){
112
            useLocalOrAdmin.add(LocalOrDefaultEnum.Default.getLabel(), 0);
113
            useLocalOrAdmin.add(LocalOrDefaultEnum.Local.getLabel(), 1);
114

    
115
        }else{
116
            useLocalOrAdmin.add(LocalOrDefaultEnum.AllowOverride.getLabel(), 0);
117
            useLocalOrAdmin.add(LocalOrDefaultEnum.Database.getLabel(), 1);
118
        }
119

    
120

    
121
        treeComposite = new CheckBoxTreeComposite(container, new TermDtoContentProvider(), new TermDtoLabelProvider(), SWT.SCROLL_PAGE);
122
        treeComposite.getViewer().setComparator(new DefinedTermSorter());
123
        rememberCheckedValues(getCheckedValuesFromPreferences());
124

    
125
        if (isLocalPref()){
126
            if (isOverride){
127
                useLocalOrAdmin.select(1);
128
            }else{
129
                useLocalOrAdmin.select(0);
130
                treeComposite.getViewer().getTree().setSelection(treeComposite.getViewer().getTree().getTopItem());
131
                treeComposite.setEnabled(false);
132

    
133
                //treeComposite.getViewer().getTree().getVerticalBar().setEnabled(true);
134
            }
135
        }else{
136
            if (allowOverride){
137
                useLocalOrAdmin.select(0);
138
            }else{
139
                useLocalOrAdmin.select(1);
140
            }
141
        }
142
        useLocalOrAdmin.addSelectionListener(this);
143

    
144
        GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
145
        data.heightHint = 300;
146
        treeComposite.setLayoutData(data);
147
        treeComposite.getViewer().addSelectionChangedListener(this);
148

    
149
        return container;
150

    
151
    }
152

    
153
    public String getCheckedValuesFromPreferences(){
154
        String values;
155
        if (!isAdminPreference && isOverride){
156
            values = PreferencesUtil.getStringValue(predicate.getKey(), true);
157
        }else{
158
            values = pref != null ?pref.getValue(): null;
159
        }
160
        return values;
161
    }
162

    
163
    protected void rememberCheckedValues(String checkedValues) {
164
        initialiseVocabularies();
165
        treeComposite.getViewer().getTree().deselectAll();
166
        treeComposite.getViewer().refresh();
167
        treeComposite.getViewer().setInput(getVocabularies());
168

    
169
        if (checkedValues != null && checkedValues != "") { //$NON-NLS-1$
170
            String[] listChecked = checkedValues.split(";"); //$NON-NLS-1$
171
            String[] listCheckedComma = checkedValues.split(","); //$NON-NLS-1$
172
            List<String> checked = new ArrayList<>();
173
            if (listChecked != null ){
174
                checked = Arrays.asList(listChecked);
175
            }
176
            if (listCheckedComma != null && checkedValues.contains(",")){ //$NON-NLS-1$
177
                checked = Arrays.asList(listCheckedComma);
178
            }
179
            List<T> termsFromStringValues = getTermsFromStringValues(checked);
180
            treeComposite.setCheckedElements(termsFromStringValues.toArray());
181

    
182
        }else{
183
            List<T> termsFromStringValues = getTermsFromStringValues(new ArrayList<String>());
184
            treeComposite.setCheckedElements(termsFromStringValues.toArray());
185
            treeComposite.getViewer().refresh();
186
            treeComposite.redraw();
187

    
188
        }
189
    }
190

    
191
    protected abstract List<T> getTermsFromStringValues(List<String> listValue);
192

    
193
    protected void initialiseVocabularies() {
194
        if (getVocabularies() != null) {
195
            getVocabularies().clear();
196
        }
197
        List<TermVocabularyDto> vocs = new ArrayList<>();
198
        vocs = CdmStore.getService(IVocabularyService.class).findVocabularyDtoByTermType(type);
199

    
200
        setVocabularies(vocs);
201
    }
202

    
203
    protected void getPreferenceValues(){
204
        pref = PreferencesUtil.getPreferenceFromDB(predicate);
205
        this.allowOverride = pref!= null?pref.isAllowOverride():true;
206
        this.isOverride = PreferencesUtil.getBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()));
207
        if (pref == null){
208
            pref = CdmPreference.NewTaxEditorInstance(predicate, null);
209
        }
210
    }
211

    
212
    /**
213
     * {@inheritDoc}
214
     */
215
    @Override
216
    public void selectionChanged(SelectionChangedEvent event) {
217
        this.setApply(true);
218
    }
219

    
220
    /**
221
     * {@inheritDoc}
222
     */
223
    @Override
224
    public void widgetSelected(SelectionEvent e) {
225
        if (e.getSource().equals(useLocalOrAdmin)){
226
            if (useLocalOrAdmin.getText().equals(LocalOrDefaultEnum.Default.getLabel())){
227
                rememberCheckedValues(getCheckedValuesFromPreferences());
228
                treeComposite.setEnabled(false);
229
            }else{
230
                treeComposite.setEnabled(true);
231
            }
232
        }
233
        this.setApply(true);
234
    }
235

    
236
    /**
237
     * {@inheritDoc}
238
     */
239
    @Override
240
    public void widgetDefaultSelected(SelectionEvent e) {
241
        // TODO Auto-generated method stub
242

    
243
    }
244

    
245
    @Override
246
    protected void performDefaults(){
247
        if (!isLocalPref()){
248
            rememberCheckedValues("");
249
            treeComposite.setEnabled(true);
250
        }else{
251
            isOverride = false;
252
            rememberCheckedValues(getCheckedValuesFromPreferences());
253
            treeComposite.setEnabled(false);
254
        }
255
       pref = null;
256
       useLocalOrAdmin.select(0);
257

    
258
       setApply(true);
259
       super.performDefaults();
260

    
261
    }
262

    
263
    @Override
264
    public boolean performOk() {
265
        if (!isApply()){
266
            return true;
267
        }
268
        Object[] checkedElements = treeComposite.getViewer().getCheckedElements();
269
        List<UUID> listUIIDChecked = new ArrayList<>();
270
        Collection<TermDto> preferredTermDtos = new ArrayList<>();
271
        List<DefinedTermBase> preferredTerms = new ArrayList<>();
272
        for (Object o : checkedElements) {
273
            if(o instanceof TermDto){
274
                TermDto termDto = (TermDto) o;
275
                listUIIDChecked.add(termDto.getUuid());
276
                preferredTermDtos.add(termDto);
277
                if (vocabularies.size() > 1){
278
                    preferredTerms.add(CdmStore.getService(ITermService.class).load(termDto.getUuid()));
279
                }
280

    
281
            }
282
        }
283
        String saveCheckedElements = StringUtils.join(listUIIDChecked, ";"); //$NON-NLS-1$
284

    
285
        PreferencesUtil.setStringValue(predicate.getKey(), saveCheckedElements);
286
        String text = this.useLocalOrAdmin.getText();
287
        if (text.equals(LocalOrDefaultEnum.Database.getLabel()) || text.equals(LocalOrDefaultEnum.Default.getLabel())){
288
            PreferencesUtil.setBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()), false);
289
        }else if (text.equals(LocalOrDefaultEnum.Local.getLabel())){
290
            PreferencesUtil.setBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()), true);
291
        }
292
        if (type == null){
293
            CdmStore.getTermManager().setPreferredTermsByDto(preferredTermDtos, vocabularies.get(0));
294
        }else{
295
            CdmStore.getTermManager().setPreferredTermsByType(preferredTermDtos, type);
296
        }
297
        PreferencesUtil.firePreferencesChanged(this.getClass());
298
        return true;
299
    }
300

    
301
    protected boolean performOkAdmin() {
302
        Object[] checkedElements = treeComposite.getViewer().getCheckedElements();
303
        List<UUID> listUIIDChecked = new ArrayList<>();
304
        List<DefinedTermBase> preferredTerms = new ArrayList<>();
305
        for (Object o : checkedElements) {
306
            if(o instanceof TermDto){
307
                TermDto termDto = (TermDto) o;
308
                listUIIDChecked.add(termDto.getUuid());
309
                preferredTerms.add(CdmStore.getService(ITermService.class).load(termDto.getUuid()));
310
            }
311
        }
312
        String saveCheckedElements = StringUtils.join(listUIIDChecked, ";"); //$NON-NLS-1$
313
        if (StringUtils.isBlank(saveCheckedElements)){
314
            saveCheckedElements = null;
315
        }
316
        CdmPreference savePref = CdmPreference.NewTaxEditorInstance(predicate, saveCheckedElements);
317
        String text = this.useLocalOrAdmin.getText();
318
        if (text.equals(LocalOrDefaultEnum.Database.getLabel()) ){
319
            savePref.setAllowOverride(false);
320
        }else if (text.equals(LocalOrDefaultEnum.AllowOverride.getLabel())){
321
            savePref.setAllowOverride(true);
322
        }
323

    
324
        PreferencesUtil.setPreferenceToDB(savePref);
325
        PreferencesUtil.updateDBPreferences();
326
        PreferencesUtil.firePreferencesChanged(this.getClass());
327
        return true;
328
    }
329

    
330
}
(3-3/55)