blob: a935e990324817efa2f5ae9322425d9c57ec4cf6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Dirk Fauth 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:
* Dirk Fauth <dirk.fauth@gmail.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.nattable.util;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
/**
* Interface for specifying a value cache to support value calculations in a
* background thread.
*
* @see CalculatedValueCache
* @since 1.3
*/
public interface ICalculatedValueCache {
/**
* Returns the calculated value for the specified column and row position.
* If there is no calculated value for that coordinates in the cache or
* there is a potentially stale value, the re-calculation of the value is
* executed.
* <p>
* This method tries to use a predefined cache key dependent on the
* configuration of this CalculatedValueCache.
*
* @param columnPosition
* The column position of the requested value.
* @param rowPosition
* The row position of the requested value.
* @param calculateInBackground
* Flag to specify whether the value calculation should be
* processed in the background or not. Setting this value to
* <code>false</code> will cause calculation in the UI thread,
* which is usually necessary in case of exporting and printing.
* @param calculator
* The {@link ICalculator} that is used for calculating the
* values.
* @return The value for the given coordinates.
*
* @throws IllegalStateException
* if this CalculatedValueCache is configured to not use the
* column and row position for cache key definition.
*/
public abstract Object getCalculatedValue(int columnPosition,
int rowPosition, boolean calculateInBackground,
ICalculator calculator);
/**
* Returns the calculated value for the specified column and row position.
* If there is no calculated value for that coordinates in the cache or
* there is a potentially stale value, the re-calculation of the value is
* executed.
* <p>
* This method uses the given ICalculatedValueCacheKey instead of
* determining the cache key out of the CalculatedValueCache key
* configuration.
*
* @param columnPosition
* The column position of the requested value.
* @param rowPosition
* The row position of the requested value.
* @param key
* The key that is used by this CalculatedValueCache.
* @param calculateInBackground
* Flag to specify whether the value calculation should be
* processed in the background or not. Setting this value to
* <code>false</code> will cause calculation in the UI thread,
* which is usually necessary in case of exporting and printing.
* @param calculator
* The {@link ICalculator} that is used for calculating the
* values.
* @return The value for the given coordinates.
*/
public abstract Object getCalculatedValue(int columnPosition,
int rowPosition, ICalculatedValueCacheKey key,
boolean calculateInBackground, ICalculator calculator);
/**
* Clear the internal cache. Doing this will result in triggering new
* calculations. If the values where calculated before, using the cache copy
* still the already calculated values will be returned until the new
* calculation is done.
*/
public abstract void clearCache();
/**
* Kills all cached values. The internal cache aswell as the cache copy to
* support smooth updates of values. This is necessary because on structural
* changes, e.g. deleting/adding rows, the cache copy would return false
* values.
*/
public abstract void killCache();
/**
* Cleaning up internal resources like shutting down the ExecutorService.
*/
public abstract void dispose();
/**
* Set the layer that should be used by this CalculatedValueCache to trigger
* updates after the calculation processing is done. Necessary if the
* caching is connected to a data provider for example, which is not able to
* fire events itself.
*
* @param layer
* The ILayer that should be used to fire the
* CellVisualChangeEvent after the background calculation process
* is done.
*/
public abstract void setLayer(ILayer layer);
}