/*
* Copyright (c) 2004-2011 Marco Maccaferri 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:
* Marco Maccaferri - initial API and implementation
*/
package org.eclipsetrader.ui.internal.ats.monitor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.observable.IObservable;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.list.ObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor;
import org.eclipsetrader.core.ats.ITradingSystem;
import org.eclipsetrader.core.ats.ITradingSystemListener;
import org.eclipsetrader.core.ats.ITradingSystemService;
import org.eclipsetrader.core.ats.TradingSystemEvent;
import org.eclipsetrader.ui.internal.ats.ViewColumn;
import org.eclipsetrader.ui.internal.ats.ViewItem;
public class TradingSystemsViewModel extends TreeStructureAdvisor implements IObservableFactory {
private final ITradingSystemService tradingSystemService;
private final List<TradingSystemItem> list = new ArrayList<TradingSystemItem>();
private final WritableList root = new WritableList(list, TradingSystemItem.class);
private final List<ViewColumn> dataProviders = new ArrayList<ViewColumn>();
private final WritableList columns = new WritableList(dataProviders, ViewColumn.class);
private final ITradingSystemListener tradingSystemListener = new ITradingSystemListener() {
@Override
public void tradingSystemChanged(TradingSystemEvent event) {
if ((event.getKind() & TradingSystemEvent.KIND_ADDED) != 0) {
root.add(new TradingSystemItem(TradingSystemsViewModel.this, event.getTradingSystem()));
}
else if ((event.getKind() & TradingSystemEvent.KIND_REMOVED) != 0) {
for (TradingSystemItem tradingSystem : list) {
if (tradingSystem.getTradingSystem() == event.getTradingSystem()) {
root.remove(tradingSystem);
break;
}
}
}
}
};
public TradingSystemsViewModel(ITradingSystemService tradingSystemService) {
this.tradingSystemService = tradingSystemService;
for (ITradingSystem tradingSystem : tradingSystemService.getTradeSystems()) {
root.add(new TradingSystemItem(this, tradingSystem));
}
tradingSystemService.addTradingSystemListener(tradingSystemListener);
}
public void dispose() {
tradingSystemService.addTradingSystemListener(tradingSystemListener);
}
public WritableList getObservableDataProviders() {
return columns;
}
public List<ViewColumn> getDataProviders() {
return dataProviders;
}
public void setDataProviders(List<ViewColumn> list) {
for (int i = 0; i < list.size(); i++) {
int index = columns.indexOf(list.get(i));
if (index != i) {
if (index != -1) {
columns.remove(index);
}
columns.add(i, list.get(i));
}
else {
dataProviders.get(index).setName(list.get(index).getName());
}
}
for (ViewColumn column : new ArrayList<ViewColumn>(dataProviders)) {
if (!list.contains(column)) {
columns.remove(column);
}
}
updateAll();
}
public List<TradingSystemItem> getList() {
return list;
}
/* (non-Javadoc)
* @see org.eclipse.core.databinding.observable.masterdetail.IObservableFactory#createObservable(java.lang.Object)
*/
@Override
public IObservable createObservable(Object target) {
if (target == this) {
return Observables.unmodifiableObservableList(root);
}
if (target instanceof ViewItem) {
ObservableList list = ((ViewItem) target).getItems();
if (list != null) {
return Observables.unmodifiableObservableList(list);
}
}
return null;
}
public void updateAll() {
for (TradingSystemItem tradingSystemItem : list) {
for (TradingSystemInstrumentItem instrumentItem : tradingSystemItem.getList()) {
updateValues(instrumentItem);
}
}
}
public void updateValues(TradingSystemInstrumentItem instrumentItem) {
for (ViewColumn column : dataProviders) {
IAdaptable adaptable = column.getDataProvider().getValue(instrumentItem);
if (adaptable != null) {
Object propertyValue = adaptable.getAdapter(String.class);
if (propertyValue == null) {
propertyValue = adaptable.getAdapter(Number.class);
}
instrumentItem.putValue(column.getDataProviderFactory().getId(), propertyValue);
}
}
}
}