Checkbox tree viewer is not displaying on composite

Hari Krishna

I implemented my custom check box tree viewer, it displays simple organization hierarchy. Where organization has one (or) more managers, and each manager has one (or) more reportees under him.

  Organization
        Manager1
              reportee1
              reportee2
        Manager2
            reportee1
            reportee2
            reportee3
            ....
            ....
            reporteeN

But when I tried to add the tree viewer to the composite, it is not displaying. I am adding the code for your reference. Please let me know, where I am doing the mistake.

Employee.java

package com.sample;

public class Employee {
    private String name;
    private boolean inOffice;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isInOffice() {
        return inOffice;
    }

    public void setInOffice(boolean inOffice) {
        this.inOffice = inOffice;
    }

}

Manager.java

package com.sample;

import java.util.ArrayList;
import java.util.List;

public class Manager {
    private String name;
    private final List<Employee> employees = new ArrayList<> ();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Employee> getEmployees() {
        return employees;
    }

}

Organization.java

package com.sample;

import java.util.ArrayList;
import java.util.List;

public class Organization {
    private String name;
    private List<Manager> managers = new ArrayList<>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Manager> getManagers() {
        return managers;
    }

}

DataUtil.java

package com.sample;

public class DataUtil {

    public static Organization getOrganization() {
        Organization oranization = new Organization();
        oranization.setName("XYZ Corporation");

        Manager manager1 = new Manager();
        manager1.setName("Mukund Dixit");

        Manager manager2 = new Manager();
        manager2.setName("Anand Bandaru");

        Manager manager3 = new Manager();
        manager3.setName("Shreyas Desai");

        Manager manager4 = new Manager();
        manager4.setName("VadiRaj");

        Employee emp1 = new Employee();
        emp1.setInOffice(true);
        emp1.setName("Keerthi Shetty");

        Employee emp2 = new Employee();
        emp2.setInOffice(true);
        emp2.setName("Karthik");

        Employee emp3 = new Employee();
        emp3.setInOffice(true);
        emp3.setName("Brijesh");

        Employee emp4 = new Employee();
        emp4.setInOffice(true);
        emp4.setName("Deepank Bansal");

        Employee emp5 = new Employee();
        emp5.setInOffice(true);
        emp5.setName("Reshmi George");

        Employee emp6 = new Employee();
        emp6.setInOffice(true);
        emp6.setName("Janaki Sriram");

        Employee emp7 = new Employee();
        emp7.setInOffice(false);
        emp7.setName("Aravind Phaneendra");

        Employee emp8 = new Employee();
        emp8.setInOffice(true);
        emp8.setName("Nagendra");

        Employee emp9 = new Employee();
        emp9.setInOffice(true);
        emp9.setName("Maruthi");

        Employee emp10 = new Employee();
        emp10.setInOffice(true);
        emp10.setName("Piyush");

        Employee emp11 = new Employee();
        emp11.setInOffice(true);
        emp11.setName("Shanmugham");

        Employee emp12 = new Employee();
        emp12.setInOffice(false);
        emp12.setName("Phalgun Garimella");

        Employee emp13 = new Employee();
        emp13.setInOffice(false);
        emp13.setName("Sankalp");

        Employee emp14 = new Employee();
        emp14.setInOffice(false);
        emp14.setName("Arpan");

        Employee emp15 = new Employee();
        emp15.setInOffice(false);
        emp15.setName("Sandesh");

        Employee emp16 = new Employee();
        emp16.setInOffice(false);
        emp16.setName("Senthil");

        manager1.getEmployees().add(emp1);
        manager1.getEmployees().add(emp2);
        manager1.getEmployees().add(emp3);
        manager1.getEmployees().add(emp4);

        manager2.getEmployees().add(emp5);
        manager2.getEmployees().add(emp6);
        manager2.getEmployees().add(emp7);
        manager2.getEmployees().add(emp8);

        manager3.getEmployees().add(emp9);
        manager3.getEmployees().add(emp10);
        manager3.getEmployees().add(emp11);

        manager4.getEmployees().add(emp12);
        manager4.getEmployees().add(emp13);
        manager4.getEmployees().add(emp14);
        manager4.getEmployees().add(emp15);
        manager4.getEmployees().add(emp16);

        oranization.getManagers().add(manager1);
        oranization.getManagers().add(manager2);
        oranization.getManagers().add(manager3);
        oranization.getManagers().add(manager4);

        return oranization;
    }
}

