package org.eclipse.nebula.widgets.nattable.renderer.javafx.graphics

import com.sun.javafx.tk.Toolkit
import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
import org.eclipse.nebula.widgets.nattable.core.graphics.Color
import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext

class JavaFXGraphicsContext implements GraphicsContext {
	
	val javafx.scene.canvas.GraphicsContext gc
	
	new(javafx.scene.canvas.GraphicsContext gc) {
		this.gc = gc
	}
	
	// GraphicsContext interface
	
	override pushState() {
		gc.save
	}
	
	override popState() {
		gc.restore
	}
	
	override translate(int xOffset, int yOffset) {
		gc.translate(xOffset, yOffset)
	}
	
	override setForegroundColor(Color foregroundColor) {
		gc.stroke = new javafx.scene.paint.Color(
			foregroundColor.red as double / 255,
			foregroundColor.green as double / 255,
			foregroundColor.blue as double / 255,
			foregroundColor.alpha as double / 255
		)
	}
	
	override setBackgroundColor(Color backgroundColor) {
		gc.fill = new javafx.scene.paint.Color(
			backgroundColor.red as double / 255,
			backgroundColor.green as double / 255,
			backgroundColor.blue as double / 255,
			backgroundColor.alpha as double / 255
		)
	}
	
	override getClipBounds() {
		println("getClipBounds() not implemented")
		new PixelRectangle(0, 0, 0, 0)
	}
	
	override setClipBounds(PixelRectangle clipBounds) {
		println("setClipBounds(clipBounds) not implemented")
	}
	
	override drawLine(int x1, int y1, int x2, int y2) {
		gc.strokeLine(x1, y1, x2, y2)
	}
	
	override drawRectangle(PixelRectangle rect) {
		gc.strokeRect(rect.x, rect.y, rect.width, rect.height)
	}
	
	override fillRectangle(PixelRectangle rect) {
		gc.fillRect(rect.x, rect.y, rect.width, rect.height)
	}
	
	override drawText(String text, int x, int y) {
		gc.strokeText(text, x, y)
	}
	
	override calculateTextWidth(String text) {
		val fontMetrics = Toolkit::toolkit.fontLoader.getFontMetrics(gc.font)
		fontMetrics.computeStringWidth(text)
	}
	
	override getFontHeight() {
		val fontMetrics = Toolkit::toolkit.fontLoader.getFontMetrics(gc.font)
		fontMetrics.lineHeight
	}
	
}