/*=============================================================================#
 # Copyright (c) 2012, 2022 Original NatTable authors and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0
 # 
 # Contributors:
 #     Original NatTable authors and others - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.waltable.edit.editor;


/**
 * Abstract implementation of {@link IEditErrorHandler} that by default calls
 * the underlying {@link IEditErrorHandler} to handle the error. This allows
 * chaining of {@link IEditErrorHandler}s to support multiple error handling
 * behaviour, e.g. displaying the error in a dialog and log the error.
 */
public abstract class AbstractEditErrorHandler implements IEditErrorHandler {

	/**
	 * The underlying {@link IEditErrorHandler}
	 */
	protected IEditErrorHandler underlyingErrorHandler;
	
	/**
	 * 
	 * @param underlyingErrorHandler The underlying {@link IEditErrorHandler}
	 */
	public AbstractEditErrorHandler(final IEditErrorHandler underlyingErrorHandler) {
		this.underlyingErrorHandler= underlyingErrorHandler;
	}
	
	/**
	 * {@inheritDoc}
	 * <p>
	 * This implementation will call its underlying {@link IEditErrorHandler}.
	 */
	@Override
	public void removeError(final ICellEditor cellEditor) {
		if (this.underlyingErrorHandler != null) {
			this.underlyingErrorHandler.removeError(cellEditor);
		}
	}
	
	/**
	 * {@inheritDoc}
	 * <p>
	 * This implementation will call its underlying {@link IEditErrorHandler}.
	 */
	@Override
	public void displayError(final ICellEditor cellEditor, final Exception e) {
		if (this.underlyingErrorHandler != null) {
			this.underlyingErrorHandler.displayError(cellEditor, e);
		}
	}
}
