2 * Copyright (C) 2019 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.taxeditor
.preference
;
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
;
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
;
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
;
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
;
59 protected boolean isOverride
;
60 protected boolean allowOverride
;
61 protected CdmPreference pref
;
62 protected IPreferencePredicate predicate
;
65 public GeneralTermPreference(){
70 public boolean isLocalPref() {
71 return !isAdminPreference
;
75 protected TermType type
;
77 public List
<TermVocabularyDto
> getVocabularies() {
81 public void setVocabularies(List
<TermVocabularyDto
> vocabularies
) {
82 this.vocabularies
= vocabularies
;
85 public IPreferencePredicate
getPredicate() {
89 public void setPredicate(PreferencePredicate predicate
) {
90 this.predicate
= predicate
;
97 protected Control
createContents(Composite parent
) {
98 Composite container
= new Composite(parent
, SWT
.NULL
);
99 getPreferenceValues();
100 if (isLocalPref() && !allowOverride
){
101 final CLabel description
= new CLabel(parent
, SWT
.NULL
);
102 description
.setText(Messages
.NameDetailsViewConfiguration_description_not_available
);
103 this.setDefaultButtonActivated(false);
107 final GridLayout gridLayout
= new GridLayout();
108 gridLayout
.numColumns
= 2;
109 container
.setLayout(gridLayout
);
110 parent
.setLayout(new GridLayout());
111 useLocalOrAdmin
= new Combo(parent
, SWT
.BORDER
| SWT
.READ_ONLY
);
112 if (!isAdminPreference
){
113 useLocalOrAdmin
.add(LocalOrDefaultEnum
.Default
.getLabel(), 0);
114 useLocalOrAdmin
.add(LocalOrDefaultEnum
.Local
.getLabel(), 1);
117 useLocalOrAdmin
.add(LocalOrDefaultEnum
.AllowOverride
.getLabel(), 0);
118 useLocalOrAdmin
.add(LocalOrDefaultEnum
.Database
.getLabel(), 1);
122 treeComposite
= new CheckBoxTreeComposite(container
, new TermDtoContentProvider(), new TermDtoLabelProvider(), SWT
.NONE
);
123 treeComposite
.getViewer().setComparator(new DefinedTermSorter());
124 rememberCheckedValues(getCheckedValuesFromPreferences());
128 useLocalOrAdmin
.select(1);
130 useLocalOrAdmin
.select(0);
131 treeComposite
.setEnabled(false);
135 useLocalOrAdmin
.select(0);
137 useLocalOrAdmin
.select(1);
140 useLocalOrAdmin
.addSelectionListener(this);
142 GridData data
= new GridData(SWT
.FILL
, SWT
.FILL
, true, true, 1, 1);
143 data
.heightHint
= 300;
144 treeComposite
.setLayoutData(data
);
145 treeComposite
.getViewer().addSelectionChangedListener(this);
151 public String
getCheckedValuesFromPreferences(){
153 if (!isAdminPreference
&& isOverride
){
154 values
= PreferencesUtil
.getStringValue(predicate
.getKey(), true);
156 values
= pref
!= null ?pref
.getValue(): null;
161 protected void rememberCheckedValues(String checkedValues
) {
162 initialiseVocabularies();
163 treeComposite
.getViewer().getTree().deselectAll();
164 treeComposite
.getViewer().refresh();
165 treeComposite
.getViewer().setInput(getVocabularies());
167 if (checkedValues
!= null && checkedValues
!= "") { //$NON-NLS-1$
168 String
[] listChecked
= checkedValues
.split(";"); //$NON-NLS-1$
169 String
[] listCheckedComma
= checkedValues
.split(","); //$NON-NLS-1$
170 List
<String
> checked
= new ArrayList
<>();
171 if (listChecked
!= null ){
172 checked
= Arrays
.asList(listChecked
);
174 if (listCheckedComma
!= null && checkedValues
.contains(",")){ //$NON-NLS-1$
175 checked
= Arrays
.asList(listCheckedComma
);
177 List
<AbstractTermDto
> termsFromStringValues
= getTermsFromStringValues(checked
);
178 treeComposite
.setCheckedElements(termsFromStringValues
.toArray());
181 List
<AbstractTermDto
> termsFromStringValues
= getTermsFromStringValues(new ArrayList
<String
>());
182 treeComposite
.setCheckedElements(termsFromStringValues
.toArray());
183 treeComposite
.getViewer().refresh();
184 treeComposite
.redraw();
189 protected List
<AbstractTermDto
> getTermsFromStringValues(List
<String
> listValue
) {
190 List
<AbstractTermDto
> termlist
= new ArrayList
<>();
191 ITermService termService
= CdmStore
.getService(ITermService
.class);
192 for (String s
: listValue
) {
193 if (!StringUtils
.isBlank(s
)){
194 UUID uuid
= UUID
.fromString(s
);
196 DefinedTermBase definedTermBase
= termService
.load(uuid
);
197 if(definedTermBase
!= null){
198 termlist
.add(TermDto
.fromTerm(definedTermBase
, true));
200 IVocabularyService vocabularyService
= CdmStore
.getService(IVocabularyService
.class);
201 TermVocabulary termVocabulary
= vocabularyService
.load(uuid
);
202 if (termVocabulary
!= null){
203 termlist
.add(new TermVocabularyDto(uuid
, termVocabulary
.getRepresentations(), termVocabulary
.getTermType()));
208 if (listValue
.isEmpty()){
209 List
<DefinedTermBase
> terms
= CdmStore
.getTermManager().getAllTerms(type
, null);
210 for (DefinedTermBase term
: terms
){
211 if (!(term
instanceof eu
.etaxonomy
.cdm
.model
.description
.Character
) && term
!= null){
212 termlist
.add(TermDto
.fromTerm(term
, true));
220 protected void initialiseVocabularies() {
221 if (getVocabularies() != null) {
222 getVocabularies().clear();
224 List
<TermVocabularyDto
> vocs
= new ArrayList
<>();
225 vocs
= CdmStore
.getService(IVocabularyService
.class).findVocabularyDtoByTermType(type
);
227 setVocabularies(vocs
);
230 protected void getPreferenceValues(){
231 pref
= PreferencesUtil
.getPreferenceFromDB(predicate
);
232 this.allowOverride
= pref
!= null?pref
.isAllowOverride():true;
233 this.isOverride
= PreferencesUtil
.getBooleanValue(PreferencesUtil
.createOverridePreferenceString(predicate
.getKey()));
235 pref
= CdmPreference
.NewTaxEditorInstance(predicate
, null);
243 public void selectionChanged(SelectionChangedEvent event
) {
251 public void widgetSelected(SelectionEvent e
) {
252 if (e
.getSource().equals(useLocalOrAdmin
)){
253 if (useLocalOrAdmin
.getText().equals(LocalOrDefaultEnum
.Default
.getLabel())){
254 rememberCheckedValues(getCheckedValuesFromPreferences());
255 treeComposite
.setEnabled(false);
257 treeComposite
.setEnabled(true);
267 public void widgetDefaultSelected(SelectionEvent e
) {
268 // TODO Auto-generated method stub
273 protected void performDefaults(){
275 rememberCheckedValues("");
276 treeComposite
.setEnabled(true);
279 rememberCheckedValues(getCheckedValuesFromPreferences());
280 treeComposite
.setEnabled(false);
283 useLocalOrAdmin
.select(0);
286 super.performDefaults();
291 public boolean performOk() {
295 Object
[] checkedElements
= treeComposite
.getViewer().getCheckedElements();
296 List
<UUID
> listUIIDChecked
= new ArrayList
<>();
297 Collection
<TermDto
> preferredTermDtos
= new ArrayList
<>();
298 List
<DefinedTermBase
> preferredTerms
= new ArrayList
<>();
299 for (Object o
: checkedElements
) {
300 if(o
instanceof TermDto
){
301 TermDto termDto
= (TermDto
) o
;
302 listUIIDChecked
.add(termDto
.getUuid());
303 preferredTermDtos
.add(termDto
);
304 if (vocabularies
.size() > 1){
305 preferredTerms
.add(CdmStore
.getService(ITermService
.class).load(termDto
.getUuid()));
310 String saveCheckedElements
= StringUtils
.join(listUIIDChecked
, ";"); //$NON-NLS-1$
312 PreferencesUtil
.setStringValue(predicate
.getKey(), saveCheckedElements
);
313 String text
= this.useLocalOrAdmin
.getText();
314 if (text
.equals(LocalOrDefaultEnum
.Database
.getLabel()) || text
.equals(LocalOrDefaultEnum
.Default
.getLabel())){
315 PreferencesUtil
.setBooleanValue(PreferencesUtil
.createOverridePreferenceString(predicate
.getKey()), false);
316 }else if (text
.equals(LocalOrDefaultEnum
.Local
.getLabel())){
317 PreferencesUtil
.setBooleanValue(PreferencesUtil
.createOverridePreferenceString(predicate
.getKey()), true);
320 CdmStore
.getTermManager().setPreferredTermsByDto(preferredTermDtos
, vocabularies
.get(0));
322 CdmStore
.getTermManager().setPreferredTermsByType(preferredTermDtos
, type
);
324 PreferencesUtil
.firePreferencesChanged(this.getClass());
328 protected boolean performOkAdmin() {
329 Object
[] checkedElements
= treeComposite
.getViewer().getCheckedElements();
330 List
<UUID
> listUIIDChecked
= new ArrayList
<>();
331 List
<DefinedTermBase
> preferredTerms
= new ArrayList
<>();
332 for (Object o
: checkedElements
) {
333 if(o
instanceof TermDto
){
334 TermDto termDto
= (TermDto
) o
;
335 listUIIDChecked
.add(termDto
.getUuid());
336 preferredTerms
.add(CdmStore
.getService(ITermService
.class).load(termDto
.getUuid()));
339 String saveCheckedElements
= StringUtils
.join(listUIIDChecked
, ";"); //$NON-NLS-1$
340 if (StringUtils
.isBlank(saveCheckedElements
)){
341 saveCheckedElements
= null;
343 CdmPreference savePref
= CdmPreference
.NewTaxEditorInstance(predicate
, saveCheckedElements
);
344 String text
= this.useLocalOrAdmin
.getText();
345 if (text
.equals(LocalOrDefaultEnum
.Database
.getLabel()) ){
346 savePref
.setAllowOverride(false);
347 }else if (text
.equals(LocalOrDefaultEnum
.AllowOverride
.getLabel())){
348 savePref
.setAllowOverride(true);
351 PreferencesUtil
.setPreferenceToDB(savePref
);
352 PreferencesUtil
.updateDBPreferences();
353 PreferencesUtil
.firePreferencesChanged(this.getClass());