Project

General

Profile

Download (9.13 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.StyledString.Styler;
22
import org.eclipse.jface.viewers.TreePath;
23
import org.eclipse.jface.viewers.ViewerComparator;
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.editor.definedterm.TermContentProvider;
33
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
34
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
35
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
36
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
37
import eu.etaxonomy.taxeditor.store.CdmStore;
38

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

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

    
53
    }
54

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

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

    
87
            private boolean ignoreCheckEvent = false;
88

    
89
            @Override
90
            public void checkStateChanged(CheckStateChangedEvent event) {
91

    
92

    
93
                if (ignoreCheckEvent ) {
94
                    return;
95
                }
96

    
97
                ignoreCheckEvent = true;
98

    
99
                try {
100

    
101
                    checkChildren(event.getElement(), event.getChecked());
102
                    grayParents(event.getElement(), event.getChecked());
103
                    ((CheckboxTreeViewer)getViewer()).refresh();
104
                }
105
                finally {
106
                    ignoreCheckEvent = false;
107
                }
108
                checkNoneChecked();
109
            }
110
        });
111
        // TODO: write listener or toggle button to select all named areas
112

    
113
        rememberCheckedValues(checkedValues, grayedValues);
114
        setControl(composite);
115
    }
116

    
117

    
118

    
119

    
120

    
121

    
122
    private boolean checkNoneChecked() {
123

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

    
133

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

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

    
166

    
167
    /**
168
    *
169
    * @param path
170
    * @param checked
171
    */
172
   private void checkChildren(final Object element, final boolean checked) {
173
       TermContentProvider tcp = new TermContentProvider();
174

    
175
       if (element == null) {
176
           return;
177
       }
178

    
179
       ((CheckboxTreeViewer)getViewer()).setChecked(element, checked);
180
       ((CheckboxTreeViewer)getViewer()).setGrayed(element, false);
181
       if (((CheckboxTreeViewer)getViewer()).isExpandable(element)){
182
           ((CheckboxTreeViewer)getViewer()).expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
183
           ((CheckboxTreeViewer)getViewer()).setSubtreeChecked(element, checked);
184
       }
185

    
186
   }
187
   /**
188
   *
189
   * @param path
190
   * @param checked
191
   */
192
  private void grayParents(final Object element, boolean checked) {
193
      TermContentProvider tcp = new TermContentProvider();
194

    
195
      if (element == null) {
196
          return;
197
      }
198
   //   final Object element = path.getLastSegment();
199
      Object parent = tcp.getParent(element);
200
      if (parent != null) {
201

    
202
          boolean allUnchecked = true;
203
          //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
204
          if (checked){
205
              if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
206
                  ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
207
              }
208

    
209
          }else{
210
              for (final Object fieldElement : tcp.getChildren(parent)) {
211
                  allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getChecked(fieldElement);
212
                  allUnchecked = allUnchecked && !((CheckboxTreeViewer)getViewer()).getGrayed(fieldElement);
213
              }
214
              if (allUnchecked) {
215
                  ((CheckboxTreeViewer)getViewer()).setChecked(parent, false);
216
                  ((CheckboxTreeViewer)getViewer()).setGrayed(parent, false);
217
              } else {
218
                if (!((CheckboxTreeViewer)getViewer()).getChecked(parent)){
219
                    ((CheckboxTreeViewer)getViewer()).setGrayChecked(parent, true);
220
                }
221
                checked = true;
222

    
223
              }
224
          }
225
        grayParents(parent, checked);
226
      }
227
  }
228

    
229
    @Override
230
    public void dispose() {
231
        CdmStore.getCurrentSessionManager().dispose(this);
232
        super.dispose();
233
    }
234
    /* (non-Javadoc)
235
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
236
     */
237
    @Override
238
    public ICdmEntitySession getCdmEntitySession() {
239
        return CdmStore.getCurrentSessionManager().getNullSession();
240
    }
241

    
242
    /* (non-Javadoc)
243
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
244
     */
245
    @Override
246
    public <T extends CdmBase> Collection<T> getRootEntities() {
247
        return null;
248
    }
249

    
250
    /* (non-Javadoc)
251
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
252
     */
253
    @Override
254
    public Map<Object, List<String>> getPropertyPathsMap() {
255
        Map<Object, List<String>> propertyPathsMap = new HashMap<Object, List<String>>();
256
        List<String> termsPropertyPaths = Arrays.asList(new String[] {
257
                "includes"
258
        });
259
        propertyPathsMap.put("includes", termsPropertyPaths);
260
        propertyPathsMap.put("terms", termsPropertyPaths);
261
        return propertyPathsMap;
262
    }
263

    
264

    
265

    
266

    
267
}
(3-3/7)