/*******************************************************************************
 * Copyright (c) 2005, 2006 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.tests.databinding.scenarios;

import org.eclipse.jface.examples.databinding.model.Account;
import org.eclipse.jface.examples.databinding.model.Catalog;
import org.eclipse.jface.examples.databinding.model.Category;
import org.eclipse.jface.examples.databinding.model.SampleData;
import org.eclipse.jface.internal.databinding.provisional.description.Property;
import org.eclipse.jface.internal.databinding.provisional.description.TableModelDescription;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.TableColumn;

/**
 * To run the tests in this class, right-click and select "Run As JUnit Plug-in
 * Test". This will also start an Eclipse instance. To clean up the launch
 * configuration, open up its "Main" tab and select "[No Application] - Headless
 * Mode" as the application to run.
 */

public class TableScenarios extends ScenariosTestCase {

	private TableViewer tableViewer;

	private Catalog catalog;
	
	private Category category;

	private TableColumn firstNameColumn;

	private TableColumn lastNameColumn;

	private TableColumn stateColumn;

	private Image[] images;

	private TableColumn fancyColumn;

	protected void setUp() throws Exception {
		super.setUp();
		getComposite().setLayout(new FillLayout());
		tableViewer = new TableViewer(getComposite());
		tableViewer.getTable().setLinesVisible(true);
		tableViewer.getTable().setHeaderVisible(true);
		firstNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
		firstNameColumn.setWidth(50);
		lastNameColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
		lastNameColumn.setWidth(50);		
		stateColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
		stateColumn.setWidth(50);		
		fancyColumn = new TableColumn(tableViewer.getTable(), SWT.NONE);
		fancyColumn.setWidth(250);		

		catalog = SampleData.CATALOG_2005; // Lodging source
		category = SampleData.WINTER_CATEGORY; 

		images = new Image[] {
				getShell().getDisplay().getSystemImage(SWT.ICON_ERROR),
				getShell().getDisplay().getSystemImage(SWT.ICON_WARNING),
				getShell().getDisplay().getSystemImage(SWT.ICON_INFORMATION), };
	}

	protected void tearDown() throws Exception {
		// do any teardown work here
		super.tearDown();
		tableViewer.getTable().dispose();
		tableViewer = null;
		firstNameColumn = null;
		lastNameColumn = null;
		stateColumn = null;
	}

	private String getValue(String text) {
		if (text==null)
			return "";
		return text;
	}
	
	public void testScenario01() {
		// Show that a TableViewer with three columns renders the accounts
		Account[] accounts = catalog.getAccounts();

		TableModelDescription tableModelDescription = new TableModelDescription(new Property(catalog, "accounts"),new String[]{"firstName","lastName","state"});
		getDbc().bind(tableViewer,
				tableModelDescription, null);

		// Verify the data in the table columns matches the accounts
		for (int i = 0; i < accounts.length; i++) {
			Account account = catalog.getAccounts()[i];
			String col_0 = ((ITableLabelProvider) tableViewer
					.getLabelProvider()).getColumnText(account, 0); 
			assertEquals(getValue(account.getFirstName()), col_0);
			String col_1 = ((ITableLabelProvider) tableViewer
					.getLabelProvider()).getColumnText(account, 1);
			assertEquals(getValue(account.getLastName()), col_1);
			String col_2 = ((ITableLabelProvider) tableViewer
					.getLabelProvider()).getColumnText(account, 2);
			assertEquals(getValue(account.getState()), col_2);

		}
	}

	public void testScenario02() throws SecurityException, IllegalArgumentException {
		// Show that a TableViewer with three columns can be used to update
		// columns
//		Account[] accounts = catalog.getAccounts();
//
//		TableModelDescription tableModelDescription = new TableModelDescription(new Property(catalog, "accounts"), new String[]{"firstName","lastName","state"});
////		tableViewerDescription.addEditableColumn("firstName");
////		tableViewerDescription.addEditableColumn("lastName", null, null, new PhoneConverter());
////		tableViewerDescription.addEditableColumn("state", null, null, new StateConverter());
//		getDbc().bind(tableViewer,
//				tableModelDescription, null);
//
//		Account account = accounts[0];
//		// Select the first item in the table
//		tableViewer.editElement(account, 0);
//		// Set the text property of the cell editor which is now active over the "firstName" column
//		CellEditor[] cellEditors = tableViewer.getCellEditors();
//		TextCellEditor firstNameEditor = (TextCellEditor) cellEditors[0];
//		// Change the firstName and test it goes to the model
//		enterText((Text) firstNameEditor.getControl(), "Bill");
//		// Check whether the model has changed
//		assertEquals("Bill",account.getFirstName());
	}
	
