/******************************************************************************
 *
 *    $Source: apphome:APlusPlus/RCS/TESTPRGS/graphics/Canvas_test.cxx,v $
 *
 *    Demo for the A++ Library
 *    Copyright (C) 1994 by Armin Vogt, EMail: armin@uni-paderborn.de
 *
 *	   $Revision: 1.4 $
 *	   $Date: 1994/05/09 21:26:39 $
 *	   $Author: Armin_Vogt $
 *
 ******************************************************************************/


volatile static char rcs_id[] = "$Id: Canvas_test.cxx,v 1.4 1994/05/09 21:26:39 Armin_Vogt Exp Armin_Vogt $";


//**  This demo can use ITransponders as alternative to the Constraints.
//**  To compile with ITransponders define USE_ITP.



extern "C" {
#include <dos/dos.h>
}

#include <APlusPlus/exec/SignalResponder.h>
#include <APlusPlus/intuition/GWindow.h>
#include <APlusPlus/intuition/GT_Gadgets/GT_Scroller.h>
#include <APlusPlus/intuition/BoopsiGadget.h>
#include <APlusPlus/graphics/Canvas.h>


//------- use ITransponders instead of Constraints --------
//#define USE_ITP 


BOOL running = TRUE;
BOOL close2 = FALSE;

class MySRSP : public SignalResponder
{
   public:
      MySRSP(BYTE signal) : SignalResponder(signal,0) {}
      ~MySRSP() {}
      // overload the virtual 'signal received' action callback method.
      void actionCallback()
      {
         cout << "**Break\n";
         running = FALSE;
      }
};
class MyCanvas : public Canvas
{
   public:
      MyCanvas(GOB_OWNER,AttrList& attrs) : Canvas(gob_owner,attrs) { }
      ~MyCanvas() {}
        
      void drawSelf()
      {
         setAPen(1);
         move(10,10);
         text((UBYTE*)"Hey, this is a canvas demo.");
         move(10,30);
         for (XYVAL x=30;x<900;x+=30)
            {
               move(10+x,30+x/6); 
               draw(x,200);
               setAPen(1);
            }
         move(30,900);
         text((UBYTE*)"You're still there! Move up..");
         
      }
		void callback(const IntuiMessageC *imsg)
		{
			cout << "Canvas: mouse action!\n";
		}
};

class MyWindow : public GWindow
{
   private:
      void init();

   public:
      MyWindow(OWNER,AttrList& attrs) : GWindow(owner,attrs) { init(); }
      
      void On_CLOSEWINDOW(const IntuiMessageC *msg)
      {
         cout << "CLOSEWINDOW.\n";
         delete this;
         running = FALSE;
      }
      void On_ACTIVEWINDOW(const IntuiMessageC *msg)
      {
         cout << title() << " is ACTIVE.\n";
      }
      void On_SIZEVERIFY(const IntuiMessageC *msg)
      {
         cout << "SIZEVERIFY. \n";
      }
      virtual void handleIntuiMsg(const IntuiMessageC* imsg)
      {
         switch (imsg->getClass())
         {
            case CLASS_CLOSEWINDOW :
               On_CLOSEWINDOW(imsg); break;
            case CLASS_ACTIVEWINDOW :
               On_ACTIVEWINDOW(imsg); break;
            case CLASS_SIZEVERIFY :
               On_SIZEVERIFY(imsg); break;
         }
         GWindow::handleIntuiMsg(imsg);
      }
};

void MyWindow::init()
{
   modifyIDCMP(CLASS_NEWSIZE|CLASS_CLOSEWINDOW|CLASS_ACTIVEWINDOW|CLASS_SIZEVERIFY \
	|CLASS_GADGETDOWN|CLASS_GADGETUP|CLASS_MOUSEMOVE);
}


