import java.awt.*; import java.util.Observer; import java.util.Observable; public class Renderer extends Panel implements Observer { Scrollbar horiz, vert; Canvas canvas; int canvasWidth, canvasHeight; int offsetX=0, offsetY=0; int originX=0, originY=0; Renderable target=null; public Renderer() { this(null); } public Renderer(Renderable r) { createControls(); setTarget(r); } public void createControls() { horiz=new Scrollbar(Scrollbar.HORIZONTAL); vert=new Scrollbar(Scrollbar.VERTICAL); canvas=new Canvas(); setLayout(new BorderLayout(0,0)); add("South",horiz); add("East",vert); add("Center", canvas); } public void setTarget(Renderable r) { if (target!=null) target.deleteObserver(this); target=r; if (target!=null) { target.addObserver(this); setScrollbars(); repaint(); } } public Renderable getTarget() { return target; } public void paint(Graphics graphics) { System.out.println("Ran renderable paint"); //if (target==null) System.out.println("Null target in paint()"); if (target!=null) { Graphics g=canvas.getGraphics(); g.setColor(Color.white); g.drawRect(0,0,canvasWidth,canvasHeight); g.translate(originX,originY); target.render(g); } } public void finalize() throws Throwable { target.deleteObserver(this); super.finalize(); } public synchronized void reshape(int x, int y, int w, int h) { super.reshape(x,y,w,h); Dimension horizDim=horiz.size(); Dimension vertDim=vert.size(); canvasWidth=w-vertDim.width; canvasHeight=h-horizDim.height; } public void setScrollbars() { int width=0, height=0; Dimension d = new Dimension(0,0); if (target!=null) { d=target.getDimensions(); width=d.width-canvasWidth; height=d.height-canvasHeight; if (offsetX>width) offsetX=width; if (offsetY>height) offsetY=height; } else { offsetX=0; offsetY=0; } width = width < 0 ? 0 : width; height = height < 0 ? 0 : height; setOrigin(-offsetX, -offsetY); horiz.setValues(offsetX, canvasWidth, 0, width); horiz.setLineIncrement((int).2*d.width); horiz.setPageIncrement((int).5*d.width); vert.setValues(offsetY, canvasHeight, 0, height); vert.setLineIncrement((int).2*d.height); horiz.setPageIncrement((int).5*d.width); } public boolean handleEvent(Event e) { if (e.target==horiz) { switch(e.id) { case Event.SCROLL_LINE_UP: case Event.SCROLL_LINE_DOWN: case Event.SCROLL_PAGE_UP: case Event.SCROLL_PAGE_DOWN: case Event.SCROLL_ABSOLUTE: offsetX=((Integer)e.arg).intValue(); break; } setOrigin(-offsetX,-offsetY); this.repaint(); return true; } else if(e.target==vert) { switch(e.id) { case Event.SCROLL_LINE_UP: case Event.SCROLL_LINE_DOWN: case Event.SCROLL_PAGE_UP: case Event.SCROLL_PAGE_DOWN: case Event.SCROLL_ABSOLUTE: offsetY=((Integer)e.arg).intValue(); break; } setOrigin(-offsetX,-offsetY); this.repaint(); return true; } //canvas.getGraphics().drawString(offsetX+","+offsetY,canvasWidth-50,canvasHeight-20); return super.handleEvent(e); } public void update(Observable o, Object arg) { if (o==target&&target!=null) { setScrollbars(); repaint(); } } public void setOrigin(int x, int y) { originX=x; originY=y; repaint(); } }