Project

General

Profile

Download (10.1 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
 * Copyright (C) 2014 EDIT
4
 * European Distributed Institute of Taxonomy
5
 * http://www.e-taxonomy.eu
6
 *
7
 * The contents of this file are subject to the Mozilla Public License Version 1.1
8
 * See LICENSE.TXT at the top of this package for the full license terms.
9
 */
10
package eu.etaxonomy.taxeditor.preference.wizard;
11

    
12
import java.util.ArrayList;
13
import java.util.Arrays;
14
import java.util.Collection;
15
import java.util.HashMap;
16
import java.util.List;
17
import java.util.Map;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.eclipse.jface.preference.IPreferenceStore;
22
import org.eclipse.jface.viewers.CheckStateChangedEvent;
23
import org.eclipse.jface.viewers.CheckboxTreeViewer;
24
import org.eclipse.jface.viewers.ICheckStateListener;
25
import org.eclipse.jface.viewers.ITreeSelection;
26
import org.eclipse.jface.viewers.StyledString.Styler;
27
import org.eclipse.jface.viewers.TreePath;
28
import org.eclipse.jface.wizard.WizardPage;
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.ITermService;
37
import eu.etaxonomy.cdm.api.service.IVocabularyService;
38
import eu.etaxonomy.cdm.model.common.CdmBase;
39
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
40
import eu.etaxonomy.cdm.model.common.TermType;
41
import eu.etaxonomy.cdm.model.common.TermVocabulary;
42
import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
43
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
44
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
45
import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
46
import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
47
import eu.etaxonomy.taxeditor.store.CdmStore;
48

    
49
/**
50
 * @author a.oppermann
51
 * @date 21.07.2014
52
 *
53
 */
54
public class AvailableDistributionPage extends WizardPage implements ICdmEntitySessionEnabled {
55

    
56
    private CheckboxTreeViewer viewer;
57

    
58
    private Set<TermVocabulary<DefinedTermBase>> vocabularies;
59

    
60
    /**
61
     * @param pageName
62
     */
63
    protected AvailableDistributionPage(String pageName) {
64
        super(pageName);
65
        // TODO check if configuration exists
66
        CdmStore.getCurrentSessionManager().bindNullSession();
67
    }
68

    
69
    /*
70
     * (non-Javadoc)
71
     *
72
     * @see
73
     * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
74
     * .Composite)
75
     */
76
    /** {@inheritDoc} */
77
    @Override
78
    public void createControl(Composite parent) {
79
        IPreferenceStore preferenceStore = PreferencesUtil.getPreferenceStore();
80
        String checkedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS);
81
        String grayedValues = preferenceStore.getString(PreferencesUtil.DISTRIBUTION_AREA_OCCURENCE_STATUS_GRAYED);
82
        setTitle("Select areas for ChecklistEditor");
83
        setDescription("In order to be able to modify and see the distribution status of taxa,\n"
84
                + "you have to select the areas which you like to see.");
85
        Composite composite = new Composite(parent, SWT.NULL);
86
        composite.setLayout(new GridLayout());
87
        viewer = new CheckboxTreeViewer(composite, SWT.NULL);
88
        viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
89
        viewer.setContentProvider(new TermContentProvider());
90
        Styler styler = new Styler() {
91
            @Override
92
            public void applyStyles(TextStyle textStyle) {
93
                textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_BLACK);
94
            }
95
        };
96
        viewer.setLabelProvider(new TermLabelProvider(styler));
97
        viewer.addCheckStateListener(new ICheckStateListener() {
98

    
99
            private boolean ignoreCheckEvent = false;
100

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

    
104

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

    
109
                ignoreCheckEvent = true;
110

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

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

    
128

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

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

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

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

    
183
    private boolean checkNoneChecked() {
184

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

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

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

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

    
233
    /**
234
     *
235
     * @param path
236
     * @param checked
237
     */
238
    private void checkChildren(final TreePath path, final boolean checked) {
239
        TermContentProvider tcp = new TermContentProvider();
240

    
241
        if (path == null) {
242
            return;
243
        }
244
        final Object element = path.getLastSegment();
245
        if (element != null) {
246
            this.viewer.setChecked(element, checked);
247
            this.viewer.setGrayed(element, false);
248
            int length = tcp.getChildren(element).length;
249
            if(length>1){
250
                this.viewer.expandToLevel(element, CheckboxTreeViewer.ALL_LEVELS);
251
                this.viewer.setSubtreeChecked(element, checked);
252
            }
253
        }
254
    }
255

    
256
    @Override
257
    public void dispose() {
258
        CdmStore.getCurrentSessionManager().dispose(this);
259
        super.dispose();
260
    }
261
    /* (non-Javadoc)
262
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getCdmEntitySession()
263
     */
264
    @Override
265
    public ICdmEntitySession getCdmEntitySession() {
266
        return CdmStore.getCurrentSessionManager().getNullSession();
267
    }
268

    
269
    /* (non-Javadoc)
270
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getRootEntities()
271
     */
272
    @Override
273
    public <T extends CdmBase> Collection<T> getRootEntities() {
274
        return null;
275
    }
276

    
277
    /* (non-Javadoc)
278
     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled#getPropertyPathsMap()
279
     */
280
    @Override
281
    public Map<Object, List<String>> getPropertyPathsMap() {
282
        Map<Object, List<String>> propertyPathsMap = new HashMap<Object, List<String>>();
283
        List<String> termsPropertyPaths = Arrays.asList(new String[] {
284
                "includes"
285
        });
286
        propertyPathsMap.put("includes", termsPropertyPaths);
287
        propertyPathsMap.put("terms", termsPropertyPaths);
288
        return propertyPathsMap;
289
    }
290

    
291
}
(1-1/4)