/*******************************************************************************
 * Copyright (c) 2012 Laurent CARON
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Laurent CARON (laurent.caron at gmail dot com) - initial API and implementation
 *******************************************************************************/
package org.mihalis.opal.propertyTable;

import java.util.Date;
import java.util.Locale;
import java.util.Map;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.mihalis.opal.propertyTable.editor.PTCheckboxEditor;
import org.mihalis.opal.propertyTable.editor.PTColorEditor;
import org.mihalis.opal.propertyTable.editor.PTComboEditor;
import org.mihalis.opal.propertyTable.editor.PTDateEditor;
import org.mihalis.opal.propertyTable.editor.PTDimensionEditor;
import org.mihalis.opal.propertyTable.editor.PTDirectoryEditor;
import org.mihalis.opal.propertyTable.editor.PTFileEditor;
import org.mihalis.opal.propertyTable.editor.PTFloatEditor;
import org.mihalis.opal.propertyTable.editor.PTFontEditor;
import org.mihalis.opal.propertyTable.editor.PTInsetsEditor;
import org.mihalis.opal.propertyTable.editor.PTIntegerEditor;
import org.mihalis.opal.propertyTable.editor.PTPasswordEditor;
import org.mihalis.opal.propertyTable.editor.PTRectangleEditor;
import org.mihalis.opal.propertyTable.editor.PTSpinnerEditor;
import org.mihalis.opal.propertyTable.editor.PTURLEditor;
import org.mihalis.opal.utils.SWTGraphicUtil;

/**
 * This snippet demonstrates the PropertyTable widget
 *
 */
public class PropertyTableSnippetRefresh {

	/**
	 * @param args
	 */
	public static void main(final String[] args) {

		Locale.setDefault(Locale.ENGLISH);

		final Display display = new Display();
		final Shell shell = new Shell(display);
		shell.setText("PropertyTable snippet");
		shell.setLayout(new GridLayout(2, true));

		final Button button1 = new Button(shell, SWT.PUSH);
		button1.setText("First set of values");
		button1.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));

		final Button button2 = new Button(shell, SWT.PUSH);
		button2.setText("Second set of values");
		button2.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, false, false));

		final PropertyTable table = buildPropertyTable(shell);
		table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, //
				true, true, 2, 1));

		button1.addSelectionListener(new SelectionAdapter() {

			@Override
			public void widgetSelected(final SelectionEvent e) {
				final Map<String, Object> map = table.getProperties();
				map.put("id", "My id");
				map.put("text", "blahblah...");
				map.put("url", "http://www.google.com");
				map.put("password", "password");	// NOSONAR
				map.put("int", "123");
				map.put("float", "123.45");
				map.put("spinner", null);
				map.put("directory", null);
				map.put("file", null);
				map.put("comboReadOnly", null);
				map.put("combo", null);
				map.put("cb", Boolean.FALSE);
				map.put("color", null);
				map.put("font", null);
				map.put("dimension", null);
				map.put("rectangle", null);
				map.put("inset", null);
				map.put("date", null);
				table.setProperties(map);
			}
		});

		button2.addSelectionListener(new SelectionAdapter() {

			@Override
			public void widgetSelected(final SelectionEvent e) {
				final Map<String, Object> map = table.getProperties();
				map.put("id", "(2)My id");
				map.put("text", "(2)blahblah...");
				map.put("url", "(2)http://www.google.com");
				map.put("password", "(2)password");	// NOSONAR
				map.put("int", "1234");
				map.put("float", "1234.56");
				map.put("spinner", 12);
				map.put("directory", "C:/temp");
				map.put("file", "C:/temp/temp.txt");
				map.put("comboReadOnly", "Summer");
				map.put("combo", "Value 2");
				map.put("cb", Boolean.TRUE);
				map.put("color", null);
				map.put("font", null);
				map.put("dimension", null);
				map.put("rectangle", null);
				map.put("inset", null);
				map.put("date", new Date());
				table.setProperties(map);
			}
		});

		shell.setSize(800, 600);
		shell.open();
		SWTGraphicUtil.centerShell(shell);

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

		display.dispose();
	}

	/**
	 * Build a property table
	 */
	private static PropertyTable buildPropertyTable(final Composite composite) {
		final PropertyTable table = new PropertyTable(composite, SWT.NONE);

		table.showButtons();
		table.viewAsCategories();
		table.showDescription();

		table.addProperty(new PTProperty("id", "Identifier", "Description for identifier", "My id")).setCategory("General");
		table.addProperty(new PTProperty("text", "Description", "Description for the description field", "blahblah...")).setCategory("General");
		table.addProperty(new PTProperty("url", "URL:", "This is a nice <b>URL</b>", "http://www.google.com").setCategory("General")).setEditor(new PTURLEditor());
		table.addProperty(new PTProperty("password", "Password", "Enter your <i>password</i> and keep it secret...", "password")).setCategory("General").setEditor(new PTPasswordEditor());

		table.addProperty(new PTProperty("int", "An integer", "Type any integer", "123")).setCategory("Number").setEditor(new PTIntegerEditor());
		table.addProperty(new PTProperty("float", "A float", "Type any float", "123.45")).setCategory("Number").setEditor(new PTFloatEditor());
		table.addProperty(new PTProperty("spinner", "Another integer", "Use a spinner to enter an integer")).setCategory("Number").setEditor(new PTSpinnerEditor(0, 100));

		table.addProperty(new PTProperty("directory", "Directory", "Select a directory")).setCategory("Directory/File").setEditor(new PTDirectoryEditor());
		table.addProperty(new PTProperty("file", "File", "Select a file")).setCategory("Directory/File").setEditor(new PTFileEditor());

		table.addProperty(new PTProperty("comboReadOnly", "Combo (read-only)", "A simple combo with seasons")).setCategory("Combo").setEditor(new PTComboEditor(true, new Object[] { "Spring", "Summer", "Autumn", "Winter" }));
		table.addProperty(new PTProperty("combo", "Combo", "A combo that is not read-only")).setCategory("Combo").setEditor(new PTComboEditor("Value 1", "Value 2", "Value 3"));

		table.addProperty(new PTProperty("cb", "Checkbox", "A checkbox")).setCategory("Checkbox").setEditor(new PTCheckboxEditor()).setCategory("Checkbox");
		table.addProperty(new PTProperty("cb2", "Checkbox (disabled)", "A disabled checkbox...")).setEditor(new PTCheckboxEditor()).setCategory("Checkbox").setEnabled(false);

		table.addProperty(new PTProperty("color", "Color", "Pick it !")).setCategory("Misc").setEditor(new PTColorEditor());
		table.addProperty(new PTProperty("font", "Font", "Pick again my friend")).setEditor(new PTFontEditor()).setCategory("Misc");
		table.addProperty(new PTProperty("dimension", "Dimension", "A dimension is composed of a width and a height")).setCategory("Misc").setEditor(new PTDimensionEditor());
		table.addProperty(new PTProperty("rectangle", "Rectangle", "A rectangle is composed of a position (x,y) and a dimension(width,height)")).setCategory("Misc").setEditor(new PTRectangleEditor());
		table.addProperty(new PTProperty("inset", "Inset", "An inset is composed of the following fields:top,left,bottom,right)")).setCategory("Misc").setEditor(new PTInsetsEditor());
		table.addProperty(new PTProperty("date", "Date", "Well, is there something more to say ?")).setCategory("Misc").setEditor(new PTDateEditor());

		return table;
	}

}
