Project

General

Profile

Download (11.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.List;
15
import java.util.Map;
16

    
17
import org.eclipse.jface.preference.IPreferenceStore;
18
import org.eclipse.jface.viewers.CheckStateChangedEvent;
19
import org.eclipse.jface.viewers.CheckboxTreeViewer;
20
import org.eclipse.jface.viewers.ICheckStateListener;
21
import org.eclipse.jface.viewers.ITreeViewerListener;
22
import org.eclipse.jface.viewers.StyledString.Styler;
23
import org.eclipse.jface.viewers.TreeExpansionEvent;
24
import org.eclipse.swt.SWT;
25
import org.eclipse.swt.graphics.TextStyle;
26
import org.eclipse.swt.layout.GridData;
27
import org.eclipse.swt.layout.GridLayout;
28
import org.eclipse.swt.widgets.Composite;
29
import org.eclipse.swt.widgets.Display;
30

    
31
import eu.etaxonomy.cdm.model.common.CdmBase;
32
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
33
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
34
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
35
import eu.etaxonomy.taxeditor.store.CdmStore;
36

    
37
/**
38
 * @author a.oppermann
39
 * @date 21.07.2014
40
 *
41
 */
42
public class AvailableDistributionPage extends AbstractAreaSelectionWizard implements ICdmEntitySessionEnabled {
43

    
44
    /**
45
     * @param pageName
46
     */
47
    protected AvailableDistributionPage(String pageName) {
48
        super(pageName);
49
        this.localPref = true;
50

    
51
    }
52

    
53
    /*
54
     * (non-Javadoc)
55
     *
56
     * @see
57
     * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
58
     * .Composite)
59
     */
60
    /** {@inheritDoc} */
61
    @Override
62
    public void createControl(Composite parent) {
63
        IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
64

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

    
85
            private boolean ignoreCheckEvent = false;
86

    
87
            @Override
88
            public void checkStateChanged(CheckStateChangedEvent event) {
89
                if (ignoreCheckEvent ) {
90
                    return;
91
                }
92
                ignoreCheckEvent = true;
93
                try {
94
                    checkChildren(event.getElement(), event.getChecked());
95
                    grayParents(event.getElement(), event.getChecked());
96
                   // ((CheckboxTreeViewer)getViewer()).refresh();
97
                }
98
                finally {
99
                    ignoreCheckEvent = false;
100
                }
101
                checkNoneChecked();
102
            }
103
        });
104
        ((CheckboxTreeViewer)getViewer()).addTreeListener(new ITreeViewerListener() {
105
            @Override
106
            public void treeCollapsed(TreeExpansionEvent event) {
107
            }
108

    
109
            @Override
110
            public void treeExpanded(TreeExpansionEvent event) {
111
                final Object element = event.getElement();
112
                final Object[] children = ((DistributionContentProvider)getViewer().getContentProvider()).getChildren(element);
113
                for (Object child : children) {
114
                    if (child instanceof NamedAreaWrapper){
115
                        if (getListCheckedTerms().contains(((NamedAreaWrapper) child).getNamedArea()) ){
116
                            ((CheckboxTreeViewer)getViewer()).setChecked(child, true);
117
                        }
118
                        if (getListGrayedTerms().contains(((NamedAreaWrapper) child).getNamedArea())&& !((NamedAreaWrapper) child).isBaseElement){
119
                            ((CheckboxTreeViewer)getViewer()).setGrayChecked(child, true);
120
                        }
121
                    }
122

    
123
                }
124
            }
125
        });
126

    
127
        // TODO: write listener or toggle button to select all named areas
128

    
129
        rememberCheckedValues(checkedValues, grayedValues);
130
        ((CheckboxTreeViewer)getViewer()).expandToLevel(2);
131
        setControl(composite);
132
    }
133

    
134

    
135

    
136

    
137

    
138

    
139
    private boolean checkNoneChecked() {
140

    
141
        if (((CheckboxTreeViewer)getViewer()).getCheckedElements().length == 0) {
142
            setMessage("Please check at least one item", WARNING);
143
            return true;
144
        } else {
145
            setMessage(null);
146
            return false;
147
        }
148
    }
