Project

General

Profile

Download (10.4 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.Arrays;
12
import java.util.Collection;
13
import java.util.HashMap;
14
import java.util.HashSet;
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.swt.SWT;
28
import org.eclipse.swt.graphics.TextStyle;
29
import org.eclipse.swt.layout.GridData;
30
import org.eclipse.swt.layout.GridLayout;
31
import org.eclipse.swt.widgets.Composite;
32
import org.eclipse.swt.widgets.Display;
33

    
34
import eu.etaxonomy.cdm.api.service.IVocabularyService;
35
import eu.etaxonomy.cdm.model.common.CdmBase;
36
import eu.etaxonomy.cdm.model.common.TermVocabulary;
37
import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
38
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
39
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
40
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
41
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
42
import eu.etaxonomy.taxeditor.store.CdmStore;
43

    
44
/**
45
 * @author a.oppermann
46
 * @date 21.07.2014
47
 *
48
 */
49
public class AvailableDistributionPage extends AbstractAreaSelectionWizard implements ICdmEntitySessionEnabled {
50

    
51
    /**
52
     * @param pageName
53
     */
54
    protected AvailableDistributionPage(String pageName) {
55
        super(pageName);
56

    
57
    }
58

    
59
    /*
60
     * (non-Javadoc)
61
     *
62
     * @see
63
     * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
64
     * .Composite)
65
     */
66
    /** {@inheritDoc} */
67
    @Override
68
    public void createControl(Composite parent) {
69
        IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
70

    
71
        String checkedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS);
72
        String grayedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS_GRAYED);
73
        setTitle("Select areas for Distribution Editor");
74
        setDescription("In order to be able to modify and see the distribution status of taxa,\n"
75
                + "you have to select the areas which you like to see.");
76
        Composite composite = new Composite(parent, SWT.NULL);
77
        composite.setLayout(new GridLayout());
78
        setViewer(new CheckboxTreeViewer(composite, SWT.NULL));
79
        ((CheckboxTreeViewer)getViewer()).getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
80
        getViewer().setContentProvider(new TermContentProvider());
81
        Styler styler = new Styler() {
82
            @Override
83
            public void applyStyles(TextStyle textStyle) {
84
                textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
85
            }
86
        };
87
        getViewer().setLabelProvider(new TermLabelProvider(styler));
88
        getViewer().setComparator(new ViewerComparator());
89
        ((CheckboxTreeViewer)getViewer()).addCheckStateListener(new ICheckStateListener() {
90

    
91
            private boolean ignoreCheckEvent = false;
92

    
93
            @Override
94
            public void checkStateChanged(CheckStateChangedEvent event) {
95

    
96

    
97
                if (ignoreCheckEvent ) {
98
                    return;
99
                }
100

    
101
                ignoreCheckEvent = true;
102

    
103
                try {
104

    
105
                    checkChildren(event.getElement(), event.getChecked());
106

    
107
                    grayParents(event.getElement());
108
                }
109
                finally {
110
                    ignoreCheckEvent = false;
111
                }
112
                checkNoneChecked();
113
            }
114
        });
115
        // TODO: write listener or toggle button to select all named areas
116

    
117
        rememberCheckedValues(checkedValues, grayedValues);
118
        setControl(composite);
119
    }
120

    
121

    
122

    
123

    
124

    
125

    
126
    private boolean checkNoneChecked() {
127

    
128
        if (((CheckboxTreeViewer)getViewer()).getCheckedElements().length == 0) {
129
            setMessage("Please check at least one item", WARNING);
130
            return true;
131
        } else {
132
            setMessage(null);
133
            return false;
134
        }
135
    }
136

    
137

    
138
    /**
139
     *
140
     * @param path
141
     */
