/* * 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.beans.PropertyChangeSupport; import java.util.HashMap; 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.eclipse.swt.widgets.Display; import org.eclipsetrader.core.feed.IHistory; import org.eclipsetrader.core.feed.IOHLC; import org.eclipsetrader.core.repositories.IPropertyConstants; public class HistoryDataDetailEditorModel { private IHistory[] history; private PropertyChangeListener[] dataChangeListener; private final Map<IHistory, HistoryDataEditorModel> map = new HashMap<IHistory, HistoryDataEditorModel>(); private final WritableList list = new WritableList(); private final PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); 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) { PropertyChangeListener[] listeners = changeSupport.getPropertyChangeListeners(); for (int i = 0; i < listeners.length; i++) { ((HistoryDataElement) element).removePropertyChangeListener(listeners[i]); } } @Override public void handleAdd(int index, Object element) { PropertyChangeListener[] listeners = changeSupport.getPropertyChangeListeners(); for (int i = 0; i < listeners.length; i++) { ((HistoryDataElement) element).addPropertyChangeListener(listeners[i]); } } }); } }; public HistoryDataDetailEditorModel() { } public void addPropertyChangeListener(PropertyChangeListener listener) { changeSupport.addPropertyChangeListener(listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { changeSupport.removePropertyChangeListener(listener); } public void set(IHistory[] history) { this.history = history; dataChangeListener = new PropertyChangeListener[history.length]; for (int i = 0; i < history.length; i++) { final HistoryDataEditorModel model = new HistoryDataEditorModel(history[i].getTimeSpan()); model.set(history[i].getOHLC()); PropertyChangeSupport propertyChangeSupport = (PropertyChangeSupport) history[i].getAdapter(PropertyChangeSupport.class); if (propertyChangeSupport != null) { dataChangeListener[i] = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (IPropertyConstants.BARS.equals(evt.getPropertyName())) { final IOHLC[] newBars = (IOHLC[]) evt.getNewValue(); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { model.merge(newBars); } }); } } }; propertyChangeSupport.addPropertyChangeListener(dataChangeListener[i]); } model.getList().addListChangeListener(listChangeListener); map.put(history[i], model); } list.addAll(map.values()); } public WritableList getList() { return list; } public Map<IHistory, HistoryDataEditorModel> getMap() { return map; } public void dispose() { for (int i = 0; i < history.length; i++) { PropertyChangeSupport propertyChangeSupport = (PropertyChangeSupport) history[i].getAdapter(PropertyChangeSupport.class); if (propertyChangeSupport != null) { propertyChangeSupport.removePropertyChangeListener(dataChangeListener[i]); } } } public HistoryDataEditorModel getParent(Object element) { for (HistoryDataEditorModel model : map.values()) { if (model.getList().contains(element)) { return model; } } return null; } }