diff -r 28b6670e415a -r 89cbba12863d lib/browser/awtUtilities/ScrollCanvas.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/browser/awtUtilities/ScrollCanvas.java Wed Aug 06 00:06:47 1997 +0200 @@ -0,0 +1,169 @@ +/*************************************************************************** + Title: awtUtilities/ScrollCanvas.java + ID: $Id$ + Author: Stefan Berghofer, TU Muenchen + Copyright 1997 TU Muenchen + + This class contains defines a window with scrollbars, which is not + supported by the 1.0.2 version of the JDK. To use this class, simply + derive your own class from it and overwrite the paintCanvas method. + When a repaint event occurs, ScrollCanvas automatically calls the + paintCanvas method. The user doesn't have to take care of transposing + mouse or graphics coordinates. + Note: In later versions of the JDK, a ScrollPane class will be provided, + which can be used instead. +***************************************************************************/ + +package awtUtilities; + +import java.awt.*; + +class DummyCanvas extends Canvas { + ScrollCanvas parent; + + public DummyCanvas(ScrollCanvas p) { + parent=p; + } + + public void paint(Graphics g) { + parent.paint(g); + } + + public void update(Graphics g) { + parent.update(g); + } +} + +public class ScrollCanvas extends Panel +{ + Scrollbar scrollv,scrollh; + Canvas can; + Image img=null; + int offset_x=0,offset_y=0; + int size_x=100,size_y=100; + int old_x=0,old_y=0; + + public boolean handleEvent(Event evt) + { + evt.x+=offset_x; + evt.y+=offset_y; + if (evt.target instanceof Scrollbar) + { + offset_x=scrollh.getValue(); + offset_y=scrollv.getValue(); + Graphics g=can.getGraphics(); + if (old_x!=size_x || old_y!=size_y) + update(g); + else { + g.translate(-offset_x,-offset_y); + g.drawImage(img,0,0,this); + } + return true; + } + else return super.handleEvent(evt); + } + + public void adjust_scrollbars() + { + int viewport_v=can.size().height; + int viewport_h=can.size().width; + int value_v=scrollv.getValue(); + int value_h=scrollh.getValue(); + + scrollv.setValues(value_v,viewport_v,0,size_y-viewport_v); + scrollh.setValues(value_h,viewport_h,0,size_x-viewport_h); + scrollv.setLineIncrement(viewport_v/20); + scrollv.setPageIncrement(viewport_v); + scrollh.setLineIncrement(viewport_h/20); + scrollh.setPageIncrement(viewport_h); + offset_x=scrollh.getValue(); + offset_y=scrollv.getValue(); + } + + public void set_size(int x,int y) + { + size_x=x;size_y=y; + adjust_scrollbars(); + } + + public void focus_to(int x,int y) { + offset_x=Math.min(scrollh.getMaximum(),Math.max(0,x-can.size().width/2)); + offset_y=Math.min(scrollv.getMaximum(),Math.max(0,y-can.size().height/2)); + + scrollh.setValue(offset_x); + scrollv.setValue(offset_y); + Graphics g=can.getGraphics(); + if (old_x!=size_x || old_y!=size_y) + update(g); + else { + g.translate(-offset_x,-offset_y); + g.drawImage(img,0,0,this); + } + } + + public void update(Graphics g) { + g=can.getGraphics(); + int viewport_v=can.size().height; + int viewport_h=can.size().width; + int img_x=Math.max(viewport_h,size_x+1); + int img_y=Math.max(viewport_v,size_y+1); + + old_x=size_x;old_y=size_y; + img=createImage(img_x,img_y); + Graphics g2=img.getGraphics(); + g2.setColor(Color.lightGray); + g2.fillRect(0,0,img_x,img_y); + g2.setColor(Color.black); + paintCanvas(g2); + adjust_scrollbars(); + g.translate(-offset_x,-offset_y); + g.drawImage(img,0,0,this); + } + + public void paint(Graphics g) + { + if (img!=null && old_x==size_x && old_y==size_y) { + g=can.getGraphics(); + adjust_scrollbars(); + g.translate(-offset_x,-offset_y); + g.drawImage(img,0,0,this); + } else update(g); + } + + public Graphics getGraphics() { + Graphics g=can.getGraphics(); + + g.translate(-offset_x,-offset_y); + return g; + } + + public void paintCanvas(Graphics g) + {} + + public ScrollCanvas() + { + can=new DummyCanvas(this); + GridBagLayout gridbag = new GridBagLayout(); + GridBagConstraints c = new GridBagConstraints(); + scrollv=new Scrollbar(Scrollbar.VERTICAL); + scrollh=new Scrollbar(Scrollbar.HORIZONTAL); + + setLayout(gridbag); + c.weightx = 1.0; + c.weighty = 1.0; + c.gridwidth=1; + c.fill = GridBagConstraints.BOTH; + gridbag.setConstraints(can,c); + add(can); + c.weightx=0; + c.weighty=0; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.VERTICAL; + gridbag.setConstraints(scrollv,c); + add(scrollv); + c.gridwidth = 1; + c.fill = GridBagConstraints.HORIZONTAL; + gridbag.setConstraints(scrollh,c); + add(scrollh); + } +}