Project

General

Profile

Download (11.9 KB) Statistics
| Branch: | Tag: | Revision:
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.List;
16
import java.util.Map;
17
import java.util.Set;
18
import java.util.UUID;
19

    
20
import org.eclipse.jface.preference.IPreferenceStore;
21
import org.eclipse.jface.viewers.CheckStateChangedEvent;
22
import org.eclipse.jface.viewers.CheckboxTreeViewer;
23
import org.eclipse.jface.viewers.ICheckStateListener;
24
import org.eclipse.jface.viewers.StyledString.Styler;
25
import org.eclipse.jface.viewers.TreePath;
26
import org.eclipse.jface.viewers.ViewerComparator;
27
import org.eclipse.jface.wizard.WizardPage;
28
import org.eclipse.swt.SWT;
29
import org.eclipse.swt.graphics.TextStyle;
30
import org.eclipse.swt.layout.GridData;
31
import org.eclipse.swt.layout.GridLayout;
32
import org.eclipse.swt.widgets.Composite;
33
import org.eclipse.swt.widgets.Display;
34

    
35
import eu.etaxonomy.cdm.api.service.ITermService;
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.taxeditor.editor.definedterm.TermContentProvider;
42
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
43
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
44
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
45
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
46
import eu.etaxonomy.taxeditor.store.CdmStore;
47

    
48
/**
49
 * @author a.oppermann
50
 * @date 21.07.2014
51
 *
52
 */
53
public class AvailableDistributionPage extends WizardPage implements ICdmEntitySessionEnabled {
54

    
55
    private CheckboxTreeViewer viewer;
56

    
57
    private Set<TermVocabulary<DefinedTermBase>> vocabularies;
58

    
59
    /**
60
     * @param pageName
61
     */
62
    protected AvailableDistributionPage(String pageName) {
63
        super(pageName);
64
        // TODO check if configuration exists
65
        CdmStore.getCurrentSessionManager().bindNullSession();
66
    }
67

    
68
    /*
69
     * (non-Javadoc)
70
     *
71
     * @see
72
     * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
73
     * .Composite)
74
     */
75
    /** {@inheritDoc} */
76
    @Override
77
    public void createControl(Composite parent) {
78
        IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
79
        String checkedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS);
80
        String grayedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS_GRAYED);
81
        setTitle("Select areas for Distribution Editor");
82
        setDescription("In order to be able to modify and see the distribution status of taxa,\n"
83
                + "you have to select the areas which you like to see.");
84
        Composite composite = new Composite(parent, SWT.NULL);
85
        composite.setLayout(new GridLayout());
86
        viewer = new CheckboxTreeViewer(composite, SWT.NULL);
87
        viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
88
        viewer.setContentProvider(new TermContentProvider());
89
        Styler styler = new Styler() {
90
            @Override
91
            public void applyStyles(TextStyle textStyle) {
92
                textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
93
            }
94
        };
95
        viewer.setLabelProvider(new TermLabelProvider(styler));
96
        viewer.setComparator(new ViewerComparator());
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

    
113
                    checkChildren(event.getElement(), event.getChecked());
114

    
115
                    grayParents(event.getElement());
116
                }
117
                finally {
118
                    ignoreCheckEvent = false;
119
                }
120
                checkNoneChecked();
121
            }
122
        });
123
        // TODO: write listener or toggle button to select all named areas
124

    
125
        rememberCheckedValues(checkedValues, grayedValues);
126
        setControl(composite);
127
    }
128

    
129

    
130
    protected List<TermVocabulary<DefinedTermBase>> initialiseVocabularies() {
131
        if (vocabularies != null) {
132
            vocabularies.clear();
133
        }
134
        List<TermVocabulary<DefinedTermBase>> vocs = CdmStore.getService(IVocabularyService.class).findByTermType(
135
                TermType.NamedArea, null);
136

    
137
        return vocs;
138
    }
139

    
140
    private void rememberCheckedValues(String checkedValues, String grayedValues) {
141
        viewer.setInput(initialiseVocabularies());
142

    
143
        if (grayedValues != null && grayedValues != "") {
144
            String[] listGrayed = grayedValues.split(",");
145
            ArrayList listGrayedTerms = new ArrayList();
146
            getTermsFromStringValues(listGrayed, listGrayedTerms);
147
            for(Object element : listGrayedTerms){
148
                if(element != null){
149
                    viewer.setGrayChecked(element, true);
150
                }
151
            }
152
        }
153
        if (checkedValues != null && checkedValues != "") {
154
            String[] listChecked = checkedValues.split(",");
155
            ArrayList<DefinedTermBase<?>> listCheckedTerms = new ArrayList<DefinedTermBase<?>>();
156
            getTermsFromStringValues(listChecked, listCheckedTerms);
157
            for(Object element : listCheckedTerms){
158
                if(element != null){
159
                    viewer.setChecked(element, true);
160
                }
161
            }
162
        }
163
    }
164

    
165
    /**
166
     * @param split
167
     * @param termlist
168
     */
169
    private void getTermsFromStringValues(String[] split, ArrayList termlist) {
170
        List<String> listValue = Arrays.asList(split);
171
        for (String s : listValue) {
172
            UUID uuid = UUID.fromString(s);
173
            ITermService termService = CdmStore.getService(ITermService.class);
174
            DefinedTermBase definedTermBase = termService.load(uuid);
175
            if(definedTermBase != null){
176
                termlist.add(definedTermBase);
177
            }else{
178
                IVocabularyService vocabularyService = CdmStore.getService(IVocabularyService.class);
179
                TermVocabulary termVocabulary = vocabularyService.load(uuid);
180
                termlist.add(termVocabulary);
181
            }
182
        }
183
    }
