/*******************************************************************************
 * Copyright (c) 2009, 2016 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.snippets;

/*
 * Tree example snippet: show a menu in a tree header
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 *
 * @since 3.5
 */

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet312 {

	static String[][] files = {
		{"ver.txt", "1 KB", "Text Document", "28/09/2005 9:57 AM", "admin",},
		{"Thumbs.db", "76 KB", "Data Base file", "13/03/2006 3:56 PM", "john",},
		{"daddy.bmp", "148 MB", "Bitmap", "27/10/2008 1:34 PM", "bill",},
		{"io.sys", "48 KB", "File System", "16/12/2008 6:14 AM", "admin",},
		{"Programs", "0 KB", "File Folder", "04/02/2009 12:18 PM", "anne",},
		{"test.rnd", "55 MB", "RND File", "19/02/2009 5:49 PM", "john",},
		{"arial.ttf", "94 KB", "True Type Font", "25/08/2008 1:25 PM", "john",},
	};

static void createMenuItem(Menu parent, final TreeColumn column) {
	final MenuItem itemName = new MenuItem(parent, SWT.CHECK);
	itemName.setText(column.getText());
	itemName.setSelection(column.getResizable());
	itemName.addListener(SWT.Selection, event -> {
		if (itemName.getSelection()) {
			column.setWidth(150);
			column.setResizable(true);
		} else {
			column.setWidth(0);
			column.setResizable(false);
		}
	});
}

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, 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, event -> {
		headerMenu.dispose();
		treeMenu.dispose();
	});

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