/*
* GRAL: GRAphing Library for Java(R)
*
* (C) Copyright 2009-2016 Erich Seifert ,
* Michael Seifert
*
* This file is part of GRAL.
*
* GRAL is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRAL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with GRAL. If not, see .
*/
package de.erichseifert.gral.data.statistics;
import java.io.IOException;
import java.io.ObjectInputStream;
import de.erichseifert.gral.data.AbstractDataSource;
import de.erichseifert.gral.data.DataChangeEvent;
import de.erichseifert.gral.data.DataListener;
import de.erichseifert.gral.data.DataSource;
/**
* Abstract base class for histograms. Derived classes must
* make sure the {@code getColumnTypes()} method returns a correct array
* with column types.
* @see AbstractDataSource#setColumnTypes(Class...)
*/
public abstract class AbstractHistogram2D extends AbstractDataSource
implements DataListener {
/** Version id for serialization. */
private static final long serialVersionUID = 5031290498142366257L;
/** Data source that is used to build the histogram. */
private final DataSource data;
/**
* Initializes a new histograms with a data source.
* @param data Data source to be analyzed.
*/
@SuppressWarnings("unchecked")
public AbstractHistogram2D(DataSource data) {
this.data = data;
this.data.addDataListener(this);
}
/**
* Recalculates the histogram values.
*/
protected abstract void rebuildCells();
/**
* Method that is invoked when data has been added.
* This method is invoked by objects that provide support for
* {@code DataListener}s and should not be called manually.
* @param source Data source that has been changed.
* @param events Optional event object describing the data values that
* have been added.
*/
public void dataAdded(DataSource source, DataChangeEvent... events) {
dataChanged(source, events);
notifyDataAdded(events);
}
/**
* Method that is invoked when data has been updated.
* This method is invoked by objects that provide support for
* {@code DataListener}s and should not be called manually.
* @param source Data source that has been changed.
* @param events Optional event object describing the data values that
* have been updated.
*/
public void dataUpdated(DataSource source, DataChangeEvent... events) {
dataChanged(source, events);
notifyDataUpdated(events);
}
/**
* Method that is invoked when data has been removed.
* This method is invoked by objects that provide support for
* {@code DataListener}s and should not be called manually.
* @param source Data source that has been changed.
* @param events Optional event object describing the data values that
* have been removed.
*/
public void dataRemoved(DataSource source, DataChangeEvent... events) {
dataChanged(source, events);
notifyDataRemoved(events);
}
/**
* Method that is invoked when data has been added, updated, or removed.
* This method is invoked by objects that provide support for
* {@code DataListener}s and should not be called manually.
* @param source Data source that has been changed.
* @param events Optional event object describing the data values that
* have been changed.
*/
private void dataChanged(DataSource source, DataChangeEvent... events) {
rebuildCells();
}
/**
* Returns the data source associated to this histogram.
* @return Data source
*/
public DataSource getData() {
return data;
}
/**
* Custom deserialization method.
* @param in Input stream.
* @throws ClassNotFoundException if a serialized class doesn't exist anymore.
* @throws IOException if there is an error while reading data from the
* input stream.
*/
private void readObject(ObjectInputStream in)
throws ClassNotFoundException, IOException {
// Normal deserialization
in.defaultReadObject();
// Restore listeners
data.addDataListener(this);
}
}
Ads help maintain this website.