/*********************************************************************
*                                                                    *
*                    MacLibrary ScrollBar Example                    *
*                                                                    *
*********************************************************************/
#include "\v1\intuall.h"
#include "maclib.h"

#define LAGadgetID 101
#define RAGadgetID 102
#define TAGadgetID 104
#define BAGadgetID 105

struct IntuiMessage *message;

USHORT class,code,qualifier;
APTR address;

struct Screen *OpenRegScreen();
struct Window *OpenRegWindow();
struct Screen *screen1,*screen2;
struct Window *window1,*window2;
struct RastPort *rp1,*rp2,bigport;
struct BitMap bigBitMap;
struct Rectangle rect1,rectA,rectB;
SHORT gadgetID;

struct PropInfo window1HSBpropinfo,window1VSBpropinfo;
struct Gadget window1HSBgadget,window1VSBgadget;
struct Gadget window1LAgadget,window1RAgadget,window1TAgadget,window1BAgadget;
struct PropInfo window2HSBpropinfo,window2VSBpropinfo;
struct Gadget window2HSBgadget,window2VSBgadget;
struct Image window1HSBimage,window1VSBimage;
struct Image window1LAimage,window1RAimage,window1TAimage,window1BAimage;
struct Image window2HSBimage,window2VSBimage;

UWORD                  areabuffer[250];
struct AreaInfo        myAreaInfo;
PLANEPTR               myplane;
struct TmpRas          myTmpRas;

PLANEPTR AllocRaster();

long HSBPosition,VSBPosition;
SHORT newX1,newY1,oldX1,oldY1;
SHORT newX2,newY2,oldX2,oldY2;
BOOL endflag;
                  
main()
{
   SHORT i,j,k;

   Initialize();
   screen1 = OpenRegScreen("Scrolling",0,5);
   window1 = OpenRegWindow(screen1,"One",12,12,200,100);
   rp1 = window1->RPort;
   HorizScrollBar(window1,&window1HSBgadget,&window1HSBpropinfo,
      &window1HSBimage,100,
      &window1LAgadget,&window1LAimage,LAGadgetID,
      &window1RAgadget,&window1RAimage,RAGadgetID);
   VertScrollBar(window1,&window1VSBgadget,&window1VSBpropinfo,
      &window1VSBimage,103,
      &window1TAgadget,&window1TAimage,TAGadgetID,
      &window1BAgadget,&window1BAimage,BAGadgetID);
   UpHorizSB(window1,&window1HSBgadget,
      0xFFFF*(window1->Width-15)/320,0);
   UpVertSB(window1,&window1VSBgadget,
      0xFFFF*(window1->Height-22)/200,0);
   HSBPosition = VSBPosition = 0;

   window2 = OpenRegWindow(screen1,"Two",50,115,100,80);
   rp2 = window2->RPort;
   HorizScrollBar(window2,&window2HSBgadget,&window2HSBpropinfo,
      &window2HSBimage,100,
      0,0,0,0,0,0);
   VertScrollBar(window2,&window2VSBgadget,&window2VSBpropinfo,
      &window2VSBimage,103,
      0,0,0,0,0,0);
   UpHorizSB(window2,&window2HSBgadget,
      0xFFFF*(window2->Width-15)/320,0);
   UpVertSB(window2,&window2VSBgadget,
      0xFFFF*(window2->Height-22)/200,0);

   InitRastPort(&bigport);
   bigport.BitMap = &bigBitMap;

   InitBitMap(&bigBitMap,5,320,200);
  	for(j=0;j<5;j++)
      {
	   bigBitMap.Planes[j] = (PLANEPTR)AllocRaster(320,200);
	   BltClear(bigBitMap.Planes[j],(320>>3)*200,1);
	   }
   InitArea(&myAreaInfo,&areabuffer[0],100);
   myplane = AllocRaster(320,200);
   InitTmpRas(&myTmpRas,myplane,RASSIZE(320,200));
   bigport.TmpRas = &myTmpRas;
   bigport.AreaInfo = &myAreaInfo;

   SetAPen(&bigport,5);
   PenSize(&bigport,2,2);
   k = 0;
   for(j=20;j<180;j+=20)
      {
      for(i=20;i<300;i+=20)
         {
         SetRect(&rect1,i,j,i+16,j+16);
         GetPattern(&bigport,k++);
         PaintOval(&bigport,&rect1); 
   ClipBlit(&bigport,0,0,rp1,2,11,window1->Width-15,window1->Height-22,0xc0);  
   ClipBlit(&bigport,0,0,rp2,2,11,window2->Width-15,window2->Height-22,0xc0);
         }
      }
   ClipBlit(&bigport,0,0,rp1,2,11,window1->Width-15,window1->Height-22,0xc0);  
   ClipBlit(&bigport,0,0,rp2,2,11,window2->Width-15,window2->Height-22,0xc0);

   endflag = FALSE;

   do {

     while((message = (struct IntuiMessage *)GetMsg(window1->UserPort)) !=0) 
        {
 	     class = message->Class;
	     code = message->Code;
	     qualifier = message->Qualifier;
        address = message->IAddress;
 	     ReplyMsg(message);
        Window1Control();
        }

     newX1 = ReadHorizScrollBar(&window1HSBgadget)*
        (320-(window1->Width-15))/0xffff;  
     newY1 = ReadVertScrollBar(&window1VSBgadget)*
        (200-(window1->Height-22))/0xffff;
     if(newX1 != oldX1 || newY1 != oldY1)
        {
        ClipBlit(&bigport,newX1,newY1,rp1,2,11,
           window1->Width-15,window1->Height-22,0xc0);
        oldX1 = newX1;
        oldY1 = newY1;
        }

     while((message = (struct IntuiMessage *)GetMsg(window2->UserPort)) !=0) 
        {
 	     class = message->Class;
	     code = message->Code;
	     qualifier = message->Qualifier;
        address = message->IAddress;
 	     ReplyMsg(message);
        Window2Control();
        }

     newX2 = ReadHorizScrollBar(&window2HSBgadget)*
        (320-(window2->Width-15))/0xffff;  
     newY2 = ReadVertScrollBar(&window2VSBgadget)*
        (200-(window2->Height-22))/0xffff;
     if(newX2 != oldX2 || newY2 != oldY2)
        {
        ClipBlit(&bigport,newX2,newY2,rp2,2,11,
           window2->Width-15,window2->Height-22,0xc0);
        oldX2 = newX2;
        oldY2 = newY2;
        }

      } while (!endflag);

     RemoveGadget(window1,&window1HSBgadget);
     RemoveGadget(window1,&window1VSBgadget);
     RemoveGadget(window1,&window1LAgadget);
     RemoveGadget(window1,&window1RAgadget);
     RemoveGadget(window1,&window1TAgadget);
     RemoveGadget(window1,&window1BAgadget);
     CloseWindow(window1);

     RemoveGadget(window2,&window2HSBgadget);
     RemoveGadget(window2,&window2VSBgadget);
     CloseWindow(window2);
     CloseScreen(screen1);
     
     for (j=0;j<5;j++) FreeRaster(bigBitMap.Planes[j],320,200);
     FreeRaster(myplane,320,200);

     Finalize();

} /* end of Main */