void APPmain()
{
   MySRSP sr(SIGBREAKB_CTRL_C);
	BevelBox bevelBoxBorder;
	LineBorder lineBorder;
	
   MyWindow *little = new MyWindow(OWNER_NULL,
   AttrList(	WA_Title,"WindowC - close this to stop.",
      WA_Width,300,
      WA_Height,150,
		WA_MinWidth,200,
      WA_MinHeight,100,
      WA_MaxHeight,600,
      WA_MaxWidth,600,
      WA_DragBar,TRUE,
      WA_SizeGadget,TRUE,
      WA_DepthGadget,TRUE,
      WA_CloseGadget,TRUE,
      WA_IDCMP,IDCMP_CLOSEWINDOW,
		WA_SmartRefresh,TRUE,
	//	GOB_BorderObj(&lineBorder),
      TAG_END) );

#ifdef USE_ITP
   MapITP PGA2Canvas(NULL, AttrList(PGA_Top,CNV_ViewY,TAG_END) ),
			 GTSC2Canvas(NULL, AttrList(GTSC_Top,CNV_ViewX,TAG_END) );
		
	/* special ITransponder	with the ability to serve two receiver objects. */
   class C2S : public ITransponder
	{
			IntuiObject *receiver2;

		  	void sendNotification(AttrList& attrs)
			{
				_dout("C2S::sendNotification received n.s. = "<<attrs<<"\n");
												
				attrs.mapAttrs(CNV_Width,GTSC_Total, CNV_VisibleX,GTSC_Visible, CNV_ViewX,GTSC_Top,
				   				CNV_Height,PGA_Total, CNV_VisibleY,PGA_Visible,  CNV_ViewY,PGA_Top,
									TAG_END);
				_dout("C2S: map to: "<<attrs<<endl);
				// each receivers gets his own attrs it can work on
				if (OK(receiver1))	receiver1->setAttributes(AttrList(attrs)); 
				if (OK(receiver2))	receiver2->setAttributes(attrs);
		   }
		public:
				C2S(IntuiObject *rcv1=NULL,IntuiObject *rcv2=NULL)
				{
					setReceivers(rcv1,rcv2);
				}
				void setReceivers(IntuiObject *rcv1,IntuiObject *rcv2)
				{
					receiver1 = rcv1; receiver2 = rcv2;
				}

	};					 									
	
	C2S canvas2Scrollbars;
#endif
	
	MyCanvas *canvas = new MyCanvas(little, 
	AttrList(  GOB_LeftFromLeftOfParent,0,
      GOB_TopFromTopOfParent,0,
      GOB_RightFromRightOfParent,-18,
      GOB_BottomFromBottomOfParent,-18,
		GOB_BorderObj(&bevelBoxBorder),
      CNV_Width,100,
      CNV_Height,1000,
		CNV_GranularityX,5,
		CNV_ViewX,1,
#ifdef USE_ITP		
		ITRANSPONDER(&canvas2Scrollbars),
#endif
      TAG_END) );

#ifdef USE_ITP		
	PGA2Canvas.setReceiver(canvas);
   GTSC2Canvas.setReceiver(canvas);        
#endif
	
	BoopsiGadget *boopsiG = new BoopsiGadget(little,  
      (UBYTE*)"propgclass",
	AttrList(	GOB_LeftFromRightOfPred,2,
      GOB_TopFromTopOfParent,0,
      GOB_RightFromRightOfParent,0,
      GOB_BottomFromBottomOfPred,0,
		GOB_BorderObj(&bevelBoxBorder),
      GA_Immediate,TRUE,
      GA_RelVerify,TRUE,
      PGA_Freedom,FREEVERT,
		ICA_TARGET,ICTARGET_IDCMP,
      PGA_NewLook,TRUE,
#ifdef USE_ITP
		PGA_Top,0,
		PGA_Visible,0,
		PGA_Total,0,
		ITRANSPONDER(&PGA2Canvas),
#else
		CONSTRAINT(PGA_Top,canvas,CNV_ViewY),
		CONSTRAINT(PGA_Visible,canvas,CNV_VisibleY),
		CONSTRAINT(PGA_Total,canvas,CNV_Height),
#endif		
      TAG_END) );
   
	GT_Scroller *gtscG = new GT_Scroller(little,  
	AttrList(	GOB_LeftFromLeftOfParent,0,
      GOB_TopFromBottomOfPred,2,
      GOB_RightFromLeftOfPred,0,
      GOB_BottomFromBottomOfParent,0,
//		GOB_BorderObj(&bevelBoxBorder),
      GA_Immediate,TRUE,
      GA_RelVerify,TRUE,
      PGA_Freedom,LORIENT_HORIZ,
		GTSC_Arrows,16,
#ifdef USE_ITP		
		GTSC_Top,0,
		GTSC_Visible,0,
		GTSC_Total,0,
		ITRANSPONDER(&GTSC2Canvas),
#else
		CONSTRAINT(GTSC_Top,canvas,CNV_ViewX),
		CONSTRAINT(GTSC_Visible,canvas,CNV_VisibleX),
		CONSTRAINT(GTSC_Total,canvas,CNV_Width),
#endif						
      TAG_END) );
   
#ifdef USE_ITP
	canvas2Scrollbars.setReceivers(boopsiG,gtscG);
#else
	canvas->setAttributes( AttrList(
		CONSTRAINT(CNV_ViewX,gtscG,GTSC_Top),
		CONSTRAINT(CNV_ViewY,boopsiG,PGA_Top),
		TAG_END) );
#endif
		
	little->refreshGList(); 	// display the gadgets
		
   while (running)
   {
      SignalResponder::WaitSignal();
   }

   cout << "main() end.\n";
}
