Project

General

Profile

Download (11.5 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.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.l10n.Messages;
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 AbstractTermSelectionWizardPage implements ICdmEntitySessionEnabled {
54

    
55
    /**
56
     * @param pageName
57
     */
58
    protected AvailableDistributionPage(String pageName) {
59
        super(pageName, TermType.NamedArea);
60
        this.localPref = true;
61

    
62
    }
63

    
64
    /** {@inheritDoc} */
65
    @Override
66
    public void createControl(Composite parent) {
67
        IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
68

    
69
        String checkedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS);
70
        String grayedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS_GRAYED);
71
        setTitle(Messages.AvailableDistributionPage_PAGE_TITLE);
72
        setDescription(Messages.AvailableDistributionPage_PAGE_DESCRIPTION);
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(Messages.AvailableDistributionPage_CHECK_MESSAGE, 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" //$NON-NLS-1$
265
        });
266
        propertyPathsMap.put("includes", termsPropertyPaths); //$NON-NLS-1$
267
        propertyPathsMap.put("terms", termsPropertyPaths); //$NON-NLS-1$
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(";"); //$NON-NLS-1$
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
}
(5-5/13)