2 * Copyright (C) 2014 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
.wizard
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Arrays
;
13 import java
.util
.Collection
;
14 import java
.util
.HashMap
;
15 import java
.util
.HashSet
;
16 import java
.util
.List
;
19 import java
.util
.UUID
;
21 import org
.apache
.commons
.lang
.StringUtils
;
22 import org
.eclipse
.jface
.preference
.IPreferenceStore
;
23 import org
.eclipse
.jface
.viewers
.CheckStateChangedEvent
;
24 import org
.eclipse
.jface
.viewers
.CheckboxTreeViewer
;
25 import org
.eclipse
.jface
.viewers
.ICheckStateListener
;
26 import org
.eclipse
.jface
.viewers
.ITreeViewerListener
;
27 import org
.eclipse
.jface
.viewers
.StyledString
.Styler
;
28 import org
.eclipse
.jface
.viewers
.TreeExpansionEvent
;
29 import org
.eclipse
.swt
.SWT
;
30 import org
.eclipse
.swt
.graphics
.TextStyle
;
31 import org
.eclipse
.swt
.layout
.GridData
;
32 import org
.eclipse
.swt
.layout
.GridLayout
;
33 import org
.eclipse
.swt
.widgets
.Composite
;
34 import org
.eclipse
.swt
.widgets
.Display
;
36 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
37 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
38 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
39 import eu
.etaxonomy
.cdm
.model
.common
.TermType
;
40 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
41 import eu
.etaxonomy
.cdm
.model
.metadata
.PreferencePredicate
;
42 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
43 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySession
;
44 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySessionEnabled
;
45 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
52 public class AvailableDistributionPage
extends AbstractTermSelectionWizardPage
implements ICdmEntitySessionEnabled
{
57 protected AvailableDistributionPage(String pageName
) {
58 super(pageName
, TermType
.NamedArea
);
59 this.localPref
= true;
65 public void createControl(Composite parent
) {
66 IPreferenceStore preferenceStore
= PreferencesUtil
.getPreferenceStore();
68 String checkedValues
= preferenceStore
.getString(PreferencesUtil
.DISTRIBUTION_AREA_OCCURENCE_STATUS
);
69 String grayedValues
= preferenceStore
.getString(PreferencesUtil
.DISTRIBUTION_AREA_OCCURENCE_STATUS_GRAYED
);
70 setTitle("Select areas for Distribution Editor");
71 setDescription("In order to see and modify distribution status of taxa\n"
72 + "you have to select the areas which you like to see/modify.");
73 Composite composite
= new Composite(parent
, SWT
.NULL
);
74 composite
.setLayout(new GridLayout());
75 setViewer(new CheckboxTreeViewer(composite
, SWT
.NULL
));
76 ((CheckboxTreeViewer
)getViewer()).getTree().setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
77 getViewer().setContentProvider(new DistributionContentProvider());
78 Styler styler
= new Styler() {
80 public void applyStyles(TextStyle textStyle
) {
81 textStyle
.foreground
= Display
.getCurrent().getSystemColor(SWT
.COLOR_BLACK
);
84 getViewer().setLabelProvider(new AreaLabelProvider(styler
));
85 getViewer().setComparator(new AreaViewerComparator());
86 ((CheckboxTreeViewer
)getViewer()).addCheckStateListener(new ICheckStateListener() {
88 private boolean ignoreCheckEvent
= false;
91 public void checkStateChanged(CheckStateChangedEvent event
) {
92 if (ignoreCheckEvent
) {
95 ignoreCheckEvent
= true;
97 checkChildren(event
.getElement(), event
.getChecked());
98 grayParents(event
.getElement(), event
.getChecked());
99 // ((CheckboxTreeViewer)getViewer()).refresh();
102 ignoreCheckEvent
= false;
107 ((CheckboxTreeViewer
)getViewer()).addTreeListener(new ITreeViewerListener() {
109 public void treeCollapsed(TreeExpansionEvent event
) {
113 public void treeExpanded(TreeExpansionEvent event
) {
114 final Object element
= event
.getElement();
115 final Object
[] children
= ((DistributionContentProvider
)getViewer().getContentProvider()).getChildren(element
);
116 for (Object child
: children
) {
117 if (child
instanceof NamedAreaWrapper
){
118 if (getListCheckedTerms().contains(((NamedAreaWrapper
) child
).getNamedArea()) ){
119 ((CheckboxTreeViewer
)getViewer()).setChecked(child
, true);
121 if (getListGrayedTerms().contains(((NamedAreaWrapper
) child
).getNamedArea())&& !((NamedAreaWrapper
) child
).isBaseElement
){
122 ((CheckboxTreeViewer
)getViewer()).setGrayChecked(child
, true);
130 // TODO: write listener or toggle button to select all named areas
132 rememberCheckedValues(checkedValues
, grayedValues
);
133 // ((CheckboxTreeViewer)getViewer()).expandToLevel(2);
134 setControl(composite
);
142 private boolean checkNoneChecked() {
144 if (((CheckboxTreeViewer
)getViewer()).getCheckedElements().length
== 0) {
145 setMessage("Please check at least one item", WARNING
);
159 private void checkChildren(final Object element
, final boolean checked
) {
160 if (element
== null) {
164 if (((CheckboxTreeViewer
)getViewer()).isExpandable(element
)){
165 ((CheckboxTreeViewer
)getViewer()).expandToLevel(element
, CheckboxTreeViewer
.ALL_LEVELS
);
166 ((CheckboxTreeViewer
)getViewer()).setSubtreeChecked(element
, checked
);
168 ((CheckboxTreeViewer
)getViewer()).setChecked(element
, checked
);
169 if (((CheckboxTreeViewer
)getViewer()).getGrayed(element
)){
170 ((CheckboxTreeViewer
)getViewer()).setGrayChecked(element
, !checked
);
172 // if (element instanceof NamedAreaWrapper){
173 // NamedAreaWrapper baseElement = new NamedAreaWrapper(((NamedAreaWrapper)element).getNamedArea(), true, ((NamedAreaWrapper)element).parent);
174 // ((CheckboxTreeViewer)getViewer()).setChecked(baseElement, !checked);
175 // ((CheckboxTreeViewer)getViewer()).setGrayed(element, checked);
179 ((CheckboxTreeViewer
)getViewer()).setChecked(element
, checked
);
180 ((CheckboxTreeViewer
)getViewer()).setGrayed(element
, false);
189 private void grayParents(final Object element
, boolean checked
) {
190 DistributionContentProvider tcp
= new DistributionContentProvider();
192 if (element
== null) {
195 // final Object element = path.getLastSegment();
196 Object parent
= tcp
.getParent(element
);
197 if (parent
!= null) {
199 boolean allUnchecked
= true;
200 boolean allChecked
= true;
201 //if element is checked then the parent should be grayed if it is unchecked it have to be computed whether the parent should be checked
203 // if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
204 // ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
208 for (final Object fieldElement
: tcp
.getChildren(parent
)) {
209 allChecked
= allChecked
&& ((CheckboxTreeViewer
)getViewer()).getChecked(fieldElement
);
210 allUnchecked
= allUnchecked
&& !((CheckboxTreeViewer
)getViewer()).getChecked(fieldElement
);
211 allUnchecked
= allUnchecked
&& !((CheckboxTreeViewer
)getViewer()).getGrayed(fieldElement
);
214 // if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
215 ((CheckboxTreeViewer
)getViewer()).setChecked(parent
, false);
216 ((CheckboxTreeViewer
)getViewer()).setGrayed(parent
, false);
220 } else if (allChecked
){
221 ((CheckboxTreeViewer
)getViewer()).setChecked(parent
, true);
222 ((CheckboxTreeViewer
)getViewer()).setGrayed(parent
, false);
224 // if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
225 ((CheckboxTreeViewer
)getViewer()).setGrayChecked(parent
, true);
226 ((CheckboxTreeViewer
)getViewer()).setChecked(parent
, true);
232 grayParents(parent
, checked
);
237 public void dispose() {
238 CdmStore
.getCurrentSessionManager().dispose(this);
242 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
245 public ICdmEntitySession
getCdmEntitySession() {
246 return CdmStore
.getCurrentSessionManager().getNullSession();
250 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
253 public <T
extends CdmBase
> Collection
<T
> getRootEntities() {
258 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
261 public Map
<Object
, List
<String
>> getPropertyPathsMap() {
262 Map
<Object
, List
<String
>> propertyPathsMap
= new HashMap
<Object
, List
<String
>>();
263 List
<String
> termsPropertyPaths
= Arrays
.asList(new String
[] {
266 propertyPathsMap
.put("includes", termsPropertyPaths
);
267 propertyPathsMap
.put("terms", termsPropertyPaths
);
268 return propertyPathsMap
;
272 protected List
<TermVocabulary
<DefinedTermBase
>> getVocabulariesFromPreference(){
273 List
<TermVocabulary
<DefinedTermBase
>> vocs
= new ArrayList();
275 if (PreferencesUtil
.getPreferenceFromDB(PreferencePredicate
.AvailableDistributionAreaVocabularies
) == null && PreferencesUtil
.getPreferenceStore().getString(PreferencesUtil
.DISTRIBUTION_VOCABULARIES
) == null){
276 vocs
= CdmStore
.getService(IVocabularyService
.class).findByTermType(
279 String vocString
= PreferencesUtil
.getPreferenceStore().getString(PreferencesUtil
.DISTRIBUTION_VOCABULARIES
);
281 String
[] arrayVocs
= vocString
.split(";");
283 Set
<UUID
> uuidVocs
= new HashSet();
284 for (String voc
: arrayVocs
){
285 if (!StringUtils
.isBlank(voc
)){
286 uuidVocs
.add(UUID
.fromString(voc
));
289 List
<TermVocabulary
> tempVocs
= CdmStore
.getService(IVocabularyService
.class).find(uuidVocs
);
290 for (TermVocabulary voc
: tempVocs
){