	public void testScenario04() {
//		// Show that when an item is added to a collection the table gets an extra item
//		Account[] accounts = catalog.getAccounts();	
//		
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
//				tableViewer);
//		tableViewerDescription.addColumn("firstName");
//		tableViewerDescription.addColumn("lastName");
//		tableViewerDescription.addColumn("state");
//		tableViewerDescription.addColumn(null,new IConverter(){
//			
//			public Class getModelType() {
//				return Account.class;
//			}
//			
//			public Class getTargetType() {
//				return ViewerLabel.class;
//			}
//			
//			public Object convertTargetToModel(Object targetObject) {
//				return null;
//			}
//			
//			public Object convertModelToTarget(Object modelObject) {
//				Account account = (Account) modelObject;
//				return new ViewerLabel(account.toString(), images[new Random().nextInt(images.length)]);
//			}});
//		getDbc().bind(tableViewerDescription,
//				new Property(catalog, "accounts"), null);
//
//		//interact();
//		
//		// Verify the number of accounts matches the number of items in the table
//		assertEquals(tableViewer.getTable().getItemCount(),accounts.length);
//		// Add a new account and verify that the number of items in the table increases
//		Account newAccount = new Account();
//		newAccount.setFirstName("Finbar");
//		newAccount.setLastName("McGoo");
//		newAccount.setLastName("NC");
//		catalog.addAccount(newAccount);
//		// The number of items should have gone up by one
//		assertEquals(tableViewer.getTable().getItemCount(),accounts.length + 1);
//		// The number of items should still match the number of accounts (i.e. test the model)
//		assertEquals(tableViewer.getTable().getItemCount(),catalog.getAccounts().length);
//		// Remove the account that was just added
//		catalog.removeAccount(newAccount);
//		// The number of items should match the original
//		assertEquals(tableViewer.getTable().getItemCount(),accounts.length);
//		// The number of items should still match the number of accounts (i.e. test the model is reset)
//		assertEquals(tableViewer.getTable().getItemCount(),catalog.getAccounts().length);		
//		
//		// Test adding and removing to the model on a non UI thread
//		int numberOfAccounts = catalog.getAccounts().length;
//		final Account barney = new Account();
//		barney.setFirstName("Barney");
//		barney.setLastName("Smith");
//		barney.setLastName("CA");
//		invokeNonUI(new Runnable(){
//			public void run(){
//				catalog.addAccount(barney);
//			}
//		});
//		spinEventLoop(0);
//		// The number of items should have gone up by one		
//		assertEquals(tableViewer.getTable().getItemCount(),numberOfAccounts + 1);
//		
//		invokeNonUI(new Runnable(){
//			public void run(){
//				catalog.removeAccount(barney);
//			}
//		});
//		spinEventLoop(0);
//		// The number of items should have reverted to the original number before barney was added and removed		
//		assertEquals(tableViewer.getTable().getItemCount(),numberOfAccounts);
//		
	}
		
