3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.preference
.wizard
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Arrays
;
14 import java
.util
.Collection
;
15 import java
.util
.HashMap
;
16 import java
.util
.List
;
19 import java
.util
.UUID
;
21 import org
.eclipse
.jface
.preference
.IPreferenceStore
;
22 import org
.eclipse
.jface
.viewers
.CheckStateChangedEvent
;
23 import org
.eclipse
.jface
.viewers
.CheckboxTreeViewer
;
24 import org
.eclipse
.jface
.viewers
.ICheckStateListener
;
25 import org
.eclipse
.jface
.viewers
.ITreeSelection
;
26 import org
.eclipse
.jface
.viewers
.StyledString
.Styler
;
27 import org
.eclipse
.jface
.viewers
.TreePath
;
28 import org
.eclipse
.jface
.wizard
.WizardPage
;
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
.ITermService
;
37 import eu
.etaxonomy
.cdm
.api
.service
.IVocabularyService
;
38 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
39 import eu
.etaxonomy
.cdm
.model
.common
.DefinedTermBase
;
40 import eu
.etaxonomy
.cdm
.model
.common
.TermType
;
41 import eu
.etaxonomy
.cdm
.model
.common
.TermVocabulary
;
42 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.TermContentProvider
;
43 import eu
.etaxonomy
.taxeditor
.editor
.definedterm
.TermLabelProvider
;
44 import eu
.etaxonomy
.taxeditor
.preference
.PreferencesUtil
;
45 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySession
;
46 import eu
.etaxonomy
.taxeditor
.session
.ICdmEntitySessionEnabled
;
47 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
54 public class AvailableDistributionPage
extends WizardPage
implements ICdmEntitySessionEnabled
{
56 private CheckboxTreeViewer viewer
;
58 private Set
<TermVocabulary
<DefinedTermBase
>> vocabularies
;
63 protected AvailableDistributionPage(String pageName
) {
65 // TODO check if configuration exists
66 CdmStore
.getCurrentSessionManager().bindNullSession(this);
73 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
78 public void createControl(Composite parent
) {
79 IPreferenceStore preferenceStore
= PreferencesUtil
.getPreferenceStore();
80 String checkedValues
= preferenceStore
.getString(PreferencesUtil
.DISTRIBUTION_AREA_OCCURENCE_STATUS
);
81 String grayedValues
= preferenceStore
.getString(PreferencesUtil
.DISTRIBUTION_AREA_OCCURENCE_STATUS_GRAYED
);
82 setTitle("Select areas for ChecklistEditor");
83 setDescription("In order to be able to modify and see the distribution status of taxa,\n"
84 + "you have to select the areas which you like to see.");
85 Composite composite
= new Composite(parent
, SWT
.NULL
);
86 composite
.setLayout(new GridLayout());
87 viewer
= new CheckboxTreeViewer(composite
, SWT
.NULL
);
88 viewer
.getTree().setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
89 viewer
.setContentProvider(new TermContentProvider());
90 Styler styler
= new Styler() {
92 public void applyStyles(TextStyle textStyle
) {
93 textStyle
.foreground
= Display
.getCurrent().getSystemColor(SWT
.COLOR_BLACK
);
96 viewer
.setLabelProvider(new TermLabelProvider(styler
));
97 viewer
.addCheckStateListener(new ICheckStateListener() {
99 private boolean ignoreCheckEvent
= false;
102 public void checkStateChanged(CheckStateChangedEvent event
) {
105 if (ignoreCheckEvent
) {
109 ignoreCheckEvent
= true;
112 TreePath path
= ((ITreeSelection
) viewer
.getSelection()).getPaths()[0];
113 checkChildren(path
, event
.getChecked());
114 checkParents(path
.getParentPath());
117 ignoreCheckEvent
= false;
122 // TODO: write listener or toggle button to select all named areas
124 rememberCheckedValues(checkedValues
, grayedValues
);
125 setControl(composite
);
129 protected List
<TermVocabulary
<DefinedTermBase
>> initialiseVocabularies() {
130 if (vocabularies
!= null) {
131 vocabularies
.clear();
133 List
<TermVocabulary
<DefinedTermBase
>> vocs
= CdmStore
.getService(IVocabularyService
.class).findByTermType(
138 private void rememberCheckedValues(String checkedValues
, String grayedValues
) {
139 viewer
.setInput(initialiseVocabularies());
141 if (grayedValues
!= null && grayedValues
!= "") {
142 String
[] listGrayed
= grayedValues
.split(",");
143 ArrayList listGrayedTerms
= new ArrayList();
144 getTermsFromStringValues(listGrayed
, listGrayedTerms
);
145 for(Object element
: listGrayedTerms
){
147 viewer
.setGrayChecked(element
, true);
151 if (checkedValues
!= null && checkedValues
!= "") {
152 String
[] listChecked
= checkedValues
.split(",");
153 ArrayList
<DefinedTermBase
<?
>> listCheckedTerms
= new ArrayList
<DefinedTermBase
<?
>>();
154 getTermsFromStringValues(listChecked
, listCheckedTerms
);
155 for(Object element
: listCheckedTerms
){
157 viewer
.setChecked(element
, true);
167 private void getTermsFromStringValues(String
[] split
, ArrayList termlist
) {
168 List
<String
> listValue
= Arrays
.asList(split
);
169 for (String s
: listValue
) {
170 UUID uuid
= UUID
.fromString(s
);
171 ITermService termService
= CdmStore
.getService(ITermService
.class);
172 DefinedTermBase definedTermBase
= termService
.load(uuid
);
173 if(definedTermBase
!= null){
174 termlist
.add(definedTermBase
);
176 IVocabularyService vocabularyService
= CdmStore
.getService(IVocabularyService
.class);
177 TermVocabulary termVocabulary
= vocabularyService
.load(uuid
);
178 termlist
.add(termVocabulary
);
183 private boolean checkNoneChecked() {
185 if (viewer
.getCheckedElements().length
== 0) {
186 setMessage("Please check at least one item", WARNING
);
197 public CheckboxTreeViewer
getViewer() {
205 private void checkParents(final TreePath path
) {
209 TermContentProvider tcp
= new TermContentProvider();
210 Object treeElement
= path
.getLastSegment();
212 if (treeElement
!= null) {
213 boolean allChecked
= true;
214 boolean allUnchecked
= true;
215 for (final Object fieldElement
: tcp
.getChildren(treeElement
)) {
216 allChecked
= allChecked
&& this.viewer
.getChecked(fieldElement
);
217 allUnchecked
= allUnchecked
&& !this.viewer
.getChecked(fieldElement
);
220 this.viewer
.setChecked(treeElement
, false);
221 this.viewer
.setGrayed(treeElement
, false);
222 } else if (allChecked
) {
223 this.viewer
.setChecked(treeElement
, true);
224 this.viewer
.setGrayed(treeElement
, false);
225 } else if (!allUnchecked
&& !allChecked
) {
226 this.viewer
.setChecked(treeElement
, true);
227 this.viewer
.setGrayed(treeElement
, true);
230 checkParents(path
.getParentPath());
238 private void checkChildren(final TreePath path
, final boolean checked
) {
239 TermContentProvider tcp
= new TermContentProvider();
244 final Object element
= path
.getLastSegment();
245 if (element
!= null) {
246 this.viewer
.setChecked(element
, checked
);
247 this.viewer
.setGrayed(element
, false);
248 int length
= tcp
.getChildren(element
).length
;
250 this.viewer
.setSubtreeChecked(element
, checked
);
256 public void dispose() {
257 CdmStore
.getCurrentSessionManager().dispose(this);
261 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
264 public ICdmEntitySession
getCdmEntitySession() {
265 return CdmStore
.getCurrentSessionManager().getNullSession();
269 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
272 public <T
extends CdmBase
> Collection
<T
> getRootEntities() {
277 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
280 public Map
<Object
, List
<String
>> getPropertyPathsMap() {
281 Map
<Object
, List
<String
>> propertyPathsMap
= new HashMap
<Object
, List
<String
>>();
282 List
<String
> termsPropertyPaths
= Arrays
.asList(new String
[] {
285 propertyPathsMap
.put("includes", termsPropertyPaths
);
286 propertyPathsMap
.put("terms", termsPropertyPaths
);
287 return propertyPathsMap
;