Project

General

Profile

« Previous | Next » 

Revision 05d18da0

Added by Patrick Plitzner over 5 years ago

ref #7912 Add toolbar to checkbox viewer + visualize selection state

View differences:

eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/wizard/CheckBoxTreeComposite.java
8 8
 */
9 9
package eu.etaxonomy.taxeditor.preference.wizard;
10 10

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

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

  
22 31
/**
23 32
 * @author pplitzner
24 33
 * @since Oct 26, 2018
25 34
 *
26 35
 */
27
public class CheckBoxTreeComposite extends Composite {
36
public class CheckBoxTreeComposite extends Composite implements SelectionListener {
28 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);
29 41
    private CheckboxTreeViewer viewer;
30
    private ITreeContentProvider contentProvider;
42
    private Button btnCollapse;
43
    private Button btnSelectChildren;
44
    private Button btnExpand;
45
    private Button btnSelectAllChildren;
31 46

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

  
36 52
        composite.setLayout(new GridLayout());
37
        Tree tree = new Tree(parent, SWT.BORDER | SWT.CHECK);
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);
38 75
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
39 76
        tree.addListener(SWT.Selection, event -> {
40 77
            if (event.detail == SWT.CHECK) {
41 78
                TreeItem item = (TreeItem) event.item;
42
                Object data = item.getData();
43 79
                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);
80
                item.setGrayed(false);
81
                item.setChecked(checked);
82
                checkPath(item, checked, false);
49 83
            }
50 84
        });
51 85
        viewer = new CheckboxTreeViewer(tree);
......
57 91
        if (item == null) {
58 92
            return;
59 93
        }
94
        TreeItem[] items = item.getItems();
60 95
        if (grayed) {
61 96
            checked = true;
62 97
        } else {
63 98
            int index = 0;
64
            TreeItem[] items = item.getItems();
65 99
            while (index < items.length) {
66 100
                TreeItem child = items[index];
67 101
                if (child.getGrayed() || checked != child.getChecked()) {
......
71 105
                index++;
72 106
            }
73 107
        }
74
        item.setChecked(checked);
75 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);
76 119
        checkPath(item.getParentItem(), checked, grayed);
77 120
    }
78 121

  
79
    private void checkItems(TreeItem item, boolean checked) {
122
    private void checkItems(TreeItem item, boolean checked, boolean recurseAll) {
80 123
        item.setGrayed(false);
81 124
        item.setChecked(checked);
82 125
        TreeItem[] items = item.getItems();
126
        if(items.length!=0){
127
            item.setFont(FONT_BOLD);
128
        }
83 129
        for (int i = 0; i < items.length; i++) {
84
            checkItems(items[i], checked);
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
            }
85 143
        }
86 144
    }
87 145

  
......
96 154
    public void setCheckedElements(Object[] elements) {
97 155
        viewer.setCheckedElements(elements);
98 156
        for (Object element : elements) {
99
            Object parent = contentProvider.getParent(element);
100
            checkPath(parent);
157
            Widget item = viewer.testFindItem(element);
158
            if(item instanceof TreeItem){
159
                checkPath((TreeItem) item, true, false);
160
            }
101 161
        }
102 162
    }
103 163

  
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);
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
            }
109 191
        }
110 192
    }
111 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
    }
112 211
}

Also available in: Unified diff