package org.eclipse.nebula.widgets.nattable.renderer.swt

import com.google.inject.Injector
import javax.inject.Inject
import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea
import org.eclipse.nebula.widgets.nattable.core.graphics.LayerPainterFactory
import org.eclipse.nebula.widgets.nattable.core.layer.Layer
import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.Mode
import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.ModeSwitcher
import org.eclipse.nebula.widgets.nattable.renderer.swt.event.mode.NormalMode
import org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.SWTGraphicsContext
import org.eclipse.swt.SWT
import org.eclipse.swt.graphics.GC
import org.eclipse.swt.widgets.Canvas
import org.eclipse.swt.widgets.Composite

class SWTNatTable extends Canvas {

	static val int DEFAULT_STYLE_OPTIONS = SWT::NO_BACKGROUND.bitwiseOr(SWT::DOUBLE_BUFFERED).bitwiseOr(SWT::NO_REDRAW_RESIZE)
	
	@Inject extension Injector
	@Inject extension LayerPainterFactory

	Layer layer

	new(Composite parent) {
		this(parent, DEFAULT_STYLE_OPTIONS)
	}

	new(Composite parent, int style) {
		super(parent, style)
	}
	
	def Layer getLayer() { layer }
	
	def void setLayer(Layer layer) {
		this.layer = layer
		
		// Event listener
		layer.addEventListener([ event | redraw ])
		
		// Paint listener
		addPaintListener([ event | paintLayer(event.gc) ])
		
		// Init mode switcher
		val modeSwitcher = new ModeSwitcher(this)
		modeSwitcher.registerMode(Mode::NORMAL, getInstance(typeof(NormalMode)))
		modeSwitcher.switchToMode(Mode::NORMAL)
	}
	
	def private paintLayer(GC swtGC) {
		val paintArea = new PixelArea(bounds.width, bounds.height)
		val gc = new SWTGraphicsContext(this, swtGC)
		layer?.layerPainter?.paintLayer(layer, paintArea, gc)
	}
	
}