	public void testScenario03() {
//		// Show that converters work for table columns
//		Account[] accounts = catalog.getAccounts();
//
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
//				tableViewer);
//		tableViewerDescription.addEditableColumn("lastName");
//		tableViewerDescription.addEditableColumn("phone", null, null ,
//				new PhoneConverter());
//		tableViewerDescription.addEditableColumn("state", null, null ,
//				new StateConverter());
//		getDbc().bind(tableViewerDescription,
//				new Property(catalog, "accounts"), null);
//
//		// Verify that the data in the the table columns matches the expected
//		// What we are looking for is that the phone numbers are converterted to
//		// nnn-nnn-nnnn and that
//		// the state letters are converted to state names
//		// Verify the data in the table columns matches the accounts
//		PhoneConverter phoneConverter = new PhoneConverter();
//		StateConverter stateConverter = new StateConverter();
//		for (int i = 0; i < accounts.length; i++) {
//			Account account = catalog.getAccounts()[i];
//			// Check the phone number
//			String col_phone = ((ITableLabelProvider) tableViewer
//					.getLabelProvider()).getColumnText(account, 1);
//			assertEquals(getValue((String)phoneConverter
//					.convertModelToTarget(account.getPhone())), col_phone);
//			String col_state = ((ITableLabelProvider) tableViewer
//					.getLabelProvider()).getColumnText(account, 2);
//			assertEquals(getValue((String)stateConverter
//					.convertModelToTarget(account.getState())), col_state);
//		}
	}
	
	public void testScenario05() {
//		// Show that when the model changes then the UI refreshes to reflect this
//
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
//				tableViewer);
//		tableViewerDescription.addColumn("lastName");
//		tableViewerDescription.addColumn("phone",
//				new PhoneConverter());
//		tableViewerDescription.addColumn("state",
//				new StateConverter());
//		getDbc().bind(tableViewerDescription,
//				new Property(catalog, "accounts"), null);
//		
//		final Account account = catalog.getAccounts()[0];
//		String lastName = tableViewer.getTable().getItem(0).getText(0);
//		// Check the firstName in the TableItem is the same as the model
//		assertEquals(lastName,account.getLastName());
//		// Now change the model and check again
//		account.setLastName("Gershwin");
//		lastName = tableViewer.getTable().getItem(0).getText(0);	
//		assertEquals(lastName,account.getLastName());	
//		
//		// Test the model update on a non UI thread
//		invokeNonUI(new Runnable(){
//			public void run(){
//				account.setLastName("Mozart");				
//			}
//		});
//		spinEventLoop(0);
//		lastName = tableViewer.getTable().getItem(0).getText(0);		
//		assertEquals(lastName,account.getLastName());
//		
	}
	
	public void testScenario06(){
//		// Check that explicit type means that defaulting of converters works
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
//				tableViewer);
//		tableViewerDescription.addEditableColumn("price");
//		tableViewerDescription.getColumn(0).setPropertyType(Double.TYPE);
//		getDbc().bind(tableViewerDescription,
//				new Property(catalog, "transporations"), null);
//		Transportation transporation = catalog.getTransporations()[0];
//		tableViewer.editElement(transporation, 0);
//		// Set the text property of the cell editor which is now active over the "firstName" column
//		CellEditor[] cellEditors = tableViewer.getCellEditors();
//		TextCellEditor priceEditor = (TextCellEditor) cellEditors[0];
//		// Change the firstName and test it goes to the model
//		enterText((Text) priceEditor.getControl(), "123.45");
//		// Verify the model is updated
//		assertEquals(transporation.getPrice(),123.45,0);
		
	}
	
	public void testScenario07(){
//		// Verify that even when a column's property type is not set, that it is worked out lazily from the target type 
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
//				tableViewer);
//		tableViewerDescription.addEditableColumn("price");
//		// The column's type is not set to be Double.TYPE.  This will be inferred once the first Transportation object is set
//		// into the ObservableCollection
//		getDbc().bind(tableViewerDescription,
//				new Property(catalog, "transporations"), null);
//		Transportation transporation = catalog.getTransporations()[0];
//		tableViewer.editElement(transporation, 0);
//		// Set the text property of the cell editor which is now active over the "firstName" column
//		CellEditor[] cellEditors = tableViewer.getCellEditors();
//		TextCellEditor priceEditor = (TextCellEditor) cellEditors[0];
//		// Change the firstName and test it goes to the model
//		enterText((Text) priceEditor.getControl(), "123.45");
//		// Verify the model is updated
//		assertEquals(transporation.getPrice(),123.45,0);
//		
	}
	
