home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 3 / CDPDIII.bin / pd / programming / c / intuitionpp / ipp / msgwindow.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-05  |  6.3 KB  |  352 lines

  1. ///////////////////////////////////////////////////////////////////////////////
  2. ///////////////////////////////////////////////////////////////////////////////
  3. ///////////////////                                        ////////////////////
  4. ///////////////////           file : msgwindow.cc          ////////////////////
  5. ///////////////////                                        ////////////////////
  6. ///////////////////////////////////////////////////////////////////////////////
  7. ///////////////////////////////////////////////////////////////////////////////
  8.  
  9.  
  10. #include <intuition/intuitionbase.h>
  11. #include <graphics/gfxbase.h>
  12. #include <graphics/gfxmacros.h>
  13. #include <exec/ports.h>
  14. #include <clib/graphics_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <clib/exec_protos.h>
  17.  
  18.  
  19. //extern "C" struct IntuiMessage *WaitPort();
  20. //extern "C" struct IntuiMessage *GetMsg();
  21. //extern "C" void ReplyMsg();
  22.  
  23.  
  24. #include "msgwindow.h"
  25.  
  26.  
  27. MsgWindow :: MsgWindow()
  28. {
  29.     menu=NULL;
  30.     events=NULL;
  31. }
  32.  
  33.  
  34. MsgWindow :: MsgWindow(struct NewWindow *neww) : CWindow(neww)
  35. {
  36.     menu=NULL;
  37.     events=NULL;
  38. }
  39.  
  40.  
  41. MsgWindow :: MsgWindow(struct ExtNewWindow *neww) : CWindow(neww)
  42. {
  43.     menu=NULL;
  44.     events=NULL;
  45. }
  46.  
  47.  
  48. MsgWindow :: MsgWindow(struct NewWindow *neww, struct TagItem *tags) : CWindow(neww, tags)
  49. {
  50.     menu=NULL;
  51.     events=NULL;
  52. }
  53.  
  54.  
  55. MsgWindow :: ~MsgWindow()
  56. {
  57.     if (wind) ClearMenuStrip(wind);
  58.     rmIevents();
  59.     clearImsg();
  60. }
  61.  
  62.  
  63. BOOL MsgWindow :: open()
  64. {
  65.     CWindow::open();
  66.     if (menu && wind) SetMenuStrip(wind,menu);
  67.     return isopen();
  68. }
  69.  
  70.  
  71. void MsgWindow :: close()
  72. {
  73.     if (wind) ClearMenuStrip(wind);
  74.     CWindow::close();
  75. }
  76.  
  77.  
  78. void MsgWindow :: update()
  79. {
  80.     CWindow::update();
  81.     if (menu && wind) SetMenuStrip(wind,menu);
  82. }
  83.  
  84.  
  85. ULONG MsgWindow :: setIDCMPflags(ULONG flags)
  86. {
  87.     ULONG oldf=newwind->IDCMPFlags;
  88.     newwind->IDCMPFlags=flags;
  89.     if (wind) ModifyIDCMP(wind,flags);
  90.     return oldf;
  91.  
  92. }
  93.  
  94.  
  95. ULONG MsgWindow :: getIDCMPflags()
  96. {
  97.     return newwind->IDCMPFlags;
  98. }
  99.  
  100.  
  101. struct Gadget * MsgWindow :: linkgadgets(struct Gadget *newg)
  102. {
  103. struct Gadget *oldg;
  104.     oldg=newwind->FirstGadget;
  105.     newwind->FirstGadget=newg;
  106.     update();
  107.     return oldg;
  108. }
  109.  
  110.  
  111. struct Gadget * MsgWindow :: rmgadgets()
  112. {
  113. struct Gadget *oldg;
  114.     oldg=newwind->FirstGadget;
  115.     newwind->FirstGadget=NULL;
  116.     update();
  117.     return oldg;
  118. }
  119.  
  120.  
  121. void MsgWindow :: refreshgadgets(struct Gadget *gads)
  122. {
  123.     if (!isopen()) return;
  124.     RefreshGadgets(gads,wind,NULL);
  125. }
  126.  
  127.  
  128. void MsgWindow :: refreshglist(struct Gadget *gads, WORD num)
  129. {
  130.     if (!isopen()) return;
  131.     RefreshGList(gads,wind,NULL,num);
  132. }
  133.  
  134.  
  135. BOOL MsgWindow :: activategadget(struct Gadget *gad)
  136. {
  137.     if (!isopen()) return FALSE;
  138.     return ActivateGadget(gad, wind, NULL);
  139. }
  140.  
  141.  
  142. void MsgWindow :: ongadget(struct Gadget *gad)
  143. {
  144.     if (!isopen()) return;
  145.     OnGadget(gad, wind, NULL);
  146. }
  147.  
  148.  
  149. void MsgWindow :: offgadget(struct Gadget *gad)
  150. {
  151.     if (!isopen()) return;
  152.     OffGadget(gad, wind, NULL);
  153. }
  154.  
  155.  
  156. struct Menu * MsgWindow :: linkmenu(struct Menu *newm)
  157. {
  158. struct Menu *oldm;
  159.     oldm=menu;
  160.     menu=newm;
  161.     update();
  162.     return oldm;
  163. }
  164.  
  165.  
  166. struct Menu * MsgWindow :: rmmenu()
  167. {
  168. struct Menu *oldm;
  169.     oldm=menu;
  170.     menu=NULL;
  171.     update();
  172.     return oldm;
  173. }
  174.  
  175.  
  176. void MsgWindow :: onmenu(UWORD num)
  177. {
  178.     if (!isopen()) return;
  179.     OnMenu(wind, num);
  180. }
  181.  
  182.  
  183. void MsgWindow :: offmenu(UWORD num)
  184. {
  185.     if (!isopen()) return;
  186.     OffMenu(wind, num);
  187. }
  188.  
  189.  
  190. void MsgWindow :: reportmouse(BOOL ok)
  191. {
  192.     ReportMouse(ok,wind);
  193. }
  194.  
  195.  
  196. IMessage * MsgWindow :: readImsg(struct IntuiMessage *mess ,IMessage& imessage)
  197. {
  198.     if (mess)
  199.     {
  200.         imessage.iclass=mess->Class;
  201.         imessage.icode=mess->Code;
  202.         imessage.iqualifier=mess->Qualifier;
  203.         imessage.iaddress=(void *)mess->IAddress;
  204.         imessage.imousex=mess->MouseX;
  205.         imessage.imousey=mess->MouseY;
  206.         imessage.iseconds=mess->Seconds;
  207.         imessage.imicros=mess->Micros;
  208.         ReplyMsg((struct Message *)mess);
  209.     }
  210.     else imessage.clear();
  211.     return &imessage;
  212. }
  213.  
  214.  
  215. IMessage * MsgWindow :: getImsg(IMessage& imessage)
  216. {
  217.     if (!isopen()) return NULL;
  218.     return (IMessage *)readImsg((struct IntuiMessage *)GetMsg(wind->UserPort),imessage);
  219. }
  220.  
  221.  
  222. IMessage * MsgWindow :: waitImsg(IMessage& imessage)
  223. {
  224.     if (!isopen()) return NULL;
  225.     WaitPort(wind->UserPort);
  226.     return (IMessage *)readImsg((struct IntuiMessage *)GetMsg(wind->UserPort),imessage);
  227. }
  228.  
  229.  
  230. void MsgWindow :: clearImsg()
  231. {
  232. IMessage *mess;
  233.     if (!isopen()) return;
  234.     while (mess=(IMessage *)GetMsg(wind->UserPort)) ReplyMsg((struct Message *)mess);
  235. }
  236.  
  237.  
  238. BOOL MsgWindow :: linkIevent(    ULONG niclass,
  239.                 ULONG nicode,
  240.                 ULONG niqualifier,
  241.                 void *nitem,
  242.                 void (*ncallback)(IMessage&))
  243. {
  244. IEvent *event;
  245.     if (niclass==NOMESSAGE) return FALSE;
  246.     if (ncallback==NULL) return FALSE;
  247.     event = new IEvent;
  248.     event->eclass=niclass;
  249.     event->ecode=nicode;
  250.     event->equalifier=niqualifier;
  251.     event->eitem=nitem;
  252.     event->ecallback=(void (*)(IMessage *))ncallback;
  253.     event->nextevent=events;
  254.     events=event;
  255.     return TRUE;
  256. }
  257.  
  258. void MsgWindow :: rmIevents()
  259. {
  260. IEvent *event;
  261.     if (events==NULL) return;
  262.     while (events)
  263.     {
  264.         event=events->nextevent;
  265.         delete events;
  266.         events=event;
  267.     }
  268. }
  269.  
  270.  
  271. IMessage * MsgWindow :: filterImsg(IMessage &imessage)
  272. {
  273. IEvent *event;
  274.     if (events==NULL) return NULL;
  275.     if (imessage.iclass==NOMESSAGE) return &imessage;
  276.     for (event=events;event;event=event->nextevent)
  277.     {
  278.         if (imessage.iclass!=event->eclass) continue;
  279.         switch(imessage.iclass)
  280.         {
  281.             case GADGETUP:
  282.             case GADGETDOWN:
  283.                 if (imessage.iaddress==event->eitem)
  284.                 {
  285.                     event->ecallback(&imessage);
  286.                     return NULL;
  287.                 }
  288.                 else continue;
  289.                 break;
  290.  
  291.             case MENUPICK:
  292.                 if (event->eitem==(char *)ItemAddress(menu,imessage.icode))
  293.                 {
  294.                     event->ecallback(&imessage);
  295.                     return NULL;
  296.                 }
  297.                 else continue;
  298.                 break;
  299.  
  300.             case RAWKEY:
  301.             case VANILLAKEY:
  302.             case MOUSEBUTTONS:
  303.                 if (imessage.icode==event->ecode)
  304.                 {
  305.                     if (event->equalifier==0)
  306.                     {
  307.                         event->ecallback(&imessage);
  308.                         return NULL;
  309.                     }
  310.                     else
  311.                     {
  312.                         if (imessage.iqualifier & event->equalifier)
  313.                         {
  314.                             event->ecallback(&imessage);
  315.                             return NULL;
  316.                         }
  317.                         else continue;
  318.                     }
  319.                 }
  320.                 else continue;
  321.                 break;
  322.  
  323.             default:
  324.                 event->ecallback(&imessage);
  325.                 return NULL;
  326.         }
  327.     }
  328.     return &imessage;
  329. }
  330.  
  331.  
  332. IMessage * MsgWindow :: softcontrol(IMessage& imessage)
  333. {
  334.     if (!isopen()) return NULL;
  335.     for (;;)
  336.     {
  337.         imessage.clear();
  338.         waitImsg(imessage);
  339.         if (filterImsg(imessage)) return &imessage;
  340.     }
  341. }
  342.  
  343.  
  344. void MsgWindow :: hardcontrol()
  345. {
  346. IMessage imessage;
  347.     if (!isopen()) return;
  348.     for (;;) imessage.clear(), waitImsg(imessage), filterImsg(imessage);
  349. }
  350.  
  351.  
  352.