184

    
185
    private boolean checkNoneChecked() {
186

    
187
        if (viewer.getCheckedElements().length == 0) {
188
            setMessage("Please check at least one item", WARNING);
189
            return true;
190
        } else {
191
            setMessage(null);
192
            return false;
193
        }
194
    }
195

    
196
    /**
197
     * @return the viewer
198
     */
199
    public CheckboxTreeViewer getViewer() {
200
        return viewer;
201
    }
202

    
203
    /**
204
     *
205
     * @param path
206
     */
207
    private void checkParents(final TreePath path) {
208
        if (path == null) {
209
            return;
210
        }
211
        TermContentProvider tcp = new TermContentProvider();
212
        Object treeElement = path.getLastSegment();
213

    
214
        if (treeElement != null) {
215
            boolean allChecked = true;
216
            boolean allUnchecked = true;
217
            for (final Object fieldElement : tcp.getChildren(treeElement)) {
218
                allChecked = allChecked && this.viewer.getChecked(fieldElement);
219
                allUnchecked = allUnchecked && !this.viewer.getChecked(fieldElement);
220
            }
221
            if (allUnchecked) {
222
                this.viewer.setChecked(treeElement, false);
223
                this.viewer.setGrayed(treeElement, false);
224
            } else if (allChecked) {
225
                this.viewer.setChecked(treeElement, true);
226
                this.viewer.setGrayed(treeElement, false);
227
            } else if (!allUnchecked && !allChecked) {
228
                this.viewer.setChecked(treeElement, true);
229
                this.viewer.setGrayed(treeElement, true);
230
            }
231
        }
232
        checkParents(path.getParentPath());
233
    }
234

    
235
//    /**
236
//     *
237
//     * @param path
238
//     * @param checked
239
//     */
240
//    private void checkChildren(final TreePath path, final boolean checked) {
241
//        TermContentProvider tcp = new TermContentProvider();
242
//
243
//        if (path == null) {
244
//            return;
245
//        }
246
//        final Object element = path.getLastSegment();
247
//        if (element != null) {
248
//            this.viewer.setChecked(element, checked);
249
//            this.viewer.setGrayed(element, false);
250
//            int length = tcp.getChildren(element).length;
251
//            if(length>1){
252
//                this.viewer.expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
253
//                this.viewer.setSubtreeChecked(element, checked);
254
//            }
255
//        }
256
//    }
257

    
258
    /**
259
    *
260
    * @param path
261
    * @param checked
262
    */
263
   private void checkChildren(final Object element, final boolean checked) {
264
       TermContentProvider tcp = new TermContentProvider();
265

    
266
       if (element == null) {
267
           return;
268
       }
269
    //   final Object element = path.getLastSegment();
270
       if (element != null) {
271
           this.viewer.setChecked(element, checked);
272
           this.viewer.setGrayed(element, false);
273
           int length = tcp.getChildren(element).length;
274
           if(length>1){
275
               this.viewer.expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
276
               this.viewer.setSubtreeChecked(element, checked);
277
           }
278
       }
279
   }
280
   /**
281
   *
282
   * @param path
283
   * @param checked
284
   */
285
  private void grayParents(final Object element) {
286
      TermContentProvider tcp = new TermContentProvider();
287

    
288
      if (element == null) {
289
          return;
290
      }
291
   //   final Object element = path.getLastSegment();
292
      Object parent = tcp.getParent(element);
293
      if (parent != null) {
294
          boolean allChecked = true;
295
          boolean allUnchecked = true;
296
          for (final Object fieldElement : tcp.getChildren(parent)) {
297
              allChecked = allChecked && this.viewer.getChecked(fieldElement);
298
              allUnchecked = allUnchecked && !this.viewer.getChecked(fieldElement);
299
          }
300
          if (allUnchecked) {
301
              this.viewer.setChecked(parent, false);
302
              this.viewer.setGrayed(parent, false);
303
          } else if (allChecked) {
304
              this.viewer.setChecked(parent, true);
305
              this.viewer.setGrayed(parent, false);
306
          } else if (!allUnchecked && !allChecked) {
307
              this.viewer.setChecked(parent, true);
308
              this.viewer.setGrayed(parent, true);
309
          }
310

    
311
        grayParents(tcp.getParent(parent));
312
      }
313
  }
314

    
315
    @Override
316
    public void dispose() {
317
        CdmStore.getCurrentSessionManager().dispose(this);
318
        super.dispose();
319
    }
320
    /* (non-Javadoc)
321
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
322
     */
323
    @Override
324
    public ICdmEntitySession getCdmEntitySession() {
325
        return CdmStore.getCurrentSessionManager().getNullSession();
326
    }
327

    
328
    /* (non-Javadoc)
329
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
330
     */
331
    @Override
332
    public <T extends CdmBase> Collection<T> getRootEntities() {
333
        return null;
334
    }
335

    
336
    /* (non-Javadoc)
337
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
338
     */
339
    @Override
340
    public Map<Object, List<String>> getPropertyPathsMap() {
341
        Map<Object, List<String>> propertyPathsMap = new HashMap<Object, List<String>>();
342
        List<String> termsPropertyPaths = Arrays.asList(new String[] {
343
                "includes"
344
        });
345
        propertyPathsMap.put("includes", termsPropertyPaths);
346
        propertyPathsMap.put("terms", termsPropertyPaths);
347
        return propertyPathsMap;
348
    }
349

    
350
}
(1-1/4)