	public void testScenario08_00(){
//		// Verify that binding to a Collection property (rather than an array) works when specifying data type
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
//				tableViewer);
//		tableViewerDescription.addEditableColumn("userId");
//		tableViewerDescription.addEditableColumn("password");	
//		getDbc().bind(tableViewerDescription,
//				new Property(catalog, "signons", Signon.class, null), null);	
//		Signon firstSignon = (Signon) catalog.getSignons().get(0);	
//		// Verify the UI matches the model
//		TableItem firstTableItem = tableViewer.getTable().getItem(0);
//		assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
//		// Change the model and ensure the UI refreshes
//		firstSignon.setPassword("Eclipse123Rocks");
//		assertEquals("Eclipse123Rocks",firstSignon.getPassword());		
//		assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
//		// Change the GUI and ensure the model refreshes
//		tableViewer.editElement(firstSignon, 1);
//		CellEditor[] cellEditors = tableViewer.getCellEditors();
//		TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1];
//		enterText((Text) passwordEditor.getControl(), "Cricket11Players");
//		assertEquals("Cricket11Players",firstSignon.getPassword());
//		
	}
	
	public void testScenario08_01(){
//		// Verify that binding to a Collection property (rather than an array) works without specifying data type
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(
//				tableViewer);
//		tableViewerDescription.addEditableColumn("userId");
//		tableViewerDescription.addEditableColumn("password");	
//		getDbc().bind(tableViewerDescription,
//				new Property(catalog, "signons"), null);	
//		Signon firstSignon = (Signon) catalog.getSignons().get(0);	
//		// Verify the UI matches the model
//		TableItem firstTableItem = tableViewer.getTable().getItem(0);
//		assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
//		// Change the model and ensure the UI refreshes
//		firstSignon.setPassword("Eclipse123Rocks");
//		assertEquals("Eclipse123Rocks",firstSignon.getPassword());		
//		assertEquals(firstTableItem.getText(1),firstSignon.getPassword());
//		// Change the GUI and ensure the model refreshes
//		tableViewer.editElement(firstSignon, 1);
//		CellEditor[] cellEditors = tableViewer.getCellEditors();
//		TextCellEditor passwordEditor = (TextCellEditor) cellEditors[1];
//		enterText((Text) passwordEditor.getControl(), "Cricket11Players");
//		assertEquals("Cricket11Players",firstSignon.getPassword());
//		
	}
	
	public void testScenario09(){
//		// Verify that nested properties work.  Catalog has adventures.  Adventure has defaultLodging.  Loding has name.
//		TableViewerDescription tableViewerDescription = new TableViewerDescription(tableViewer);
//		tableViewerDescription.addColumn("name");
//		tableViewerDescription.addColumn("defaultLodging.name");
//		getDbc().bind(tableViewerDescription,new Property(category, "adventures"),null);
//		
	}
/**	
	public void testScenario10(){
		// Verify that for TIME_EARLY updating occurs on a per key basic for a TextCellEditor
		// Show that converters work for table columns
		Account[] accounts = catalog.getAccounts();
		Account firstAccount = accounts[0];
		SampleData.getSWTObservableFactory().setUpdateTime(DataBindingContext.TIME_EARLY);
		TableViewerDescription tableViewerDescription = new TableViewerDescription(tableViewer);
		tableViewerDescription.addEditableColumn("lastName");
		tableViewerDescription.addColumn("lastName");
		getDbc().bind(tableViewerDescription,new Property(catalog, "accounts"), null);
		
		// Verify that the first account is shown in the first row with the last name correctly
		assertEquals(tableViewer.getTable().getItem(0).getData(),firstAccount);
		assertEquals(tableViewer.getTable().getItem(0).getText(0),firstAccount.getLastName());
		assertEquals(tableViewer.getTable().getItem(0).getText(1),firstAccount.getLastName());
		// Create a cell editor over the first column
		tableViewer.editElement(firstAccount, 0);
		// Set the text property of the cell editor which is now active over the "firstName" column
		CellEditor[] cellEditors = tableViewer.getCellEditors();
		TextCellEditor lastNameCellEditor = (TextCellEditor) cellEditors[0];
		((Text)lastNameCellEditor.getControl()).setText("E");
		// Verify that the key press goes to the model
		assertEquals(firstAccount.getLastName(),"E");
		
	}
 **/	
}