MyCheckBoxLabelProvider.java

package com.sample;

import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ViewerCell;

public class MyCheckBoxLabelProvider extends CellLabelProvider {

    @Override
    public void update(ViewerCell cell) {
        Object element = cell.getElement();

        if (element instanceof Organization) {
            cell.setText("Org: ");
        } else if (element instanceof Manager) {
            cell.setText("M: ");
        } else {
            cell.setText("Emp: ");
        }
    }

}

MyCheckBoxTreeContentProvider.java

package com.sample;

import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;

public class MyCheckBoxTreeContentProvider implements ITreeContentProvider {

    public MyCheckBoxTreeContentProvider() {
    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub

    }

    @Override
    public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
        // TODO Auto-generated method stub

    }

    @Override
    public Object[] getChildren(Object obj) {

        if (obj instanceof Organization) {
            return ((Organization) obj).getManagers().toArray();
        }

        if (obj instanceof Manager) {
            return ((Manager) obj).getEmployees().toArray();
        }

        return new Object[0];
    }

    @Override
    public Object[] getElements(Object arg0) {
        Object[] roots = new Object[1];
        roots[0] = DataUtil.getOrganization();
        return roots;
    }

    @Override
    public Object getParent(Object arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean hasChildren(Object obj) {
        if (obj instanceof Organization || obj instanceof Manager) {
            return true;
        }
        return false;

    }

}

MyCheckBoxTreeSorter.java

package com.sample;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;

public class MyCheckBoxTreeSorter extends ViewerSorter {
    @Override
    public int compare(Viewer viewer, Object left, Object right) {
        if (left instanceof Manager && right instanceof Manager) {
            return ((Manager) left).getName().compareTo(((Manager) right).getName());
        }

        if (left instanceof Manager && right instanceof Manager) {
            return ((Employee) left).getName().compareTo(((Employee) right).getName());
        }

        return 0;
    }
}

MyCheckBoxTreeViewer.java

package com.sample;

import java.util.List;

import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;

public class MyCheckBoxTreeViewer extends CheckboxTreeViewer implements ICheckStateListener, ICheckStateProvider {
    public MyCheckBoxTreeViewer(Composite parent, int style) {
        super(parent, style);
        ColumnViewerToolTipSupport.enableFor(this);
        initializeTree();
    }

    private void initializeTree() {
        setCheckStateProvider(this);
        addCheckStateListener(this);
    }

    @Override
    public boolean isChecked(Object obj) {
        if (obj instanceof Manager) {
            Manager manager = (Manager) obj;

            List<Employee> employees = manager.getEmployees();
            for (Employee emp : employees) {
                if (!emp.isInOffice()) {
                    return false;
                }
            }
        }

        return true;
    }

    @Override
    public boolean isGrayed(Object obj) {
        int totalEmpsInOffice = 0;

        if (obj instanceof Manager) {
            Manager manager = (Manager) obj;

            List<Employee> employees = manager.getEmployees();
            for (Employee emp : employees) {
                if (emp.isInOffice())
                    totalEmpsInOffice++;
            }

            if (totalEmpsInOffice == employees.size()) {
                return true;
            }
        }

        return false;
    }

    @Override
    public void checkStateChanged(CheckStateChangedEvent event) {
        Object element = event.getElement();

        Widget item = findItem(element);

        if (!(item instanceof TreeItem)) {
            System.out.println("Given item is not an instance of tree item");
            return;
        }

        TreeItem treeItem = (TreeItem) item;
        Object obj = treeItem.getData();

        if (obj instanceof Manager) {
            System.out.println("State is changed for " + ((Manager) obj).getName());
        }

        if (obj instanceof Employee) {
            System.out.println("State is changed for " + ((Employee) obj).getName());
        }

    }

}

TestTreeViewer.java

package com.sample;

