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

import com.google.inject.Injector
import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
import org.eclipse.nebula.widgets.nattable.core.graphics.PainterFactory
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.nebula.widgets.nattable.renderer.swt.graphics.SWTPainterFactory
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)
	
	extension Injector
	extension PainterFactory

	Layer layer

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

	new(Composite parent, int style) {
		super(parent, style)
	}
	
	def void setInjector(Injector baseInjector) {
		_painterFactory = baseInjector.getInstance(typeof(SWTPainterFactory))
		_injector = baseInjector.createChildInjector([ binder |
			binder.bind(typeof(PainterFactory)).toInstance(_painterFactory)
		])
	}
	
	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)
	}
	
	private def paintLayer(GC gc) {
		val paintBounds = new PixelRectangle(bounds.x, bounds.y, bounds.width, bounds.height)
		layer?.layerPainter?.paintLayer(layer, paintBounds, new SWTGraphicsContext(this, gc))
	}
	
}
