merge
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / wizard / AvailableDistributionPage.java
1 // $Id$
2 /**
3 * Copyright (C) 2014 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
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.
9 */
10 package eu.etaxonomy.taxeditor.preference.wizard;
11
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;
17 import java.util.Map;
18 import java.util.Set;
19 import java.util.UUID;
20
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;
35
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;
48
49 /**
50 * @author a.oppermann
51 * @date 21.07.2014
52 *
53 */
54 public class AvailableDistributionPage extends WizardPage implements ICdmEntitySessionEnabled {
55
56 private CheckboxTreeViewer viewer;
57
58 private Set<TermVocabulary<DefinedTermBase>> vocabularies;
59
60 /**
61 * @param pageName
62 */
63 protected AvailableDistributionPage(String pageName) {
64 super(pageName);
65 // TODO check if configuration exists
66 CdmStore.getCurrentSessionManager().bindNullSession();
67 }
68
69 /*
70 * (non-Javadoc)
71 *
72 * @see
73 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
74 * .Composite)
75 */
76 /** {@inheritDoc} */
77 @Override
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() {
91 @Override
92 public void applyStyles(TextStyle textStyle) {
93 textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
94 }
95 };
96 viewer.setLabelProvider(new TermLabelProvider(styler));
97 viewer.addCheckStateListener(new ICheckStateListener() {
98
99 private boolean ignoreCheckEvent = false;
100
101 @Override
102 public void checkStateChanged(CheckStateChangedEvent event) {
103
104
105 if (ignoreCheckEvent ) {
106 return;
107 }
108
109 ignoreCheckEvent = true;
110
111 try {
112 TreePath path = ((ITreeSelection) viewer.getSelection()).getPaths()[0];
113 checkChildren(path, event.getChecked());
114 checkParents(path.getParentPath());
115 }
116 finally {
117 ignoreCheckEvent = false;
118 }
119 checkNoneChecked();
120 }
121 });
122 // TODO: write listener or toggle button to select all named areas
123
124 rememberCheckedValues(checkedValues, grayedValues);
125 setControl(composite);
126 }
127
128
129 protected List<TermVocabulary<DefinedTermBase>> initialiseVocabularies() {
130 if (vocabularies != null) {
131 vocabularies.clear();
132 }
133 List<TermVocabulary<DefinedTermBase>> vocs = CdmStore.getService(IVocabularyService.class).findByTermType(
134 TermType.NamedArea);
135 return vocs;
136 }
137
138 private void rememberCheckedValues(String checkedValues, String grayedValues) {
139 viewer.setInput(initialiseVocabularies());
140
141 if (grayedValues != null && grayedValues != "") {
142 String[] listGrayed = grayedValues.split(",");
143 ArrayList listGrayedTerms = new ArrayList();
144 getTermsFromStringValues(listGrayed, listGrayedTerms);
145 for(Object element : listGrayedTerms){
146 if(element != null){
147 viewer.setGrayChecked(element, true);
148 }
149 }
150 }
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){
156 if(element != null){
157 viewer.setChecked(element, true);
158 }
159 }
160 }
161 }
162
163 /**
164 * @param split
165 * @param termlist
166 */
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);
175 }else{
176 IVocabularyService vocabularyService = CdmStore.getService(IVocabularyService.class);
177 TermVocabulary termVocabulary = vocabularyService.load(uuid);
178 termlist.add(termVocabulary);
179 }
180 }
181 }
182
183 private boolean checkNoneChecked() {
184
185 if (viewer.getCheckedElements().length == 0) {
186 setMessage("Please check at least one item", WARNING);
187 return true;
188 } else {
189 setMessage(null);
190 return false;
191 }
192 }
193
194 /**
195 * @return the viewer
196 */
197 public CheckboxTreeViewer getViewer() {
198 return viewer;
199 }
200
201 /**
202 *
203 * @param path
204 */
205 private void checkParents(final TreePath path) {
206 if (path == null) {
207 return;
208 }
209 TermContentProvider tcp = new TermContentProvider();
210 Object treeElement = path.getLastSegment();
211
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);
218 }
219 if (allUnchecked) {
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);
228 }
229 }
230 checkParents(path.getParentPath());
231 }
232
233 /**
234 *
235 * @param path
236 * @param checked
237 */
238 private void checkChildren(final TreePath path, final boolean checked) {
239 TermContentProvider tcp = new TermContentProvider();
240
241 if (path == null) {
242 return;
243 }
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;
249 if(length>1){
250 this.viewer.setSubtreeChecked(element, checked);
251 }
252 }
253 }
254
255 @Override
256 public void dispose() {
257 CdmStore.getCurrentSessionManager().dispose(this);
258 super.dispose();
259 }
260 /* (non-Javadoc)
261 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
262 */
263 @Override
264 public ICdmEntitySession getCdmEntitySession() {
265 return CdmStore.getCurrentSessionManager().getNullSession();
266 }
267
268 /* (non-Javadoc)
269 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
270 */
271 @Override
272 public <T extends CdmBase> Collection<T> getRootEntities() {
273 return null;
274 }
275
276 /* (non-Javadoc)
277 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
278 */
279 @Override
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[] {
283 "includes"
284 });
285 propertyPathsMap.put("includes", termsPropertyPaths);
286 propertyPathsMap.put("terms", termsPropertyPaths);
287 return propertyPathsMap;
288 }
289
290 }