public static void main (String[] args) {
	final Display display = new Display();
	Shell shell = new Shell(display);
	shell.setLayout(new FillLayout());

	final Tree tree = new Tree(shell, SWT.V_SCROLL|SWT.H_SCROLL| SWT.BORDER);
	tree.setHeaderVisible(true);
	final Menu headerMenu = new Menu(shell, SWT.POP_UP);
	final TreeColumn columnName = new TreeColumn(tree, SWT.NONE);
	columnName.setText("Name");
	columnName.setWidth(150);
	createMenuItem(headerMenu, columnName);
	final TreeColumn columnSize = new TreeColumn(tree, SWT.NONE);
	columnSize.setText("Size");
	columnSize.setWidth(150);
	createMenuItem(headerMenu, columnSize);
	final TreeColumn columnType = new TreeColumn(tree, SWT.NONE);
	columnType.setText("Type");
	columnType.setWidth(150);
	createMenuItem(headerMenu, columnType);
	final TreeColumn columnDate = new TreeColumn(tree, SWT.NONE);
	columnDate.setText("Date");
	columnDate.setWidth(150);
	createMenuItem(headerMenu, columnDate);
	final TreeColumn columnOwner = new TreeColumn(tree, SWT.NONE);
	columnOwner.setText("Owner");
	columnOwner.setWidth(0);
	columnOwner.setResizable(false);
	createMenuItem(headerMenu, columnOwner);
	
	for (int i = 0; i < files.length; i++) {
		TreeItem item = new TreeItem(tree, SWT.NONE);
		item.setText(files[i]);
		TreeItem subItem = new TreeItem(item, SWT.NONE);
		subItem.setText("node");
	}
	
	final Menu treeMenu = new Menu(shell, SWT.POP_UP);
	MenuItem item = new MenuItem(treeMenu, SWT.PUSH);
	item.setText("Open");
	item = new MenuItem(treeMenu, SWT.PUSH);
	item.setText("Open With");
	new MenuItem(treeMenu, SWT.SEPARATOR);
	item = new MenuItem(treeMenu, SWT.PUSH);
	item.setText("Cut");
	item = new MenuItem(treeMenu, SWT.PUSH);
	item.setText("Copy");
	item = new MenuItem(treeMenu, SWT.PUSH);
	item.setText("Paste");
	new MenuItem(treeMenu, SWT.SEPARATOR);
	item = new MenuItem(treeMenu, SWT.PUSH);
	item.setText("Delete");
	
	tree.addListener(SWT.MenuDetect, new Listener() {
		@Override
		public void handleEvent(Event event) {
			Point pt = display.map(null, tree, new Point(event.x, event.y));
			Rectangle clientArea = tree.getClientArea();
			boolean header = clientArea.y <= pt.y && pt.y < (clientArea.y + tree.getHeaderHeight());
			tree.setMenu(header ? headerMenu : treeMenu);
		}
	});
	
	/* IMPORTANT: Dispose the menus (only the current menu, set with setMenu(), will be automatically disposed) */
	tree.addListener(SWT.Dispose, new Listener() {
		@Override
		public void handleEvent(Event event) {
			headerMenu.dispose();
			treeMenu.dispose();
		}
	});
	
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch()) {
			display.sleep();
		}
	}
	display.dispose();
}