Project

General

Profile

Download (8.51 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.List;
15
import java.util.Set;
16
import java.util.UUID;
17

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

    
33
import eu.etaxonomy.cdm.api.service.ITermService;
34
import eu.etaxonomy.cdm.api.service.IVocabularyService;
35
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
36
import eu.etaxonomy.cdm.model.common.TermType;
37
import eu.etaxonomy.cdm.model.common.TermVocabulary;
38
import eu.etaxonomy.taxeditor.editor.definedterm.TermContentProvider;
39
import eu.etaxonomy.taxeditor.editor.definedterm.TermLabelProvider;
40
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
41
import eu.etaxonomy.taxeditor.store.CdmStore;
42

    
43
/**
44
 * @author a.oppermann
45
 * @date 21.07.2014
46
 *
47
 */
48
public class AvailableDistributionPage extends WizardPage {
49

    
50
    private CheckboxTreeViewer viewer;
51

    
52
    private Set<TermVocabulary<DefinedTermBase>> vocabularies;
53

    
54
    /**
55
     * @param pageName
56
     */
57
    protected AvailableDistributionPage(String pageName) {
58
        super(pageName);
59
        // TODO check if configuration exists
60
    }
61

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

    
92
            private boolean ignoreCheckEvent = false;
93

    
94
            @Override
95
            public void checkStateChanged(CheckStateChangedEvent event) {
96

    
97

    
98
                if (ignoreCheckEvent ) {
99
                    return;
100
                }
101

    
102
                ignoreCheckEvent = true;
103

    
104
                try {
105
                    TreePath path  = ((ITreeSelection) viewer.getSelection()).getPaths()[0];
106
                    checkChildren(path, event.getChecked());
107
                    checkParents(path.getParentPath());
108
                }
109
                finally {
110
                    ignoreCheckEvent = false;
111
                }
112
                checkNoneChecked();
113
            }
114
        });
115
        // TODO: write listener or toggle button to select all named areas
116

    
117
        rememberCheckedValues(checkedValues, grayedValues);
118
        setControl(composite);
119
    }
120

    
121

    
122
    protected List<TermVocabulary<DefinedTermBase>> initialiseVocabularies() {
123
        if (vocabularies != null) {
124
            vocabularies.clear();
125
        }
126
        List<TermVocabulary<DefinedTermBase>> vocs = CdmStore.getService(IVocabularyService.class).findByTermType(
127
                TermType.NamedArea);
128
        return vocs;
129
    }
130

    
131
    private void rememberCheckedValues(String checkedValues, String grayedValues) {
132
        viewer.setInput(initialiseVocabularies());
133

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

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

    
176
    private boolean checkNoneChecked() {
177

    
178
        if (viewer.getCheckedElements().length == 0) {
179
            setMessage("Please check at least one item", WARNING);
180
            return true;
181
        } else {
182
            setMessage(null);
183
            return false;
184
        }
185
    }
186

    
187
    /**
188
     * @return the viewer
189
     */
190
    public CheckboxTreeViewer getViewer() {
191
        return viewer;
192
    }
193

    
194
    /**
195
     *
196
     * @param path
197
     */
198
    private void checkParents(final TreePath path) {
199
        if (path == null) {
200
            return;
201
        }
202
        TermContentProvider tcp = new TermContentProvider();
203
        Object treeElement = path.getLastSegment();
204

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

    
226
    /**
227
     *
228
     * @param path
229
     * @param checked
230
     */
231
    private void checkChildren(final TreePath path, final boolean checked) {
232
        TermContentProvider tcp = new TermContentProvider();
233

    
234
        if (path == null) {
235
            return;
236
        }
237
        final Object element = path.getLastSegment();
238
        if (element != null) {
239
            this.viewer.setChecked(element, checked);
240
            this.viewer.setGrayed(element, false);
241
            int length = tcp.getChildren(element).length;
242
            if(length>1){
243
                this.viewer.setSubtreeChecked(element, checked);
244
            }
245
        }
246
    }
247

    
248
}
(1-1/4)