/*=============================================================================#
 # Copyright (c) 2012, 2021 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.painter.layer;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;

import org.eclipse.statet.ecommons.waltable.NatTable;
import org.eclipse.statet.ecommons.waltable.config.IConfigRegistry;
import org.eclipse.statet.ecommons.waltable.coordinate.LRectangle;
import org.eclipse.statet.ecommons.waltable.layer.ILayer;
import org.eclipse.statet.ecommons.waltable.painter.IOverlayPainter;
import org.eclipse.statet.ecommons.waltable.swt.SWTUtil;
import org.eclipse.statet.internal.ecommons.waltable.WaLTablePlugin;


public class NatLayerPainter implements ILayerPainter {
	
	
	private final NatTable natTable;
	
	
	public NatLayerPainter(final NatTable natTable) {
		this.natTable= natTable;
	}
	
	
	@Override
	public void paintLayer(final ILayer natLayer, final GC gc,
			final int xOffset, final int yOffset, final Rectangle pixelRectangle,
			final IConfigRegistry configRegistry) {
		try {
			paintBackground(natLayer, gc, xOffset, yOffset, pixelRectangle, configRegistry);
			
			gc.setForeground(this.natTable.getForeground());
			
			final Rectangle paintRectangle= pixelRectangle.intersection(SWTUtil.toSWT(
					new LRectangle(xOffset, yOffset, natLayer.getWidth(), natLayer.getHeight()) ));
			
			if (!paintRectangle.isEmpty()) {
				this.natTable.getLayer().getLayerPainter().paintLayer(natLayer, gc,
						xOffset, yOffset, paintRectangle, configRegistry );
			}
			
			paintOverlays(natLayer, gc, xOffset, yOffset, pixelRectangle, configRegistry);
		} catch (final Exception e) {
			WaLTablePlugin.log(new Status(IStatus.ERROR, WaLTablePlugin.BUNDLE_ID,
					"An error occurred while painting the table.", e ));
		}
	}
	
	protected void paintBackground(final ILayer natLayer, final GC gc, final long xOffset, final long yOffset, final org.eclipse.swt.graphics.Rectangle rectangle, final IConfigRegistry configRegistry) {
		gc.setBackground(this.natTable.getBackground());
		
		// Clean Background
		gc.fillRectangle(rectangle);
	}
	
	protected void paintOverlays(final ILayer natLayer, final GC gc, final long xOffset, final long yOffset, final org.eclipse.swt.graphics.Rectangle rectangle, final IConfigRegistry configRegistry) {
		for (final IOverlayPainter overlayPainter : this.natTable.getOverlayPainters()) {
			overlayPainter.paintOverlay(gc, this.natTable);
		}
	}
	
	@Override
	public LRectangle adjustCellBounds(final long columnPosition, final long rowPosition, final LRectangle cellBounds) {
		final ILayerPainter layerPainter= this.natTable.getLayer().getLayerPainter();
		return layerPainter.adjustCellBounds(columnPosition, rowPosition, cellBounds);
	}
	
}
