Project

General

Profile

Download (3.67 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2018 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 org.eclipse.jface.viewers.AbstractTreeViewer;
12
import org.eclipse.jface.viewers.CheckboxTreeViewer;
13
import org.eclipse.jface.viewers.IBaseLabelProvider;
14
import org.eclipse.jface.viewers.ITreeContentProvider;
15
import org.eclipse.swt.SWT;
16
import org.eclipse.swt.layout.GridData;
17
import org.eclipse.swt.layout.GridLayout;
18
import org.eclipse.swt.widgets.Composite;
19
import org.eclipse.swt.widgets.Tree;
20
import org.eclipse.swt.widgets.TreeItem;
21

    
22
/**
23
 * @author pplitzner
24
 * @since Oct 26, 2018
25
 *
26
 */
27
public class CheckBoxTreeComposite extends Composite {
28

    
29
    private CheckboxTreeViewer viewer;
30
    private ITreeContentProvider contentProvider;
31

    
32
    public CheckBoxTreeComposite(Composite parent, ITreeContentProvider contentProvider, IBaseLabelProvider labelProvider, int style) {
33
        super(parent, style);
34
        this.contentProvider = contentProvider;
35
        Composite composite = new Composite(parent, SWT.NULL);
36
        composite.setLayout(new GridLayout());
37
        Tree tree = new Tree(parent, SWT.BORDER | SWT.CHECK);
38
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
39
        tree.addListener(SWT.Selection, event -> {
40
            if (event.detail == SWT.CHECK) {
41
                TreeItem item = (TreeItem) event.item;
42
                Object data = item.getData();
43
                boolean checked = item.getChecked();
44
                if(checked){
45
                    viewer.expandToLevel(data, AbstractTreeViewer.ALL_LEVELS);
46
                }
47
                checkItems(item, checked);
48
                checkPath(item.getParentItem(), checked, false);
49
            }
50
        });
51
        viewer = new CheckboxTreeViewer(tree);
52
        viewer.setContentProvider(contentProvider);
53
        viewer.setLabelProvider(labelProvider);
54
    }
55

    
56
    private void checkPath(TreeItem item, boolean checked, boolean grayed) {
57
        if (item == null) {
58
            return;
59
        }
60
        if (grayed) {
61
            checked = true;
62
        } else {
63
            int index = 0;
64
            TreeItem[] items = item.getItems();
65
            while (index < items.length) {
66
                TreeItem child = items[index];
67
                if (child.getGrayed() || checked != child.getChecked()) {
68
                    checked = grayed = true;
69
                    break;
70
                }
71
                index++;
72
            }
73
        }
74
        item.setChecked(checked);
75
        item.setGrayed(grayed);
76
        checkPath(item.getParentItem(), checked, grayed);
77
    }
78

    
79
    private void checkItems(TreeItem item, boolean checked) {
80
        item.setGrayed(false);
81
        item.setChecked(checked);
82
        TreeItem[] items = item.getItems();
83
        for (int i = 0; i < items.length; i++) {
84
            checkItems(items[i], checked);
85
        }
86
    }
87

    
88
    public CheckboxTreeViewer getViewer() {
89
        return viewer;
90
    }
91

    
92
    /**
93
     * Checks the tree items corresponding to the given elements.<br>
94
     * @param elements
95
     */
96
    public void setCheckedElements(Object[] elements) {
97
        viewer.setCheckedElements(elements);
98
        for (Object element : elements) {
99
            Object parent = contentProvider.getParent(element);
100
            checkPath(parent);
101
        }
102
    }
103

    
104
    private void checkPath(Object object){
105
        if(object!=null){
106
            checkPath(contentProvider.getParent(object));
107
            viewer.expandToLevel(object, 1);
108
            viewer.setGrayChecked(object, true);
109
        }
110
    }
111

    
112
}
(10-10/14)