package com.baselet.gwt.client.view;
import java.util.List;
import com.baselet.control.basics.geom.Rectangle;
import com.baselet.control.config.SharedConfig;
import com.baselet.control.enums.ElementId;
import com.baselet.element.Selector;
import com.baselet.element.interfaces.GridElement;
import com.baselet.gwt.client.element.ComponentGwt;
import com.baselet.gwt.client.element.ElementFactoryGwt;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.canvas.dom.client.Context2d;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.CanvasElement;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.TextResource;
import com.google.gwt.user.client.ui.FocusWidget;
public class DrawCanvas {
public interface HelptextResources extends ClientBundle {
HelptextResources INSTANCE = GWT.create(HelptextResources.class);
@Source("Helptext.txt")
TextResource helpText();
}
private final Canvas canvas = Canvas.createIfSupported();
public FocusWidget getWidget() {
return canvas;
}
public Context2d getContext2d() {
return canvas.getContext2d();
}
public void clearAndSetSize(int width, int height) {
// setCoordinateSpace always clears the canvas. To avoid that see https://groups.google.com/d/msg/google-web-toolkit/dpc84mHeKkA/3EKxrlyFCEAJ
canvas.setCoordinateSpaceWidth(width);
canvas.setCoordinateSpaceHeight(height);
}
public int getWidth() {
return canvas.getCoordinateSpaceWidth();
}
public int getHeight() {
return canvas.getCoordinateSpaceHeight();
}
public CanvasElement getCanvasElement() {
return canvas.getCanvasElement();
}
public String toDataUrl(String type) {
return canvas.toDataUrl(type);
}
void draw(boolean drawEmptyInfo, List<GridElement> gridElements, Selector selector) {
if (SharedConfig.getInstance().isDev_mode()) {
CanvasUtils.drawGridOn(getContext2d());
}
if (drawEmptyInfo && gridElements.isEmpty()) {
drawEmptyInfoText();
}
else {
// if (tryOptimizedDrawing()) return;
for (GridElement ge : gridElements) {
((ComponentGwt) ge.getComponent()).drawOn(canvas.getContext2d(), selector.isSelected(ge));
}
}
}
private void drawEmptyInfoText() {
double elWidth = 440;
double elHeight = 150;
double elXPos = getWidth() / 2.0 - elWidth / 2;
double elYPos = getHeight() / 2.0 - elHeight;
GridElement emptyElement = ElementFactoryGwt.create(ElementId.Text, new Rectangle(elXPos, elYPos, elWidth, elHeight), HelptextResources.INSTANCE.helpText().getText(), "", null);
((ComponentGwt) emptyElement.getComponent()).drawOn(canvas.getContext2d(), false);
}
// TODO would not work because canvas gets always resized and therefore cleaned -> so everything must be redrawn
// private boolean tryOptimizedDrawing() {
// List<GridElement> geToRedraw = new ArrayList<GridElement>();
// for (GridElement ge : gridElements) {
// if(((GwtComponent) ge.getComponent()).isRedrawNecessary()) {
// for (GridElement geRedraw : geToRedraw) {
// if (geRedraw.getRectangle().intersects(ge.getRectangle())) {
// return false;
// }
// }
// geToRedraw.add(ge);
// }
// }
//
// for (GridElement ge : gridElements) {
// elementCanvas.getContext2d().clearRect(0, 0, ge.getRectangle().getWidth(), ge.getRectangle().getHeight());
// ((GwtComponent) ge.getComponent()).drawOn(elementCanvas.getContext2d());
// }
// return true;
// }
}