/*******************************************************************************
* Copyright (c) 2006-2013 The RCP Company 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:
* The RCP Company - initial API and implementation
*******************************************************************************/
package com.rcpcompany.uibindings.grid.extests.models;
import java.util.Map;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import com.rcpcompany.uibinding.tests.model.TestGrid;
import com.rcpcompany.uibinding.tests.model.TestGridCell;
import com.rcpcompany.uibinding.tests.model.TestGridColumn;
import com.rcpcompany.uibinding.tests.model.TestGridRow;
import com.rcpcompany.uibinding.tests.model.TestModelPackage;
import com.rcpcompany.uibindings.UIBindingsEMFObservables;
import com.rcpcompany.uibindings.grid.IGridCell;
import com.rcpcompany.uibindings.grid.IGridModel;
/**
* A basic grid model with {@link TestGridRow customers} versus {@link TestGridColumn shop items}.
*
* @author Tonny Madsen, The RCP Company
*/
public class TestGridGridModel implements IGridModel {
private final EditingDomain myEditingDomain;
private final TestGrid myGrid;
private final EStructuralFeature myFeature;
private final Monitor myMonitor;
private final IObservableList myColumns;
private final IObservableList myRows;
/**
* Simple interface used to monitor changes in grids during tests.
*/
public interface Monitor {
void gridDisposed();
void cellCreated(Cell cell);
void cellDisposed(Cell cell);
};
public TestGridGridModel(EditingDomain editingDomain, TestGrid grid, EStructuralFeature feature, Monitor monitor) {
myEditingDomain = editingDomain;
myGrid = grid;
myFeature = feature;
myMonitor = monitor;
myColumns = UIBindingsEMFObservables.observeList(myEditingDomain, grid,
TestModelPackage.Literals.TEST_GRID__COLUMNS);
myRows = UIBindingsEMFObservables.observeList(myEditingDomain, grid, TestModelPackage.Literals.TEST_GRID__ROWS);
}
@Override
public IGridCell getCell(Object columnID, Object rowID) {
return new Cell(columnID, rowID);
}
@Override
public IObservableList getColumnIDs() {
return myColumns;
}
@Override
public IObservableList getRowIDs() {
return myRows;
}
@Override
public void dispose() {
if (myMonitor != null) {
myMonitor.gridDisposed();
}
}
public class Cell implements IGridCell {
private final Object myRowID;
private final Object myColumnID;
private final TestGridColumn myColumn;
private final TestGridRow myRow;
public Cell(Object columnID, Object rowID) {
myColumnID = columnID;
myRowID = rowID;
if (columnID instanceof TestGridColumn) {
myColumn = (TestGridColumn) columnID;
} else {
myColumn = null;
}
if (rowID instanceof TestGridRow) {
myRow = (TestGridRow) rowID;
} else {
myRow = null;
}
if (myMonitor != null) {
myMonitor.cellCreated(this);
}
}
@Override
public Map<String, Object> getArguments() {
return null;
}
@Override
public IObservableValue getValue() {
if (myColumn == null && myRow == null)
return null;
else if (myColumn == null)
return UIBindingsEMFObservables.observeValue(null, myEditingDomain, myRow,
TestModelPackage.Literals.TEST_GRID_ROW__NUMBER);
else if (myRow == null)
return UIBindingsEMFObservables.observeValue(null, myEditingDomain, myColumn,
TestModelPackage.Literals.TEST_GRID_COLUMN__NAME);
// Both myItem and myCustomer non-null!!!
final int j = myGrid.getRows().indexOf(myRow);
final TestGridCell cell = myColumn.getCells().get(j);
return UIBindingsEMFObservables.observeValue(null, myEditingDomain, cell, myFeature);
}
@Override
public void dispose() {
if (myMonitor != null) {
myMonitor.cellDisposed(this);
}
}
}
}