home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / aplusplus-1.01-src.lha / GNU / src / amiga / APlusPlus-1.01 / libsource / GWindow.cxx < prev    next >
C/C++ Source or Header  |  1994-05-07  |  9KB  |  252 lines

  1. /******************************************************************************
  2.  **
  3.  **    C++ Class Library for the Amiga© system software.
  4.  **
  5.  **    Copyright (C) 1994 by Armin Vogt  **  EMail: armin@uni-paderborn.de
  6.  **    All Rights Reserved.
  7.  **
  8.  **    $Source: apphome:APlusPlus/RCS/libsource/GWindow.cxx,v $
  9.  **    $Revision: 1.6 $
  10.  **    $Date: 1994/05/07 12:55:51 $
  11.  **    $Author: Armin_Vogt $
  12.  **
  13.  ******************************************************************************/
  14.  
  15.  
  16. extern "C" {
  17. #ifdef __GNUG__
  18. #include <inline/intuition.h>
  19. #include <inline/gadtools.h>
  20. #endif
  21.  
  22. #ifdef __SASC
  23. #include <proto/intuition.h>
  24. #include <proto/gadtools.h>
  25. #endif
  26. }
  27. #include <APlusPlus/intuition/GWindow.h>
  28.  
  29.  
  30. volatile static char rcs_id[] = "$Id: GWindow.cxx,v 1.6 1994/05/07 12:55:51 Armin_Vogt Exp Armin_Vogt $";
  31.  
  32.  
  33. /*************************************************************************************************
  34.       GWindow methods
  35.  *************************************************************************************************/
  36. #include <graphics/GfxBase.h>
  37. extern struct GfxBase *GfxBase;
  38. GWindow::GWindow(IntuiObject *owner,AttrList& attrs) 
  39.     : WindowCV(owner,attrs), DrawArea(this), 
  40.       screenFont(windowPtr()->WScreen->Font), defaultFont(GfxBase->DefaultFont)
  41. {
  42.    if (!Ok()) return;   // WindowCV creation failed
  43.    
  44.     setIOType(IOTYPE_GWINDOW);
  45.  
  46.    activeGadget = defaultGadget = NULL;
  47.    firstUserGad = GT_context = GT_last = NULL;
  48.     modifyIDCMP(CLASS_GADGETDOWN|CLASS_GADGETUP|CLASS_NEWSIZE|CLASS_CLOSEWINDOW
  49.         |CLASS_SIZEVERIFY//|CLASS_REFRESHWINDOW
  50.         |CLASS_IDCMPUPDATE|CLASS_MOUSEMOVE);
  51.    _dout("GWindow:create() done.\n");
  52. }
  53.  
  54. GWindow::~GWindow()
  55. {
  56.     RemoveGList(window(),firstUserGad,-1);  // remove the entire user gadget list from the window   
  57.     
  58.    FreeGadgets(GT_context);        // free GadTools gadgets
  59.    _dout("~GWindow\n");
  60. }
  61.  
  62. void GWindow::handleIntuiMsg(const IntuiMessageC* imsg)
  63. {
  64.    _dout(BUGOUT);
  65.    switch (imsg->getClass())
  66.    {
  67.       case CLASS_GADGETDOWN :
  68.          GWindow::On_GADGETDOWN(imsg);
  69.          break;
  70.       case CLASS_GADGETUP :
  71.          GWindow::On_GADGETUP(imsg);
  72.          break;
  73.         case CLASS_SIZEVERIFY:
  74.             GWindow::On_SIZEVERIFY(imsg);
  75.             break;
  76.       case CLASS_NEWSIZE :
  77.          GWindow::On_NEWSIZE(imsg);
  78.          break;
  79.       case CLASS_REFRESHWINDOW :
  80.          GWindow::On_REFRESHWINDOW(imsg);
  81.          break;
  82.       default :
  83.          GWindow::default_IMsgCallback(imsg);
  84.          break;
  85.    }
  86. }
  87.  
  88. void GWindow::On_GADGETDOWN(const IntuiMessageC *imsg)
  89.    /* Is invoked on every GADGTEDOWN message from the window's IDCMP.
  90.       GADGETDOWN is ALWAYS triggered by a gadget and can be classed with one definite
  91.       GadgetCV-derived object.
  92.    */
  93. {
  94.    GadgetCV *gadObj;
  95.    if (NULL != (gadObj = imsg->decodeGadgetCV()))
  96.    {
  97.       if (activeGadget && activeGadget != gadObj)    // Active Gadget changes
  98.       {
  99.            defaultGadget = activeGadget;        // default gadget will become active after active has resigned
  100.          IntuiMessageC tmp(CLASS_GADGETUP);
  101.          defaultGadget->callback(&tmp);
  102.       }
  103.       activeGadget = gadObj;                // become last active gadget
  104.       _dout("active gadget status="<<gadObj->status()<<endl);
  105.       gadObj->callback(imsg);                // deliver message to the gadget
  106.    }
  107. }
  108.  
  109. void GWindow::On_GADGETUP(const IntuiMessageC *imsg)
  110.    /* Is invoked on every GADGETUP message from the window's IDCMP.
  111.       GADGETUP is ALWAYS triggered by a gadget and can be classed with one definite
  112.       GadgetCV-derived object.
  113.    */
  114. {
  115.    GadgetCV *gadObj;
  116.    if (NULL != (gadObj = imsg->decodeGadgetCV()))
  117.    {
  118.       activeGadget = defaultGadget;    // previously active gadget becomes active again
  119.       gadObj->callback(imsg);                // 'gadObj' may force staying the active gadget here
  120.         if (activeGadget)
  121.          if (gadObj != activeGadget)        // if active switched to default tell default about it with GADGETDOWN
  122.            {
  123.                IntuiMessageC tmp(CLASS_GADGETDOWN);
  124.                activeGadget->callback(&tmp);
  125.            }
  126.          else defaultGadget = NULL;
  127.    }
  128. }
  129.  
  130. void GWindow::setActiveGadget(GadgetCV *newActive) 
  131.    activeGadget = newActive; 
  132. }
  133.  
  134. void GWindow::default_IMsgCallback(const IntuiMessageC *imsg)
  135.    /* overload the default IMsg handler that is called on every IMsg class that has no
  136.       callback entry in the handleIntuiMsg() methdod. All messages but GADGETUP,GADGETDOWN run
  137.       towards the active gadget. If there is no gadget active, the default will be used.
  138.       If there is no default, nothing will happen, the message will be replied unheard.
  139.    */
  140. {
  141.    _dout("default_IMsgCallback()..\n");
  142.  
  143.    GadgetCV *gadObj;
  144.  
  145.    // try to get the sending object: this is only possible with GadTools gadgets.
  146.    if (NULL != (gadObj = imsg->decodeGadgetCV()))
  147.    {
  148.       activeGadget = gadObj;
  149.       gadObj->callback(imsg);
  150.    }    
  151.    else    // ATTENTION! : active or default gadget may have been deleted
  152.        if (APPOK(activeGadget)) activeGadget->callback(imsg);
  153.           else { activeGadget = NULL; if (APPOK(defaultGadget)) defaultGadget->callback(imsg);
  154.                 else defaultGadget = NULL; }
  155. }
  156.  
  157. void GWindow::On_SIZEVERIFY(const IntuiMessageC *imsg)
  158. {
  159.     _dout("GWindow::On_SIZEVERIFY\n");
  160.     RemoveGList(window(),firstUserGad,-1);  // remove the entire user gadget list from the window   
  161.     firstUserGad = NULL;
  162.     // removing all gadgets here prevents them from being refreshed after window resizing.
  163. }
  164.  
  165. void GWindow::On_NEWSIZE(const IntuiMessageC *imsg)
  166.    /* Build up the window display: collect all gadgets from childs and 'send' redrawSelf
  167.         messages to them after having them resized.
  168.    */
  169. {
  170.    WindowCV::newsize(imsg);
  171.     _dout(BUGOUT);
  172.     RemoveGList(window(),firstUserGad,-1);  // remove the entire user gadget list from the window   
  173.     firstUserGad = NULL;          // pointer to the begin of the list of user defined gadgets
  174.         
  175.     setAPen(0);setOPen(0);setDrMd(JAM2);
  176.     clearRegion();
  177.     orRectRegion(-leftB(),-topB(),iWidth()+rightB()-1,iHeight()+bottomB()-1);// set clipping to inner window box
  178.     setStdClip();
  179.     rectFill(-leftB(),-topB(),iWidth()+rightB()-1,iHeight()+bottomB()-1);    // clear the inner window box
  180.         
  181.     struct Gadget *old_GT_context = GT_context;     
  182.     // save old context (with all GadTools gadgets) for later freeing
  183.  
  184.    if (!CreateContext(>_context)) { _ierror(OUT_OF_MEMORY); return; }
  185.  
  186.    GT_last = GT_context;   // initialise the list of GadTools gadgets.
  187.  
  188.    _dout("adjust child..\n");
  189.    adjustChilds();
  190.    _dout("done\n");
  191.  
  192.    IOBrowser iobjs(this);
  193.  
  194.    struct Gadget *gadgets;
  195.    GraphicObject *gob;
  196.    ULONG type;    // reference argument for redrawSelf gets the return type of redrawSelf.
  197.     GadgetCV::redrawSelfHomeWindow = this;
  198.     GraphicObject::redrawSelf(this,type);    // redraw the window i.e. draw border
  199.     
  200.     adjustStdClip();    // confine clipping to inner GraphicObject dimensions
  201.  
  202.    while (NULL != (gob = (GraphicObject*)iobjs.getNext(IOBASE_GADGET)))
  203.    {
  204.       _dout("got one graphic object.\n");
  205.  
  206.       if (NULL != (gadgets = (struct Gadget*)gob->redrawSelf(this,type)))
  207.          if (type == IOTYPE_GTGADGET) // GT gadgets are linked seperately.
  208.          {
  209.             /** GadTools gadgets are a linked list of gadgets,
  210.              ** the last gadget is returned by CreateGadget() and subsequently by redrawSelf().
  211.              **/
  212.             GT_last = gadgets;      // trace the end of the GadTools gadgets list.
  213.             if (GT_last) GT_last->NextGadget = NULL;   // make it safe
  214.             _dout("GT gadget found\n");
  215.          }
  216.          else if (type == IOTYPE_BOOPSIGADGET || type == IOTYPE_STDGADGET)
  217.          {
  218.             if (firstUserGad==NULL) firstUserGad = gadgets;
  219.             if (gadgets)
  220.                AddGList(window(),gadgets,(UWORD)-1,(UWORD)-1,NULL);
  221.                // add the resized gadget(s) to the window
  222.             _dout("Non GT gadget = "<<gadgets<<"found\n");
  223.          }
  224.    }
  225.     GadgetCV::redrawSelfHomeWindow = NULL;
  226.     
  227.     FreeGadgets(old_GT_context);
  228.     // free all GadTools gadgets. They shall have been recreated in resizeSelf().
  229.     
  230.    // now GT_context points to the head of the separately collected GadTools gadgets.
  231.    if (!firstUserGad)
  232.       firstUserGad = GT_context; // no other than GadTools gadgets created.
  233.     
  234.     AddGList(window(),GT_context,(UWORD)-1,(UWORD)-1,NULL); // append GadTools ga