Window1Control()
{
  SHORT ag;

  switch(class)
	  {
	  case CLOSEWINDOW:
       endflag = TRUE;
	    break;

  	  case MENUPICK:
        break;

     case RAWKEY:
        break;

     case GADGETDOWN:
         ag = ((struct Gadget *)address)->GadgetID;
         if (ag==LAGadgetID)
            {
            if ((HSBPosition=ReadHorizScrollBar(&window1HSBgadget)-0x1000)<0)
               HSBPosition = 0;
            UpHorizSB(window1,&window1HSBgadget,0,HSBPosition);
            }
         if (ag==RAGadgetID)
            {
            if ((HSBPosition=ReadHorizScrollBar(&window1HSBgadget)+0x1000)>0xFFFF)
               HSBPosition = 0xFFFF;
            UpHorizSB(window1,&window1HSBgadget,0,HSBPosition);
            }
         if (ag==TAGadgetID)
            {
            if ((VSBPosition=ReadVertScrollBar(&window1VSBgadget)-0x1000)<0)
               VSBPosition = 0;
            UpVertSB(window1,&window1VSBgadget,0,VSBPosition);
            }
         if (ag==BAGadgetID)
            {
            if ((VSBPosition=ReadVertScrollBar(&window1VSBgadget)+0x1000)>0xFFFF)
               VSBPosition = 0xFFFF;
            UpVertSB(window1,&window1VSBgadget,0,VSBPosition);
            }
         break;

     case GADGETUP:
           break;

     case SIZEVERIFY:
        break;

  	  case NEWSIZE:
        UpHorizSB(window1,&window1HSBgadget,
           0xFFFF*(window1->Width-15)/320,-1);
        UpVertSB(window1,&window1VSBgadget,
           0xFFFF*(window1->Height-22)/200,-1);
        ClipBlit(&bigport,newX1,newY1,rp1,2,11,
           window1->Width-15,window1->Height-22,0xc0);
        break;

	  case MOUSEBUTTONS:
        break;

     default:
        break;
     }
return(TRUE);         
}

Window2Control()
{
     switch(class)
	  {
	  case CLOSEWINDOW:
       endflag = TRUE;
	    break;

  	  case MENUPICK:
        break;

     case RAWKEY:
        break;

     case GADGETDOWN:
        break;

     case GADGETUP:
        break;

     case SIZEVERIFY:
        break;

  	  case NEWSIZE:
        UpHorizSB(window2,&window2HSBgadget,
           0xFFFF*(window2->Width-15)/320,-1);
        UpVertSB(window2,&window2VSBgadget,
           0xFFFF*(window2->Height-22)/200,-1);
        ClipBlit(&bigport,newX2,newY2,rp2,2,11,
           window2->Width-15,window2->Height-22,0xc0);

        break;

	  case MOUSEBUTTONS:
        break;

     default:
        break;
     }
return(TRUE);         
}


