blob: 0c10d85d989dae8edf9e3e51b114afb696ec5310 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 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
* Matthew Hall - bugs 146397, 260337
*******************************************************************************/
package org.eclipse.jface.tests.databinding.viewers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.tests.internal.databinding.beans.Bean;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport;
import org.eclipse.jface.databinding.viewers.ViewerSupport;
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.junit.Before;
import org.junit.Test;
public class ObservableValueEditingSupportTest extends AbstractSWTTestCase {
private Shell shell;
private ObservableValueEditingSupportStub editingSupport;
private DataBindingContext dbc;
private TableViewer viewer;
private Bean bean;
@Before
public void setUp() throws Exception {
super.setUp();
shell = getShell();
dbc = new DataBindingContext();
viewer = new TableViewer(shell);
TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
editingSupport = new ObservableValueEditingSupportStub(viewer, dbc);
column.setEditingSupport(editingSupport);
WritableList input = WritableList.withElementType(String.class);
bean = new Bean();
bean.setValue("value");
input.add(bean);
// Bind viewer to input
ViewerSupport.bind(viewer, input, BeanProperties.value(Bean.class,
"value"));
}
@Test
public void testInitializeCellEditorValue_OrderOfOperations()
throws Exception {
assertEquals("precondition", 0, editingSupport.events.length());
viewer.editElement(bean, 0);
assertEquals(
"createCellEditorObservable createElementObservable createBinding",
editingSupport.events.toString());
}
@Test
public void testSaveCellEditorValue_UpdatesModel() throws Exception {
shell.open();
String newValue = bean.getValue() + "a";
viewer.editElement(bean, 0);
editingSupport.target.setValue(newValue);
// force the focus to leave the editor updating the value
closeCellEditor();
assertTrue(editingSupport.binding.isDisposed());
assertEquals(newValue, bean.getValue());
}
/**
*
*/
protected void closeCellEditor() {
editingSupport.text.notifyListeners(SWT.DefaultSelection, new Event());
}
@Test
public void testSaveCellEditorValue_IgnoreIfNotDirty() throws Exception {
String initialValue = bean.getValue();
shell.open();
viewer.editElement(bean, 0);
// force the focus to leave the editor updating the value
closeCellEditor();
assertTrue(editingSupport.binding.isDisposed());
assertEquals(initialValue, bean.getValue());
}
@Test
public void testDisposesBinding() throws Exception {
shell.open();
viewer.editElement(bean, 0);
assertFalse("precondition", editingSupport.binding.isDisposed());
closeCellEditor();
assertTrue(editingSupport.binding.isDisposed());
}
@Test
public void testDisposesTargetObservable() throws Exception {
shell.open();
viewer.editElement(bean, 0);
assertFalse("precondition", editingSupport.target.isDisposed());
closeCellEditor();
assertTrue(editingSupport.target.isDisposed());
}
@Test
public void testDisposesModelObservable() throws Exception {
shell.open();
viewer.editElement(bean, 0);
assertFalse("precondition", editingSupport.model.isDisposed());
closeCellEditor();
assertTrue(editingSupport.model.isDisposed());
}
@Test
public void testCanEdit_DefaultIsTrue() throws Exception {
assertTrue(editingSupport.canEdit(bean));
}
private static class ObservableValueEditingSupportStub extends
ObservableValueEditingSupport {
StringBuilder events = new StringBuilder();
Text text;
TextCellEditor editor;
Binding binding;
IObservableValue target;
IObservableValue model;
/**
* @param viewer
* @param dbc
*/
public ObservableValueEditingSupportStub(ColumnViewer viewer,
DataBindingContext dbc) {
super(viewer, dbc);
editor = new TextCellEditor((Composite) viewer.getControl());
}
@Override
protected boolean canEdit(Object element) {
return super.canEdit(element);
}
private void event(String event) {
if (events.length() > 0) {
events.append(" ");
}
events.append(event);
}
@Override
protected IObservableValue doCreateCellEditorObservable(
CellEditor cellEditor) {
event("createCellEditorObservable");
text = (Text) cellEditor.getControl();
return target = SWTObservables.observeText(cellEditor.getControl(),
SWT.NONE);
}
@Override
protected IObservableValue doCreateElementObservable(Object element,
ViewerCell cell) {
event("createElementObservable");
return model = BeansObservables.observeValue(element, "value");
}
@Override
protected Binding createBinding(IObservableValue target,
IObservableValue model) {
event("createBinding");
return binding = super.createBinding(target, model);
}
@Override
protected CellEditor getCellEditor(Object element) {
return editor;
}
}
}