ref #7063 change labels for dialog help
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / wizard / AvailableDistributionPage.java
1 /**
2 * Copyright (C) 2014 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.wizard;
10
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;
17 import java.util.Map;
18 import java.util.Set;
19 import java.util.UUID;
20
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;
35
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;
46
47 /**
48 * @author a.oppermann
49 * @date 21.07.2014
50 *
51 */
52 public class AvailableDistributionPage extends AbstractTermSelectionWizardPage implements ICdmEntitySessionEnabled {
53
54 /**
55 * @param pageName
56 */
57 protected AvailableDistributionPage(String pageName) {
58 super(pageName, TermType.NamedArea);
59 this.localPref = true;
60
61 }
62
63 /** {@inheritDoc} */
64 @Override
65 public void createControl(Composite parent) {
66 IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
67
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() {
79 @Override
80 public void applyStyles(TextStyle textStyle) {
81 textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
82 }
83 };
84 getViewer().setLabelProvider(new AreaLabelProvider(styler));
85 getViewer().setComparator(new AreaViewerComparator());
86 ((CheckboxTreeViewer)getViewer()).addCheckStateListener(new ICheckStateListener() {
87
88 private boolean ignoreCheckEvent = false;
89
90 @Override
91 public void checkStateChanged(CheckStateChangedEvent event) {
92 if (ignoreCheckEvent ) {
93 return;
94 }
95 ignoreCheckEvent = true;
96 try {
97 checkChildren(event.getElement(), event.getChecked());
98 grayParents(event.getElement(), event.getChecked());
99 // ((CheckboxTreeViewer)getViewer()).refresh();
100 }
101 finally {
102 ignoreCheckEvent = false;
103 }
104 checkNoneChecked();
105 }
106 });
107 ((CheckboxTreeViewer)getViewer()).addTreeListener(new ITreeViewerListener() {
108 @Override
109 public void treeCollapsed(TreeExpansionEvent event) {
110 }
111
112 @Override
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);
120 }
121 if (getListGrayedTerms().contains(((NamedAreaWrapper) child).getNamedArea())&& !((NamedAreaWrapper) child).isBaseElement){
122 ((CheckboxTreeViewer)getViewer()).setGrayChecked(child, true);
123 }
124 }
125
126 }
127 }
128 });
129
130 // TODO: write listener or toggle button to select all named areas
131
132 rememberCheckedValues(checkedValues, grayedValues);
133 // ((CheckboxTreeViewer)getViewer()).expandToLevel(2);
134 setControl(composite);
135 }
136
137
138
139
140
141
142 private boolean checkNoneChecked() {
143
144 if (((CheckboxTreeViewer)getViewer()).getCheckedElements().length == 0) {
145 setMessage("Please check at least one item", WARNING);
146 return true;
147 } else {
148 setMessage(null);
149 return false;
150 }
151 }
152
153
154 /**
155 *
156 * @param path
157 * @param checked
158 */
159 private void checkChildren(final Object element, final boolean checked) {
160 if (element == null) {
161 return;
162 }
163
164 if (((CheckboxTreeViewer)getViewer()).isExpandable(element)){
165 ((CheckboxTreeViewer)getViewer()).expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
166 ((CheckboxTreeViewer)getViewer()).setSubtreeChecked(element, checked);
167
168 ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
169 if (((CheckboxTreeViewer)getViewer()).getGrayed(element)){
170 ((CheckboxTreeViewer)getViewer()).setGrayChecked(element, !checked);
171 }
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);
176 // }
177
178 }else{
179 ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
180 ((CheckboxTreeViewer)getViewer()).setGrayed(element, false);
181 }
182
183 }
184 /**
185 *
186 * @param path
187 * @param checked
188 */
189 private void grayParents(final Object element, boolean checked) {
190 DistributionContentProvider tcp = new DistributionContentProvider();
191
192 if (element == null) {
193 return;
194 }
195 // final Object element = path.getLastSegment();
196 Object parent = tcp.getParent(element);
197 if (parent != null) {
198
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
202 // if (checked){
203 // if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
204 // ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
205 // }
206 //
207 // }else{
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);
212 }
213 if (allUnchecked) {
214 // if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
215 ((CheckboxTreeViewer)getViewer()).setChecked(parent, false);
216 ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
217 // }else{
218 // checked = true;
219 // }
220 } else if (allChecked){
221 ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
222 ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
223 }else {
224 // if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
225 ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
226 ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
227 // }
228 checked = true;
229
230 }
231 // }
232 grayParents(parent, checked);
233 }
234 }
235
236 @Override
237 public void dispose() {
238 CdmStore.getCurrentSessionManager().dispose(this);
239 super.dispose();
240 }
241 /* (non-Javadoc)
242 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
243 */
244 @Override
245 public ICdmEntitySession getCdmEntitySession() {
246 return CdmStore.getCurrentSessionManager().getNullSession();
247 }
248
249 /* (non-Javadoc)
250 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
251 */
252 @Override
253 public <T extends CdmBase> Collection<T> getRootEntities() {
254 return null;
255 }
256
257 /* (non-Javadoc)
258 * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
259 */
260 @Override
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[] {
264 "includes"
265 });
266 propertyPathsMap.put("includes", termsPropertyPaths);
267 propertyPathsMap.put("terms", termsPropertyPaths);
268 return propertyPathsMap;
269 }
270
271 @Override
272 protected List<TermVocabulary<DefinedTermBase>> getVocabulariesFromPreference(){
273 List<TermVocabulary<DefinedTermBase>> vocs = new ArrayList();
274
275 if (PreferencesUtil.getPreferenceFromDB(PreferencePredicate.AvailableDistributionAreaVocabularies) == null && PreferencesUtil.getPreferenceStore().getString(PreferencesUtil.DISTRIBUTION_VOCABULARIES) == null){
276 vocs = CdmStore.getService(IVocabularyService.class).findByTermType(
277 type, null);
278 }else{
279 String vocString = PreferencesUtil.getPreferenceStore().getString(PreferencesUtil.DISTRIBUTION_VOCABULARIES);
280
281 String[] arrayVocs = vocString.split(";");
282
283 Set<UUID> uuidVocs = new HashSet();
284 for (String voc: arrayVocs){
285 if (!StringUtils.isBlank(voc)){
286 uuidVocs.add(UUID.fromString(voc));
287 }
288 }
289 List<TermVocabulary> tempVocs = CdmStore.getService(IVocabularyService.class).find(uuidVocs);
290 for (TermVocabulary voc: tempVocs){
291 vocs.add(voc);
292 }
293
294 }
295 return vocs;
296 }
297
298
299
300 }