/*******************************************************************************
 * Copyright (c) 2011, 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
 *     Lars Vogel <Lars.Vogel@vogella.com> - Bug 507185
 *******************************************************************************/
package org.eclipse.swt.snippets;

/*
 * TreeCursor example snippet: navigate a Tree's cells with the arrow keys.
 * Edit when user hits Return key.  Exit edit mode by hitting Escape (cancels edit)
 * or Return (applies edit to tree).  Expand/Collapse with MOD1+Arrow keys.
 *
 * For a list of all SWT example snippets see
 * http://www.eclipse.org/swt/snippets/
 *
 * @since 3.8
 */
import static org.eclipse.swt.events.KeyListener.*;

import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet360 {

public static void main(String[] args) {
	Display display = new Display();
	Shell shell = new Shell(display);
	shell.setText("Snippet 360");
	shell.setLayout(new GridLayout());

	// create a a tree with 3 columns and fill with data
	final Tree tree = new Tree(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
	tree.setLayoutData(new GridData(GridData.FILL_BOTH));
	tree.setHeaderVisible(true);
	TreeColumn column1 = new TreeColumn(tree, SWT.NONE);
	TreeColumn column2 = new TreeColumn(tree, SWT.NONE);
	TreeColumn column3 = new TreeColumn(tree, SWT.NONE);
	for (int i = 0; i < 9; i++) {
		TreeItem item = new TreeItem(tree, SWT.NONE);
		item.setText(new String[] { "root " + i + " 0", "root " + i + " 1", "root " + i + " 2" });
		for (int j = 0; j < 9; j++) {
			TreeItem item2 = new TreeItem(item, SWT.NONE);
			item2.setText(new String[] { "child " + j + " 0", "child " + j + " 1", "child " + j + " 2" });
			TreeItem current = item2;
			for (int k = 0; k < 5; k++) {
				TreeItem item3 = new TreeItem(current, SWT.NONE);
				item3.setText(new String[] { "descendent " + k + " 0", "descendent " + k + " 1", "descendent " + k + " 2" });
				current = item3;
			}
		}
	}
	column1.setWidth(200);
	column2.setWidth(100);
	column3.setWidth(100);

	// create a TreeCursor to navigate around the tree
	final TreeCursor cursor = new TreeCursor(tree, SWT.NONE);
	// create an editor to edit the cell when the user hits "ENTER"
	// while over a cell in the tree
	final ControlEditor editor = new ControlEditor(cursor);
	editor.grabHorizontal = true;
	editor.grabVertical = true;

	cursor.addSelectionListener(new SelectionAdapter() {
		// when the TreeEditor is over a cell, select the corresponding row
		// in the tree
		@Override
		public void widgetSelected(SelectionEvent e) {
			tree.setSelection(new TreeItem[] { cursor.getRow() });
		}

		// when the user hits "ENTER" in the TreeCursor, pop up a text
		// editor so that they can change the text of the cell
			@Override
			public void widgetDefaultSelected(SelectionEvent e) {
				final Text text = new Text(cursor, SWT.NONE);
				TreeItem row = cursor.getRow();
				int column = cursor.getColumn();
				text.setText(row.getText(column));
				text.addKeyListener(keyPressedAdapter(event -> {
					// close the text editor and copy the data over
					// when the user hits "ENTER"
					if (event.character == SWT.CR) {
						TreeItem localRow = cursor.getRow();
						int localColumn = cursor.getColumn();
						localRow.setText(localColumn, text.getText());
						text.dispose();
					}
					// close the text editor when the user hits "ESC"
					if (event.character == SWT.ESC) {
						text.dispose();
					}
				}));
				editor.setEditor(text);
				text.setFocus();
			}
		});
		// Hide the TreeCursor when the user hits the "MOD1" or "MOD2" key.
		// This allows the user to select multiple items in the tree.
		cursor.addKeyListener(keyPressedAdapter(e -> {
			if (e.keyCode == SWT.MOD1 || e.keyCode == SWT.MOD2 || (e.stateMask & SWT.MOD1) != 0
					|| (e.stateMask & SWT.MOD2) != 0) {
				cursor.setVisible(false);
			}
		}));
	// Show the TreeCursor when the user releases the "MOD2" or "MOD1" key.
	// This signals the end of the multiple selection task.
	tree.addKeyListener(new KeyListener() {
		@Override
		public void keyReleased(KeyEvent e) {
			if (e.keyCode == SWT.MOD1 && (e.stateMask & SWT.MOD2) != 0) return;
			if (e.keyCode == SWT.MOD2 && (e.stateMask & SWT.MOD1) != 0) return;
			if (e.keyCode != SWT.MOD1 && (e.stateMask & SWT.MOD1) != 0) return;
			if (e.keyCode != SWT.MOD2 && (e.stateMask & SWT.MOD2) != 0) return;

			TreeItem[] selection = tree.getSelection();
			TreeItem row = (selection.length == 0) ? tree.getItem(tree.indexOf(tree.getTopItem())) : selection[0];
			tree.showItem(row);
			cursor.setSelection(row, cursor.getColumn());
			cursor.setVisible(true);
			cursor.setFocus();
		}
		@Override
		public void keyPressed(KeyEvent e) {
			switch (e.keyCode) {
				case SWT.ARROW_LEFT:
				case SWT.ARROW_RIGHT: {
					if ((e.stateMask & SWT.MOD1) != 0) {
						TreeItem[] selection = tree.getSelection();
						if (selection.length > 0) {
							selection[0].setExpanded(e.keyCode == SWT.ARROW_RIGHT);
						}
						break;
					}
				}
			}
		}
	});

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

}
