/*******************************************************************************
 * Copyright (c) 2006, 2007 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
 *     Brad Reynolds - bug 116920
 *******************************************************************************/

package org.eclipse.jface.examples.databinding.nestedselection;

import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.conversion.IConverter;
import org.eclipse.core.databinding.observable.IObserving;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.map.IObservableMap;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.internal.databinding.conversion.ObjectToStringConverter;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.examples.databinding.model.SimpleModel;
import org.eclipse.jface.examples.databinding.model.SimpleOrder;
import org.eclipse.jface.examples.databinding.model.SimplePerson;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

/**
 * @since 1.0
 * 
 */
public class TestMasterDetail {
	/**
	 * @since 3.2
	 * 
	 */
	private static final class CustomUpdateValueStrategy extends
			UpdateValueStrategy {
		protected IStatus doSet(IObservableValue observableValue, Object value) {
			IStatus result = super.doSet(observableValue, value);
			if (result.isOK()) {
				Object changed = observableValue;
				if (changed instanceof IObserving) {
					changed = ((IObserving) changed).getObserved();
				}
				System.out.println("changed: " + changed);
			}
			return result;
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new TestMasterDetail().run();
	}

	private Shell shell = null; // @jve:decl-index=0:visual-constraint="10,10"

	private Table personsTable = null;

	private Label label1 = null;

	private Text name = null;

	private Label label2 = null;

	private Text address = null;

	private Label label3 = null;

	private Text city = null;

	private Label label4 = null;

	private Text state = null;

	private Table ordersTable = null;

	private Text validationStatus;

	/**
	 * This method initializes table
	 * 
	 */
	private void createTable() {
		GridData gridData = new org.eclipse.swt.layout.GridData();
		gridData.grabExcessHorizontalSpace = true;
		gridData.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData.horizontalSpan = 2;
		gridData.grabExcessVerticalSpace = true;
		gridData.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		personsTable = new Table(shell, SWT.FULL_SELECTION);
		personsTable.setHeaderVisible(true);
		personsTable.setLayoutData(gridData);
		personsTable.setLinesVisible(true);
		TableColumn tableColumn = new TableColumn(personsTable, SWT.NONE);
		tableColumn.setWidth(60);
		tableColumn.setText("Name");
		TableColumn tableColumn1 = new TableColumn(personsTable, SWT.NONE);
		tableColumn1.setWidth(60);
		tableColumn1.setText("State");
	}

	/**
	 * This method initializes table1
	 * 
	 */
	private void createTable1() {
		GridData gridData5 = new org.eclipse.swt.layout.GridData();
		gridData5.horizontalSpan = 2;
		gridData5.verticalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData5.grabExcessHorizontalSpace = true;
		gridData5.grabExcessVerticalSpace = true;
		gridData5.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		ordersTable = new Table(shell, SWT.FULL_SELECTION);
		ordersTable.setHeaderVisible(true);
		ordersTable.setLayoutData(gridData5);
		ordersTable.setLinesVisible(true);
		TableColumn tableColumn2 = new TableColumn(ordersTable, SWT.NONE);
		tableColumn2.setWidth(60);
		tableColumn2.setText("Order No");
		TableColumn tableColumn3 = new TableColumn(ordersTable, SWT.NONE);
		tableColumn3.setWidth(60);
		tableColumn3.setText("Date");
	}

	/**
	 * This method initializes sShell
	 */
	private void createShell() {
		GridData gridData5 = new org.eclipse.swt.layout.GridData();
		gridData5.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData5.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
		GridData gridData4 = new org.eclipse.swt.layout.GridData();
		gridData4.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData4.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
		GridData gridData3 = new org.eclipse.swt.layout.GridData();
		gridData3.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData3.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
		GridData gridData2 = new org.eclipse.swt.layout.GridData();
		gridData2.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData2.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
		GridData gridData1 = new org.eclipse.swt.layout.GridData();
		gridData1.horizontalAlignment = org.eclipse.swt.layout.GridData.FILL;
		gridData1.verticalAlignment = org.eclipse.swt.layout.GridData.CENTER;
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 2;
		shell = new Shell();
		shell.setText("Shell");
		createTable();
		shell.setLayout(gridLayout);
		shell.setSize(new org.eclipse.swt.graphics.Point(495, 357));
		label1 = new Label(shell, SWT.NONE);
		label1.setText("Name");
		name = new Text(shell, SWT.BORDER);
		name.setLayoutData(gridData1);
		label2 = new Label(shell, SWT.NONE);
		label2.setText("Address");
		address = new Text(shell, SWT.BORDER);
		address.setLayoutData(gridData2);
		label3 = new Label(shell, SWT.NONE);
		label3.setText("City");
		city = new Text(shell, SWT.BORDER);
		city.setLayoutData(gridData4);
		label4 = new Label(shell, SWT.NONE);
		label4.setText("State");
		state = new Text(shell, SWT.BORDER);
		state.setLayoutData(gridData3);
		createTable1();
		validationStatus = new Text(shell, SWT.READ_ONLY | SWT.BORDER);
	}

	private void run() {
		final Display display = new Display();

		Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
			public void run() {
				createShell();
				bind(shell);

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

	SimpleModel model = new SimpleModel();

	private void bind(Control parent) {
		Realm realm = SWTObservables.getRealm(parent.getDisplay());

		TableViewer peopleViewer = new TableViewer(personsTable);
		ObservableListContentProvider peopleViewerContent = new ObservableListContentProvider();
		peopleViewer.setContentProvider(peopleViewerContent);

		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
				peopleViewerContent.getKnownElements(), SimplePerson.class,
				new String[] { "name", "state" });
		peopleViewer.setLabelProvider(new ObservableMapLabelProvider(
				attributeMaps));

		peopleViewer.setInput(new WritableList(realm, model.getPersonList(),
				SimpleModel.class));

		IObservableValue selectedPerson = ViewersObservables
				.observeSingleSelection(peopleViewer);

		DataBindingContext dbc = new DataBindingContext(realm) {
			protected UpdateValueStrategy createTargetToModelUpdateValueStrategy(
					IObservableValue fromValue, IObservableValue toValue) {
				return new CustomUpdateValueStrategy();
			}
		};
		IConverter upperCaseConverter = new IConverter() {
			public Object convert(Object fromObject) {
				return ((String) fromObject).toUpperCase();
			}

			public Object getFromType() {
				return String.class;
			}

			public Object getToType() {
				return String.class;
			}
		};
		IValidator vowelValidator = new IValidator() {
			public IStatus validate(Object value) {
				String s = (String) value;
				if (!s.matches("[aeiouAEIOU]*")) {
					return ValidationStatus.error("only vowels allowed");
				}
				return Status.OK_STATUS;
			}
		};
		Binding b = dbc.bindValue(SWTObservables.observeText(name, SWT.Modify),
				BeansObservables.observeDetailValue(realm, selectedPerson,
						"name", String.class), new CustomUpdateValueStrategy()
						.setConverter(upperCaseConverter).setAfterGetValidator(
								vowelValidator), null);

//		AggregateValidationStatus status = new AggregateValidationStatus(dbc
//				.getBindings(), AggregateValidationStatus.MAX_SEVERITY);
		dbc.bindValue(SWTObservables.observeText(validationStatus, SWT.NONE),
				b.getValidationStatus(), null, new UpdateValueStrategy().setConverter(new ObjectToStringConverter()));
		
		dbc.bindValue(SWTObservables.observeText(address, SWT.Modify),
				BeansObservables.observeDetailValue(realm, selectedPerson,
						"address", String.class), null, null);

		dbc.bindValue(SWTObservables.observeText(city, SWT.Modify),
				BeansObservables.observeDetailValue(realm, selectedPerson,
						"city", String.class), null, null);

		dbc.bindValue(SWTObservables.observeText(state, SWT.Modify),
				BeansObservables.observeDetailValue(realm, selectedPerson,
						"state", String.class), null, null);

		TableViewer ordersViewer = new TableViewer(ordersTable);
		ObservableListContentProvider ordersViewerContent = new ObservableListContentProvider();
		ordersViewer.setContentProvider(ordersViewerContent);
		ordersViewer.setLabelProvider(new ObservableMapLabelProvider(
				BeansObservables.observeMaps(ordersViewerContent
						.getKnownElements(), SimpleOrder.class, new String[] {
						"orderNumber", "date" })));

		IObservableList orders = BeansObservables.observeDetailList(realm,
				selectedPerson, "orders", SimpleOrder.class);
		ordersViewer.setInput(orders);
	}
}
