Project

General

Profile

Download (10.8 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.ITreeSelection;
25
import org.eclipse.jface.viewers.StyledString.Styler;
26
import org.eclipse.jface.viewers.TreePath;
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.addCheckStateListener(new ICheckStateListener() {
97

    
98
            private boolean ignoreCheckEvent = false;
99

    
100
            @Override
101
            public void checkStateChanged(CheckStateChangedEvent event) {
102

    
103

    
104
                if (ignoreCheckEvent ) {
105
                    return;
106
                }
107

    
108
                ignoreCheckEvent = true;
109

    
110
                try {
111
                    TreePath path  = ((ITreeSelection) viewer.getSelection()).getPaths()[0];
112
                    checkChildren(event.getElement(), event.getChecked());
113
                    checkParents(path.getParentPath());
114
                }
115
                finally {
116
                    ignoreCheckEvent = false;
117
                }
118
                checkNoneChecked();
119
            }
120
        });
121
        // TODO: write listener or toggle button to select all named areas
122

    
123
        rememberCheckedValues(checkedValues, grayedValues);
124
        setControl(composite);
125
    }
126

    
127

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

    
137
    private void rememberCheckedValues(String checkedValues, String grayedValues) {
138
        viewer.setInput(initialiseVocabularies());
139

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

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

    
182
    private boolean checkNoneChecked() {
183

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

    
193
    /**
194
     * @return the viewer
195
     */
196
    public CheckboxTreeViewer getViewer() {
197
        return viewer;
198
    }
199

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

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

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

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

    
263
       if (element == null) {
264
           return;
265
       }
266
    //   final Object element = path.getLastSegment();
267
       if (element != null) {
268
           this.viewer.setChecked(element, checked);
269
           this.viewer.setGrayed(element, false);
270
           int length = tcp.getChildren(element).length;
271
           if(length>1){
272
               this.viewer.expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
273
               this.viewer.setSubtreeChecked(element, checked);
274
           }
275
       }
276
   }
277

    
278
    @Override
279
    public void dispose() {
280
        CdmStore.getCurrentSessionManager().dispose(this);
281
        super.dispose();
282
    }
283
    /* (non-Javadoc)
284
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
285
     */
286
    @Override
287
    public ICdmEntitySession getCdmEntitySession() {
288
        return CdmStore.getCurrentSessionManager().getNullSession();
289
    }
290

    
291
    /* (non-Javadoc)
292
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
293
     */
294
    @Override
295
    public <T extends CdmBase> Collection<T> getRootEntities() {
296
        return null;
297
    }
298

    
299
    /* (non-Javadoc)
300
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
301
     */
302
    @Override
303
    public Map<Object, List<String>> getPropertyPathsMap() {
304
        Map<Object, List<String>> propertyPathsMap = new HashMap<Object, List<String>>();
305
        List<String> termsPropertyPaths = Arrays.asList(new String[] {
306
                "includes"
307
        });
308
        propertyPathsMap.put("includes", termsPropertyPaths);
309
        propertyPathsMap.put("terms", termsPropertyPaths);
310
        return propertyPathsMap;
311
    }
312

    
313
}
(1-1/4)