import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class TestTreeViewer {
    private static int shellWidth = 600;
    private static int shellHeight = 600;

    private static int compositeWidth = 500;
    private static int compositeHeight = 250;

    private static void addWidgetsToShell(Display display, Shell shell) {

        Composite composite = new Composite(shell, SWT.BORDER);
        composite.setBackground(new Color(display, 102, 153, 153));
        composite.setBounds(10, 10, compositeWidth, compositeHeight);

        MyCheckBoxTreeContentProvider contentProvider = new MyCheckBoxTreeContentProvider();
        MyCheckBoxLabelProvider labelProvider = new MyCheckBoxLabelProvider();
        MyCheckBoxTreeSorter sorter = new MyCheckBoxTreeSorter();

        MyCheckBoxTreeViewer treeViewer = new MyCheckBoxTreeViewer(shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree());
        treeViewer.setContentProvider(contentProvider);
        treeViewer.setLabelProvider(labelProvider);
        treeViewer.setSorter(sorter);
        //treeViewer.setInput("root");
        treeViewer.setAutoExpandLevel(2);


    }

    public static void main(String[] args) {

        /* Instantiate Display object, it represents SWT session */
        Display display = new Display();

        /*
         * Define Shell, it represent a window, You can add more than one shell
         * to Display
         */
        Shell shell = new Shell(display);
        shell.setSize(shellWidth, shellHeight);

        addWidgetsToShell(display, shell);

        /* Open shell window */
        shell.open();

        /*
         * Run the event dispatching loop until an exit condition occurs, which
         * is typically when the main shell window is closed by the user.
         */

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }

        /* Dispose the display */
        display.dispose();
    }

}

I debugged, but unable to find the problem/solution.

greg-449

There are several problems here.

You are not calling the viewer setInput method - nothing happens until you call this.

The parent of the checkbox is the Shell not the Composite you create. You are using GridData for the checkbox layout data but you have not set a layout for the Shell or the Composite. If you use layout data you must set a layout.

You are mixing setBounds and layouts - don't do this, it doesn't work.

You must call setAutoExpandLevel before you call setInput.

So for the Shell do something like:

Shell shell = new Shell(display);
shell.setSize(shellWidth, shellHeight);
shell.setLayout(new GridLayout());

For the composite:

Composite composite = new Composite(shell, SWT.BORDER);
composite.setBackground(new Color(shell.getDisplay(), 102, 153, 153));
composite.setLayout(new GridLayout());
GridDataFactory.fillDefaults().hint(compositeWidth, compositeHeight).applyTo(composite);

For the checkbox:

MyCheckBoxTreeViewer treeViewer = new MyCheckBoxTreeViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree());
treeViewer.setContentProvider(contentProvider);
treeViewer.setLabelProvider(labelProvider);
treeViewer.setSorter(sorter);
treeViewer.setAutoExpandLevel(2); 
treeViewer.setInput("root");

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Displaying lengths in Forge viewer

From Dev

Tree with checkBox

From Dev

Report Viewer displaying a value in a textbox

From Dev

Viewer clock and timeline displaying poorly

From Dev

Checkbox not displaying value

From Dev

Displaying binary tree in Haskell

From Dev

Displaying a tree with ajax

From Dev

Composite pattern: Copy tree structure

From Dev

Displaying checkbox list in JSF/PrimeFaces

From Dev

Bootstrap checkbox buttons not displaying correctly

From Dev

Checkbox and label not displaying in same line

From Dev

React checkbox displaying incorrect value

From Dev

Checkbox addition in a dojo tree

From Dev

Dojo Tree with checkbox

From Dev

Tree elements not displaying in correct order

From Dev

Displaying chosen tree with jstree plugin

From Dev

ANTLR4 parse tree viewer in Eclipse

From Dev

Tree viewer gets resized when editor is resized

From Dev

JFace Tree Viewer: Listener for node expansion?

From Dev

3D drawing in lines, not displaying 3D in Viewer

From Dev

VBA: Displaying Grid of Checkbox on VBA UserForm Frame

From Dev

Why does the browser stop displaying checkbox updates?

From Dev

Displaying "required" in just one checkbox (dynamic display)

From Dev

Checkbox always displaying false value (unchecked)

From Dev

Checkbox always displaying false value (unchecked)

From Dev

PHP - Displaying checkbox based on certain conditions

From Dev

Displaying "required" in just one checkbox (dynamic display)

From Dev

DataGridView not displaying changes to checkbox when application is launched

From Dev

Displaying delete icon when checkbox is selected - JS