--- /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);
+ }
+}