package com.baselet.gwt.client.element;
import com.baselet.control.basics.geom.Rectangle;
import com.baselet.diagram.draw.DrawHandler;
import com.baselet.element.interfaces.Component;
import com.baselet.element.interfaces.GridElement;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.dom.client.CanvasElement;
public class ComponentGwt implements Component {
boolean redrawNecessary = true;
private final Canvas canvas = Canvas.createIfSupported();
private final DrawHandlerGwt drawer = new DrawHandlerGwt(canvas);
private final DrawHandlerGwt metadrawer = new DrawHandlerGwt(canvas);
private final GridElement element;
private Rectangle rect;
public ComponentGwt(GridElement element) {
this.element = element;
}
@Override
public void setBoundsRect(Rectangle rect) {
this.rect = rect;
}
@Override
public Rectangle getBoundsRect() {
return rect.copy();
}
@Override
public void repaintComponent() {
// repainting is currently not controlled by the gridelement itself
}
@Override
public void afterModelUpdate() {
redrawNecessary = true;
}
@Override
public DrawHandler getDrawHandler() {
return drawer;
}
@Override
public DrawHandler getMetaDrawHandler() {
return metadrawer;
}
@Override
public void translateForExport() {
// currently no export translation necessary
}
private boolean lastSelected = false;
public void drawOn(Context2d context, boolean isSelected) {
if (redrawNecessary || lastSelected != isSelected) {
redrawNecessary = false;
CanvasElement el = canvas.getCanvasElement();
canvas.getContext2d().clearRect(0, 0, el.getWidth(), el.getHeight());
canvas.getCanvasElement().setWidth(rect.getWidth() + 1); // canvas size is +1px to make sure a rectangle with width pixels is still visible (in Swing the bound-checking happens in BaseDrawHandlerSwing because you cannot extend the clipping area)
canvas.getCanvasElement().setHeight(rect.getHeight() + 1);
drawer.drawAll(isSelected);
if (isSelected) {
metadrawer.drawAll();
}
}
lastSelected = isSelected;
context.drawImage(canvas.getCanvasElement(), element.getRectangle().getX(), element.getRectangle().getY());
}
}