149

    
150

    
151
//    /**
152
//     *
153
//     * @param path
154
//     */
155
//    private void checkParents(final TreePath path) {
156
//        if (path == null) {
157
//            return;
158
//        }
159
//        TermContentProvider tcp = new TermContentProvider();
160
//        Object treeElement = path.getLastSegment();
161
//
162
//        if (treeElement != null) {
163
//            boolean allChecked = true;
164
//            boolean allUnchecked = true;
165
//            for (final Object fieldElement : tcp.getChildren(treeElement)) {
166
//                allChecked = allChecked && ((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
167
//                allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
168
//            }
169
//            if (allUnchecked) {
170
//                ((CheckboxTreeViewer)getViewer()).setChecked(treeElement, false);
171
//                ((CheckboxTreeViewer)getViewer()).setGrayed(treeElement, false);
172
//            } else if (allChecked) {
173
//                ((CheckboxTreeViewer)getViewer()).setChecked(treeElement, true);
174
//                ((CheckboxTreeViewer)getViewer()).setGrayed(treeElement, false);
175
//            } else if (!allUnchecked && !allChecked) {
176
//                ((CheckboxTreeViewer)getViewer()).setChecked(treeElement, true);
177
//                ((CheckboxTreeViewer)getViewer()).setGrayed(treeElement, true);
178
//            }
179
//        }
180
//        checkParents(path.getParentPath());
181
//    }
182

    
183

    
184
    /**
185
    *
186
    * @param path
187
    * @param checked
188
    */
189
   private void checkChildren(final Object element, final boolean checked) {
190
       if (element == null) {
191
           return;
192
       }
193

    
194
       if (((CheckboxTreeViewer)getViewer()).isExpandable(element)){
195
           ((CheckboxTreeViewer)getViewer()).expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
196
           ((CheckboxTreeViewer)getViewer()).setSubtreeChecked(element, checked);
197

    
198
           ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
199
           if (((CheckboxTreeViewer)getViewer()).getGrayed(element)){
200
               ((CheckboxTreeViewer)getViewer()).setGrayChecked(element, !checked);
201
           }
202
//           if (element instanceof NamedAreaWrapper){
203
//               NamedAreaWrapper baseElement = new NamedAreaWrapper(((NamedAreaWrapper)element).getNamedArea(), true, ((NamedAreaWrapper)element).parent);
204
//               ((CheckboxTreeViewer)getViewer()).setChecked(baseElement, !checked);
205
//               ((CheckboxTreeViewer)getViewer()).setGrayed(element, checked);
206
//           }
207

    
208
       }else{
209
           ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
210
           ((CheckboxTreeViewer)getViewer()).setGrayed(element, false);
211
       }
212

    
213
   }
214
   /**
215
   *
216
   * @param path
217
   * @param checked
218
   */
219
  private void grayParents(final Object element, boolean checked) {
220
      DistributionContentProvider tcp = new DistributionContentProvider();
221

    
222
      if (element == null) {
223
          return;
224
      }
225
   //   final Object element = path.getLastSegment();
226
      Object parent = tcp.getParent(element);
227
      if (parent != null) {
228

    
229
          boolean allUnchecked = true;
230
          boolean allChecked = true;
231
          //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
232
//          if (checked){
233
//              if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
234
//                  ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
235
//              }
236
//
237
//          }else{
238
              for (final Object fieldElement : tcp.getChildren(parent)) {
239
                  allChecked = allChecked && ((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
240
                  allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
241
                  allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getGrayed(fieldElement);
242
              }
243
              if (allUnchecked) {
244
//                  if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
245
                      ((CheckboxTreeViewer)getViewer()).setChecked(parent, false);
246
                      ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
247
//                  }else{
248
//                      checked = true;
249
//                  }
250
              } else if (allChecked){
251
                  ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
252
                  ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
253
              }else {
254
//                if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
255
                    ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
256
                    ((CheckboxTreeViewer)getViewer()).setChecked(parent, true);
257
//                }
258
                checked = true;
259

    
260
              }
261
//          }
262
        grayParents(parent, checked);
263
      }
264
  }
265

    
266
    @Override
267
    public void dispose() {
268
        CdmStore.getCurrentSessionManager().dispose(this);
269
        super.dispose();
270
    }
271
    /* (non-Javadoc)
272
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
273
     */
274
    @Override
275
    public ICdmEntitySession getCdmEntitySession() {
276
        return CdmStore.getCurrentSessionManager().getNullSession();
277
    }
278

    
279
    /* (non-Javadoc)
280
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
281
     */
282
    @Override
283
    public <T extends CdmBase> Collection<T> getRootEntities() {
284
        return null;
285
    }
286

    
287
    /* (non-Javadoc)
288
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
289
     */
290
    @Override
291
    public Map<Object, List<String>> getPropertyPathsMap() {
292
        Map<Object, List<String>> propertyPathsMap = new HashMap<Object, List<String>>();
293
        List<String> termsPropertyPaths = Arrays.asList(new String[] {
294
                "includes"
295
        });
296
        propertyPathsMap.put("includes", termsPropertyPaths);
297
        propertyPathsMap.put("terms", termsPropertyPaths);
298
        return propertyPathsMap;
299
    }
300

    
301

    
302

    
303

    
304
}
(5-5/11)