/*******************************************************************************
 * Copyright (c) 2009, 2018 Matthew Hall 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:
 *     Matthew Hall - initial API and implementation (bug 175735)
 *     Matthew Hall - bugs 262407, 260337
 ******************************************************************************/

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

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
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.value.DuplexingObservableValue;
import org.eclipse.jface.databinding.swt.DisplayRealm;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.viewers.StructuredSelection;
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.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 3.2
 *
 */
public class Snippet028DuplexingObservableValue {
	protected Shell shell;
	private TableViewer viewer;
	private Table table;
	private Text releaseDate;
	private Text title;
	private Text director;
	private Text writer;

	/**
	 * Launch the application
	 *
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Snippet028DuplexingObservableValue window = new Snippet028DuplexingObservableValue();
			window.open();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Open the window
	 */
	public void open() {
		final Display display = Display.getDefault();
		Realm.runWithDefault(DisplayRealm.getRealm(display), () -> {
			createContents();
			shell.open();
			shell.layout();
			while (!shell.isDisposed()) {
				if (!display.readAndDispatch())
					display.sleep();
			}
		});
	}

	protected void createContents() {
		shell = new Shell();
		shell.setSize(509, 375);
		shell.setText("Snippet028DuplexingObservableValue.java");
		final GridLayout gridLayout = new GridLayout();
		gridLayout.makeColumnsEqualWidth = true;
		gridLayout.numColumns = 4;
		shell.setLayout(gridLayout);

		viewer = new TableViewer(shell, SWT.FULL_SELECTION | SWT.MULTI
				| SWT.BORDER);
		table = viewer.getTable();
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));

		final TableColumn newColumnTableColumn_1 = new TableColumn(table,
				SWT.NONE);
		newColumnTableColumn_1.setWidth(120);
		newColumnTableColumn_1.setText("Movie");

		final TableColumn newColumnTableColumn = new TableColumn(table,
				SWT.NONE);

		newColumnTableColumn.setWidth(120);
		newColumnTableColumn.setText("Release Date");

		final TableColumn newColumnTableColumn_2 = new TableColumn(table,
				SWT.NONE);
		newColumnTableColumn_2.setWidth(120);
		newColumnTableColumn_2.setText("Director");

		final TableColumn newColumnTableColumn_3 = new TableColumn(table,
				SWT.NONE);
		newColumnTableColumn_3.setWidth(120);
		newColumnTableColumn_3.setText("Writer");

		final Label movieLabel = new Label(shell, SWT.NONE);
		movieLabel.setText("Movie");

		final Label directorLabel = new Label(shell, SWT.NONE);
		directorLabel.setLayoutData(new GridData());
		directorLabel.setText("Release Date");

		final Label producerLabel = new Label(shell, SWT.NONE);
		producerLabel.setText("Director");

		final Label scoreLabel = new Label(shell, SWT.NONE);
		scoreLabel.setText("Writer");

		title = new Text(shell, SWT.BORDER);
		final GridData gd_title = new GridData(SWT.FILL, SWT.CENTER, true,
				false);
		title.setLayoutData(gd_title);

		releaseDate = new Text(shell, SWT.BORDER);
		final GridData gd_releaseDate = new GridData(SWT.FILL, SWT.CENTER,
				true, false);
		releaseDate.setLayoutData(gd_releaseDate);

		director = new Text(shell, SWT.BORDER);
		final GridData gd_director = new GridData(SWT.FILL, SWT.CENTER, true,
				false);
		director.setLayoutData(gd_director);

		writer = new Text(shell, SWT.BORDER);
		final GridData gd_writer = new GridData(SWT.FILL, SWT.CENTER, true,
				false);
		writer.setLayoutData(gd_writer);

		bindUI();
	}

	// Minimal JavaBeans support
	public static abstract class AbstractModelObject {
		private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(
				this);

		public void addPropertyChangeListener(PropertyChangeListener listener) {
			propertyChangeSupport.addPropertyChangeListener(listener);
		}

		public void addPropertyChangeListener(String propertyName,
				PropertyChangeListener listener) {
			propertyChangeSupport.addPropertyChangeListener(propertyName,
					listener);
		}

		public void removePropertyChangeListener(PropertyChangeListener listener) {
			propertyChangeSupport.removePropertyChangeListener(listener);
		}

		public void removePropertyChangeListener(String propertyName,
				PropertyChangeListener listener) {
			propertyChangeSupport.removePropertyChangeListener(propertyName,
					listener);
		}

		protected void firePropertyChange(String propertyName, Object oldValue,
				Object newValue) {
			propertyChangeSupport.firePropertyChange(propertyName, oldValue,
					newValue);
		}
	}

	public static class MovieInfo extends AbstractModelObject {
		private String title;
		private String releaseDate;
		private String director;
		private String writer;

		public MovieInfo(String title, String releaseDate, String director,
				String writer) {
			this.title = title;
			this.releaseDate = releaseDate;
			this.director = director;
			this.writer = writer;
		}

		public String getTitle() {
			return title;
		}

		public void setTitle(String title) {
			firePropertyChange("title", this.title, this.title = title);
		}

		public String getReleaseDate() {
			return releaseDate;
		}

		public void setReleaseDate(String releaseDate) {
			firePropertyChange("releaseDate", this.releaseDate,
					this.releaseDate = releaseDate);
		}

		public String getDirector() {
			return director;
		}

		public void setDirector(String director) {
			firePropertyChange("director", this.director,
					this.director = director);
		}

		public String getWriter() {
			return writer;
		}

		public void setWriter(String writer) {
			firePropertyChange("writer", this.writer, this.writer = writer);
		}
	}

	private void bindUI() {
		IObservableList movies = new WritableList();
		movies.add(new MovieInfo("007: Quantum of Solace", "October 31, 2008",
				"Marc Forster", "Robert Wade"));
		movies.add(new MovieInfo("Batman Begins", "June 15, 2005",
				"Christopher Nolan", "David S. Goyer"));
		movies.add(new MovieInfo("Cloverfield", "January 18, 2008",
				"Matt Reeves", "Drew Goddard"));
		movies.add(new MovieInfo("The Dark Knight", "July 18, 2008",
				"Christopher Nolan", "David S. Goyer"));
		movies.add(new MovieInfo("Finding Nemo", "May 30, 2003",
				"Andrew Stanton", "Andrew Stanton"));
		movies.add(new MovieInfo("Get Smart", "June 20, 2008", "Peter Segal",
				"Tom J. Astle"));
		movies.add(new MovieInfo(
				"Indiana Jones and the Kingdom of the Crystal Skull",
				"May 22, 2008", "Steven Spielberg", "Drunken Lemurs"));
		movies.add(new MovieInfo("Iron Man", "May 2, 2008", "Jon Favreau",
				"Mark Fergus"));
		movies.add(new MovieInfo("Raiders of the Lost Ark", "June 12, 1981",
				"Steven Spielberg", "George Lucas"));
		movies.add(new MovieInfo("Valkyrie", "December 25, 2008",
				"Bryan Singer", "Christopher McQuarrie"));
		movies.add(new MovieInfo("Wall-E", "June 27, 2008", "Andrew Stanton",
				"Andrew Stanton"));
		movies.add(new MovieInfo("Wanted", "June 27, 2008",
				"Timur Bekmambetov", "Michael Brandt"));

		ViewerSupport.bind(viewer, movies, BeanProperties.values(
				MovieInfo.class, new String[] { "title", "releaseDate",
						"director", "writer" }));

		// Select Batman Begins and The Dark Knight, which have the same
		// director and writer
		viewer.setSelection(new StructuredSelection(new Object[] {
				movies.get(1), movies.get(3) }));

		DataBindingContext dbc = new DataBindingContext();

		IObservableList selections = ViewerProperties.multipleSelection()
				.observe(viewer);
		dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(title),
				DuplexingObservableValue.withDefaults(BeanProperties.value(
						"title").observeDetail(selections), "",
						"<Multiple titles>"));
		dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(releaseDate),
				DuplexingObservableValue.withDefaults(BeanProperties.value(
						"releaseDate").observeDetail(selections), "",
						"<Multiple dates>"));
		dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(director),
				DuplexingObservableValue.withDefaults(BeanProperties.value(
						"director").observeDetail(selections), "",
						"<Multiple directors>"));
		dbc.bindValue(WidgetProperties.text(SWT.Modify).observe(writer),
				DuplexingObservableValue.withDefaults(BeanProperties.value(
						"writer").observeDetail(selections), "",
						"<Multiple writers>"));
	}
}
