racket/collects/htdch/graphics/View.djava
2006-01-27 22:16:14 +00:00

117 lines
2.8 KiB
Plaintext

package graphics;
import scheme.lib.mred.mred;
import scheme.lib.htdch.graphics.rename;
public class View {
private static int viewCount = 0;
private dynamic frame;
private dynamic canvas;
private dynamic dc;
private dynamic buffer;
private String name;
private boolean visible = false;
private boolean image = true;
public View() {
viewCount += 1;
this.name = "View-"+viewCount;
}
//Produces a View with a visible canvas of size x and y
public View display( int x, int y) {
if (visible)
this.hide();
buffer = rename.newObject(mred.bitmapDcObj, rename.newObject(mred.bitmapObj,x,y));
buffer.clear();
class CanvasInner {
public void callBack(dynamic canvas, dynamic dc) {
dc.drawBitmap( View.this.buffer.getBitmap(), 0,0);
}
}
frame = rename.newObject(mred.frameObj, name, false, x+15, y+20);
canvas = rename.newObject(rename.callBackCanvasObj, frame, rename.emptyList, rename.innerToFunction( 2, new CanvasInner()));
dc = canvas.getDc();
this.clear();
frame.show(true);
visible = true;
return this;
}
//Produces a View without a visible canvas
public View hide() {
this.visible = false;
frame.show(visible);
return this;
}
public View show() {
this.visible = true;
frame.show(visible);
return this;
}
//The Image is a equality testable version of the canvas after the drawing command
public Image draw( Command c) {
drawToCanvas(c);
dc.drawBitmap(buffer.getBitmap(), 0 ,0);
return getBufferCopy();
}
//The Image is again an equality testable version of the canvas after applying all commands
//Issues the commands in reverse order
public Image drawSequence( CommandSequence commands ) {
commands.drawAll(this);
dc.drawBitmap(buffer.getBitmap(), 0 ,0);
return getBufferCopy();
}
//Methods not seen by students
void allowImage( boolean ok ) {
this.image = ok;
}
private Image getBufferCopy() {
if (image) {
dynamic bufferBitmap = buffer.getBitmap();
dynamic bitmapCopy = rename.newObject(mred.bitmapObj, bufferBitmap.getWidth(), bufferBitmap.getHeight());
dynamic dcCopy = rename.newObject(mred.bitmapDcObj, bitmapCopy);
dcCopy.clear();
dcCopy.drawBitmap(bufferBitmap, 0, 0);
dcCopy.setBitmap(false);
return new Image(rename.newObject(mred.imageSnipObj, bitmapCopy, false));
} else {
return new Image(false);
}
}
void keyCallBack(dynamic curWorld) {
canvas.setCallback(curWorld);
}
//erases the canvas
void clear() {
buffer.clear();
dc.drawBitmap(buffer.getBitmap(), 0 ,0);
}
//Issues the drawing command in c, causing it to draw to the canvas
void drawToCanvas( Command c) {
if (!visible)
throw new RuntimeException("View must be displayed in order to draw in it");
c.issue(buffer);
}
}