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.
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.
Comments