/*
* 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.charts.views;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.databinding.observable.list.IListChangeListener;
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipsetrader.core.feed.IOHLC;
import org.eclipsetrader.core.feed.TimeSpan;
public class HistoryDataEditorModel {
private final TimeSpan barSize;
private final WritableList list = new WritableList();
private HistoryDataElement lastElement;
private final PropertyChangeListener changeListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
final HistoryDataElement element = (HistoryDataElement) evt.getSource();
if (element.isEmpty()) {
if (element != lastElement) {
list.remove(element);
}
}
else {
if (element == lastElement) {
list.add(lastElement = new HistoryDataElement());
}
}
}
};
private final IListChangeListener listChangeListener = new IListChangeListener() {
@Override
public void handleListChange(ListChangeEvent event) {
event.diff.accept(new ListDiffVisitor() {
@Override
public void handleRemove(int index, Object element) {
((HistoryDataElement) element).removePropertyChangeListener(changeListener);
}
@Override
public void handleAdd(int index, Object element) {
((HistoryDataElement) element).addPropertyChangeListener(changeListener);
}
});
}
};
public HistoryDataEditorModel(TimeSpan barSize) {
this.barSize = barSize;
list.addListChangeListener(listChangeListener);
list.add(lastElement = new HistoryDataElement());
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
// Do nothing
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
// Do nothing
}
public void dispose() {
list.removeListChangeListener(listChangeListener);
}
public void set(IOHLC[] ohlc) {
list.clear();
List<HistoryDataElement> l = new ArrayList<HistoryDataElement>();
for (int i = 0; i < ohlc.length; i++) {
l.add(new HistoryDataElement(ohlc[i]));
}
list.addAll(l);
list.add(lastElement = new HistoryDataElement());
}
public void merge(IOHLC[] ohlc) {
Map<Date, HistoryDataElement> map = new HashMap<Date, HistoryDataElement>();
for (Object o : list) {
Date date = ((HistoryDataElement) o).getDate();
if (date != null) {
map.put(date, (HistoryDataElement) o);
}
}
for (int i = 0; i < ohlc.length; i++) {
HistoryDataElement oldElement = map.get(ohlc[i].getDate());
if (oldElement != null) {
if (!oldElement.equalsTo(ohlc[i])) {
int index = list.indexOf(oldElement);
list.set(index, new HistoryDataElement(ohlc[i]));
}
}
else {
list.add(new HistoryDataElement(ohlc[i]));
}
}
}
public IOHLC[] toOHLC() {
List<IOHLC> l = new ArrayList<IOHLC>();
for (Object o : this.list) {
HistoryDataElement element = (HistoryDataElement) o;
if (element.isValid()) {
l.add(element.toOHLC());
}
}
return l.toArray(new IOHLC[l.size()]);
}
public WritableList getList() {
return list;
}
public TimeSpan getBarSize() {
return barSize;
}
public String getDate() {
return barSize.getDescription();
}
public HistoryDataElement getLastElement() {
return lastElement;
}
}