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


extern "C" {
#include <dos/dos.h>
}
#include <APlusPlus/exec/SignalResponder.h>
#include <APlusPlus/intuition/GWindow.h>
#include <APlusPlus/graphics/AutoDrawArea.h>


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


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 MyAutoDrawArea : public AutoDrawArea
{
   public:
      MyAutoDrawArea(GraphicObject *owner,AttrList& attrs) : AutoDrawArea(owner,attrs) { }
      ~MyAutoDrawArea() {}
        
      void drawSelf()
      {
			setDrMd(JAM2);
			setDrPt(~0);
         setAPen(2);
         setOPen(3);
         rectFill(0,0,iWidth()-1,iHeight()-1);
         setAPen(3);
         drawEllipse(iWidth()/2,iHeight()/2,iWidth()/2,iHeight()/2);
			setAPen(1);
			WORD polyTable[] = {10,10,40,10,40,40,10,40,10,10};
			polyDraw(5,polyTable);
      }
};

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


void APPmain()
{
   MySRSP sr(SIGBREAKB_CTRL_C);

	
	NeXTBorder lineBorder;


   MyWindow *little = new MyWindow(OWNER_NULL,
   AttrList( WA_Title,"WindowC - close this to stop.",
		WA_Left,300,
		WA_Top,200,
      WA_Width,300,
      WA_Height,150,
      WA_MinHeight,100,
		WA_MinWidth,200,
      WA_MaxHeight,1600,
      WA_MaxWidth,1600,
      WA_DragBar,TRUE,
      WA_SizeGadget,TRUE,
      WA_DepthGadget,TRUE,
      WA_CloseGadget,TRUE,
      WA_IDCMP,IDCMP_CLOSEWINDOW,
		GOB_BorderObj(&lineBorder),
		GOB_BorderTitle, (UBYTE*)" AutoDrawArea ",
		GOB_BackgroundColor, 4,
      TAG_END) );

   new MyAutoDrawArea(little,
   AttrList( GOB_LeftFromLeftOfParent,0,
             GOB_TopFromTopOfParent,0,
             GOB_RightFromRightOfParent,0,
             GOB_BottomFromBottomOfParent,0,
             TAG_END) );
      
   new MyAutoDrawArea(little,
   AttrList( GOB_LeftFromRightOfParent,-50,
             GOB_TopFromTopOfParent,10,
             GOB_RightFromRightOfParent,-10,
             GOB_BottomFromBottomOfParent,-1,
             GOB_BorderObj(&lineBorder),
             TAG_END) );
	
	new MyAutoDrawArea(little,
   AttrList( GOB_LeftFromLeftOfPred,-50,
             GOB_TopFromTopOfParent,10,
             GOB_RightFromLeftOfPred,-1,
             GOB_BottomFromBottomOfParent,-2,
             GOB_BorderObj(&lineBorder),
             TAG_END) );

	little->refreshGList();		// display objects
	   
   while (running)
   {
      SignalResponder::WaitSignal();
   }

   cout << "cleaned up. goodbye.\n";
}