142
    private void checkParents(final TreePath path) {
143
        if (path == null) {
144
            return;
145
        }
146
        TermContentProvider tcp = new TermContentProvider();
147
        Object treeElement = path.getLastSegment();
148

    
149
        if (treeElement != null) {
150
            boolean allChecked = true;
151
            boolean allUnchecked = true;
152
            for (final Object fieldElement : tcp.getChildren(treeElement)) {
153
                allChecked = allChecked && ((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
154
                allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
155
            }
156
            if (allUnchecked) {
157
                ((CheckboxTreeViewer)getViewer()).setChecked(treeElement, false);
158
                ((CheckboxTreeViewer)getViewer()).setGrayed(treeElement, false);
159
            } else if (allChecked) {
160
                ((CheckboxTreeViewer)getViewer()).setChecked(treeElement, true);
161
                ((CheckboxTreeViewer)getViewer()).setGrayed(treeElement, false);
162
            } else if (!allUnchecked && !allChecked) {
163
                ((CheckboxTreeViewer)getViewer()).setChecked(treeElement, true);
164
                ((CheckboxTreeViewer)getViewer()).setGrayed(treeElement, true);
165
            }
166
        }
167
        checkParents(path.getParentPath());
168
    }
169

    
170
//    /**
171
//     *
172
//     * @param path
173
//     * @param checked
174
//     */
175
//    private void checkChildren(final TreePath path, final boolean checked) {
176
//        TermContentProvider tcp = new TermContentProvider();
177
//
178
//        if (path == null) {
179
//            return;
180
//        }
181
//        final Object element = path.getLastSegment();
182
//        if (element != null) {
183
//            this.viewer.setChecked(element, checked);
184
//            this.viewer.setGrayed(element, false);
185
//            int length = tcp.getChildren(element).length;
186
//            if(length>1){
187
//                this.viewer.expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
188
//                this.viewer.setSubtreeChecked(element, checked);
189
//            }
190
//        }
191
//    }
192

    
193
    /**
194
    *
195
    * @param path
196
    * @param checked
197
    */
198
   private void checkChildren(final Object element, final boolean checked) {
199
       TermContentProvider tcp = new TermContentProvider();
200

    
201
       if (element == null) {
202
           return;
203
       }
204
    //   final Object element = path.getLastSegment();
205
       if (element != null) {
206
           ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
207
           ((CheckboxTreeViewer)getViewer()).setGrayed(element, false);
208
           int length = tcp.getChildren(element).length;
209
           if(length>1){
210
               ((CheckboxTreeViewer)getViewer()).expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
211
               ((CheckboxTreeViewer)getViewer()).setSubtreeChecked(element, checked);
212
           }
213
       }
214
   }
215
   /**
216
   *
217
   * @param path
218
   * @param checked
219
   */
220
  private void grayParents(final Object element) {
221
      TermContentProvider tcp = new TermContentProvider();
222

    
223
      if (element == null) {
224
          return;
225
      }
226
   //   final Object element = path.getLastSegment();
227
      Object parent = tcp.getParent(element);
228
      if (parent != null) {
229
          boolean allChecked = true;
230
          boolean allUnchecked = true;
231
          for (final Object fieldElement : tcp.getChildren(parent)) {
232
              allChecked = allChecked && ((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
233
              allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
234
          }
235
          if (allUnchecked) {
236
              ((CheckboxTreeViewer)getViewer()).setChecked(parent, false);
237
              ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
238
          } else if (allChecked) {
239
              ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
240
              ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
241
          } else if (!allUnchecked && !allChecked) {
242
              ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
243
              ((CheckboxTreeViewer)getViewer()).setGrayed(parent, true);
244
          }
245

    
246
        grayParents(tcp.getParent(parent));
247
      }
248
  }
249

    
250
    @Override
251
    public void dispose() {
252
        CdmStore.getCurrentSessionManager().dispose(this);
253
        super.dispose();
254
    }
255
    /* (non-Javadoc)
256
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
257
     */
258
    @Override
259
    public ICdmEntitySession getCdmEntitySession() {
260
        return CdmStore.getCurrentSessionManager().getNullSession();
261
    }
262

    
263
    /* (non-Javadoc)
264
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
265
     */
266
    @Override
267
    public <T extends CdmBase> Collection<T> getRootEntities() {
268
        return null;
269
    }
270

    
271
    /* (non-Javadoc)
272
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
273
     */
274
    @Override
275
    public Map<Object, List<String>> getPropertyPathsMap() {
276
        Map<Object, List<String>> propertyPathsMap = new HashMap<Object, List<String>>();
277
        List<String> termsPropertyPaths = Arrays.asList(new String[] {
278
                "includes"
279
        });
280
        propertyPathsMap.put("includes", termsPropertyPaths);
281
        propertyPathsMap.put("terms", termsPropertyPaths);
282
        return propertyPathsMap;
283
    }
284
    @Override
285
    protected void initialiseVocabularies() {
286
        if (getVocabularies() != null) {
287
            getVocabularies().clear();
288
        }
289
        String vocString = PreferencesUtil.getPreferenceStore().getString(PreferencesUtil.DISTRIBUTION_VOCABULARIES);
290
        String[] arrayVocs = vocString.split(",");
291

    
292
        Set<UUID> uuidVocs = new HashSet();
293
        for (String voc: arrayVocs){
294
            uuidVocs.add(UUID.fromString(voc));
295
        }
296

    
297
        List<TermVocabulary> vocs = CdmStore.getService(IVocabularyService.class).find(uuidVocs);
298

    
299
        setVocabularies(vocs);
300
    }
301

    
302

    
303

    
304
}
(3-3/7)