Project

General

Profile

Download (7.66 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.resource.JFaceResources;
12
import org.eclipse.jface.viewers.AbstractTreeViewer;
13
import org.eclipse.jface.viewers.CheckboxTreeViewer;
14
import org.eclipse.jface.viewers.IBaseLabelProvider;
15
import org.eclipse.jface.viewers.ITreeContentProvider;
16
import org.eclipse.jface.viewers.ITreeSelection;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.events.SelectionEvent;
19
import org.eclipse.swt.events.SelectionListener;
20
import org.eclipse.swt.graphics.Font;
21
import org.eclipse.swt.layout.GridData;
22
import org.eclipse.swt.layout.GridLayout;
23
import org.eclipse.swt.widgets.Button;
24
import org.eclipse.swt.widgets.Composite;
25
import org.eclipse.swt.widgets.Tree;
26
import org.eclipse.swt.widgets.TreeItem;
27
import org.eclipse.swt.widgets.Widget;
28

    
29
import eu.etaxonomy.taxeditor.model.ImageResources;
30

    
31
/**
32
 * @author pplitzner
33
 * @since Oct 26, 2018
34
 *
35
 */
36
public class CheckBoxTreeComposite extends Composite implements SelectionListener {
37

    
38
    private static final Font FONT_DEFAULT = JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT);
39
    private static final Font FONT_ITALIC = JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
40
    private static final Font FONT_BOLD = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
41
    private CheckboxTreeViewer viewer;
42
    private Button btnCollapse;
43
    private Button btnSelectChildren;
44
    private Button btnExpand;
45
    private Button btnSelectAllChildren;
46

    
47
    public CheckBoxTreeComposite(Composite parent, ITreeContentProvider contentProvider, IBaseLabelProvider labelProvider, int style) {
48
        super(parent, style);
49
        Composite composite = new Composite(parent, SWT.NULL);
50
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
51

    
52
        composite.setLayout(new GridLayout());
53

    
54
        Composite toolbar = new Composite(composite, SWT.NONE);
55
        toolbar.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
56
        toolbar.setLayout(new GridLayout(4, false));
57

    
58
        btnCollapse = new Button(toolbar, SWT.NONE);
59
        btnCollapse.addSelectionListener(this);
60
        btnCollapse.setImage(ImageResources.getImage(ImageResources.COLLAPSE_ALL));
61

    
62
        btnExpand = new Button(toolbar, SWT.NONE);
63
        btnExpand.addSelectionListener(this);
64
        btnExpand.setImage(ImageResources.getImage(ImageResources.EXPAND));
65

    
66
        btnSelectAllChildren = new Button(toolbar, SWT.NONE);
67
        btnSelectAllChildren.addSelectionListener(this);
68
        btnSelectAllChildren.setImage(ImageResources.getImage(ImageResources.HIERARCHICAL));
69

    
70
        btnSelectChildren = new Button(toolbar, SWT.NONE);
71
        btnSelectChildren.addSelectionListener(this);
72
        btnSelectChildren.setImage(ImageResources.getImage(ImageResources.FLAT));
73
        btnSelectChildren.setVisible(false);
74
        Tree tree = new Tree(composite, SWT.BORDER | SWT.CHECK);
75
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
76
        tree.addListener(SWT.Selection, event -> {
77
            if (event.detail == SWT.CHECK) {
78
                TreeItem item = (TreeItem) event.item;
79
                boolean checked = item.getChecked();
80
                item.setGrayed(false);
81
                item.setChecked(checked);
82
                checkPath(item, checked, false);
83
            }
84
        });
85
        viewer = new CheckboxTreeViewer(tree);
86
        viewer.setContentProvider(contentProvider);
87
        viewer.setLabelProvider(labelProvider);
88
    }
89

    
90
    private void checkPath(TreeItem item, boolean checked, boolean grayed) {
91
        if (item == null) {
92
            return;
93
        }
94
        TreeItem[] items = item.getItems();
95
        if (grayed) {
96
            checked = true;
97
        } else {
98
            int index = 0;
99
            while (index < items.length) {
100
                TreeItem child = items[index];
101
                if (child.getGrayed() || checked != child.getChecked()) {
102
                    checked = grayed = true;
103
                    break;
104
                }
105
                index++;
106
            }
107
        }
108
        item.setGrayed(grayed);
109
        if(checked && items.length>0){
110
            item.setFont(FONT_BOLD);
111
            if(grayed){
112
                item.setFont(FONT_ITALIC);
113
            }
114
        }
115
        else{
116
            item.setFont(FONT_DEFAULT);
117
        }
118
        item.setExpanded(true);
119
        checkPath(item.getParentItem(), checked, grayed);
120
    }
121

    
122
    private void checkItems(TreeItem item, boolean checked, boolean recurseAll) {
123
        item.setGrayed(false);
124
        item.setChecked(checked);
125
        TreeItem[] items = item.getItems();
126
        if(items.length!=0){
127
            item.setFont(FONT_BOLD);
128
        }
129
        for (int i = 0; i < items.length; i++) {
130
            if(recurseAll){
131
                checkItems(items[i], checked, true);
132
            }
133
            else{
134
                //                items[i].setGrayed(false);
135
                //                items[i].setChecked(checked);
136
                //                TreeItem[] children = items[i].getItems();
137
                //                for (TreeItem child : children) {
138
                //                    child.setExpanded(true);
139
                //                    checkItems(child, false, false);
140
                //                    checkPath(child, false, false);
141
                //                }
142
            }
143
        }
144
    }
145

    
146
    public CheckboxTreeViewer getViewer() {
147
        return viewer;
148
    }
149

    
150
    /**
151
     * Checks the tree items corresponding to the given elements.<br>
152
     * @param elements
153
     */
154
    public void setCheckedElements(Object[] elements) {
155
        viewer.setCheckedElements(elements);
156
        for (Object element : elements) {
157
            Widget item = viewer.testFindItem(element);
158
            if(item instanceof TreeItem){
159
                checkPath((TreeItem) item, true, false);
160
            }
161
        }
162
    }
163

    
164
    @Override
165
    public void widgetSelected(SelectionEvent e) {
166
        ITreeSelection structuredSelection = viewer.getStructuredSelection();
167
        Object firstElement = structuredSelection.getFirstElement();
168
        if(e.widget == btnCollapse){
169
            viewer.collapseAll();
170
        }
171
        else if(e.widget == btnExpand){
172
            viewer.expandToLevel(firstElement, AbstractTreeViewer.ALL_LEVELS);
173
        }
174
        else if(e.widget == btnSelectChildren){
175
            TreeItem item = (TreeItem) viewer.testFindItem(firstElement);
176
            if(item!=null){
177
                viewer.expandToLevel(firstElement, 1);
178
                boolean checked = !item.getChecked();
179
                checkItems(item, checked, false);
180
                checkPath(item, checked, false);
181
            }
182
        }
183
        else if(e.widget == btnSelectAllChildren){
184
            viewer.expandToLevel(firstElement, AbstractTreeViewer.ALL_LEVELS);
185
            TreeItem item = (TreeItem) viewer.testFindItem(firstElement);
186
            if(item!=null){
187
                boolean checked = !item.getChecked();
188
                checkItems(item, checked, true);
189
                checkPath(item, checked, false);
190
            }
191
        }
192
    }
193

    
194
    @Override
195
    public void widgetDefaultSelected(SelectionEvent e) {
196
    }
197

    
198
    public Button getBtnCollapse() {
199
        return btnCollapse;
200
    }
201
    public Button getBtnSelectChildren() {
202
        return btnSelectChildren;
203
    }
204

    
205
    public Button getBtnExpand() {
206
        return btnExpand;
207
    }
208
    public Button getBtnSelectAllChildren() {
209
        return btnSelectAllChildren;
210
    }
211
}
(10-10/13)