home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / OTL-MC7.DMS / in.adf / classsource.lha / ClassSource / Intuition / Gadgets / Gadgets.c
Encoding:
C/C++ Source or Header  |  1995-02-12  |  10.4 KB  |  545 lines

  1. #include <classes/Intuition/Gadgets.h>
  2.  
  3. #include <exec/libraries.h>
  4.  
  5. #pragma -
  6. #include <pragma/graphics_lib.h>
  7. #include <pragma/commodities_lib.h>
  8. #pragma +
  9.  
  10. GadgetC::GadgetC(GadgetEventC *event)
  11. {
  12.     gevent = event;
  13.     gadget_ob = NULL;
  14. }
  15.  
  16. GadgetC::~GadgetC()
  17. {
  18. }
  19.  
  20. VOID GadgetC::erase(WindowC *w)
  21. {
  22.     if (gadget_ob && w)
  23.     {
  24.         if (w->rastPort())
  25.             EraseRect(w->rastPort(),
  26.                 gadget_ob->LeftEdge,
  27.                 gadget_ob->TopEdge,
  28.                 gadget_ob->LeftEdge + gadget_ob->Width,
  29.                 gadget_ob->TopEdge + gadget_ob->Height);
  30.     };
  31. }
  32.  
  33. VOID GadgetC::refresh(WindowC *w)
  34. {
  35.     if (gadget_ob && w)
  36.     {
  37.         w->refreshGadgets(gadget_ob,1);
  38.     };
  39. }
  40.  
  41. // ********************************************************
  42.  
  43. BOOL GModelC::snapshot(GModelSnapshotC &s)
  44. {
  45.     s.setDisabled(isDisabled());
  46.     return TRUE;
  47. }
  48.  
  49. BOOL GModelC::stamp(GModelSnapshotC &s)
  50. {
  51.     disable(s.isDisabled());
  52.     return TRUE;
  53. }
  54.  
  55. // ********************************************************
  56.  
  57. BOOL GStringC::snapshot(GStringSnapshotC &s)
  58. {
  59.     s.setString(get());
  60.     return GModelC::snapshot(s);
  61. }
  62.  
  63. BOOL GStringC::stamp(GStringSnapshotC &s)
  64. {
  65.     set(s.string());
  66.     return GModelC::stamp(s);
  67. }
  68.  
  69. // ********************************************************
  70.  
  71. BOOL GIntegerC::snapshot(GIntegerSnapshotC &s)
  72. {
  73.     s.setInteger(get());
  74.     return GModelC::snapshot(s);
  75. }
  76.  
  77. BOOL GIntegerC::stamp(GIntegerSnapshotC &s)
  78. {
  79.     set(s.integer());
  80.     return GModelC::stamp(s);
  81. }
  82.  
  83. // ********************************************************
  84.  
  85. BOOL GCheckboxC::snapshot(GCheckboxSnapshotC &s)
  86. {
  87.     s.setCheck(checked());
  88.     return GModelC::snapshot(s);
  89. }
  90.  
  91. BOOL GCheckboxC::stamp(GCheckboxSnapshotC &s)
  92. {
  93.     check(s.checked());
  94.     return GModelC::stamp(s);
  95. }
  96.  
  97. // ********************************************************
  98.  
  99. BOOL GRadioC::snapshot(GRadioSnapshotC &s)
  100. {
  101.     s.setSelection(selected());
  102.     return GModelC::snapshot(s);
  103. }
  104.  
  105. BOOL GRadioC::stamp(GRadioSnapshotC &s)
  106. {
  107.     select(s.selected());
  108.     return GModelC::stamp(s);
  109. }
  110.  
  111. // ********************************************************
  112.  
  113. BOOL GCycleC::snapshot(GCycleSnapshotC &s)
  114. {
  115.     s.setSelection(selected());
  116.     return GModelC::snapshot(s);
  117. }
  118.  
  119. BOOL GCycleC::stamp(GCycleSnapshotC &s)
  120. {
  121.     select(s.selected());
  122.     return GModelC::stamp(s);
  123. }
  124.  
  125. // ********************************************************
  126.  
  127. BOOL GSliderC::snapshot(GSliderSnapshotC &s)
  128. {
  129.     s.setMax(max());
  130.     s.setMin(min());
  131.     s.setLevel(level());
  132.     return GModelC::snapshot(s);
  133. }
  134.  
  135. BOOL GSliderC::stamp(GSliderSnapshotC &s)
  136. {
  137.     setMax(s.max());
  138.     setMin(s.min());
  139.     setLevel(s.level());
  140.     return GModelC::stamp(s);
  141. }
  142.  
  143. // ********************************************************
  144.  
  145. BOOL GScrollerC::snapshot(GScrollerSnapshotC &s)
  146. {
  147.     s.setPot(pot());
  148.     s.setTotal(total());
  149.     s.setVisible(visible());
  150.     return GModelC::snapshot(s);
  151. }
  152.  
  153. BOOL GScrollerC::stamp(GScrollerSnapshotC &s)
  154. {
  155.     setPot(s.pot());
  156.     setTotal(s.total());
  157.     setVisible(s.visible());
  158.     return GModelC::stamp(s);
  159. }
  160.  
  161. // ********************************************************
  162.  
  163. BOOL GListviewC::snapshot(GListviewSnapshotC &s)
  164. {
  165.     s.setSelection(selected());
  166.     return GModelC::snapshot(s);
  167. }
  168.  
  169. BOOL GListviewC::stamp(GListviewSnapshotC &s)
  170. {
  171.     select(s.selected());
  172.     return GModelC::stamp(s);
  173. }
  174.  
  175. // ********************************************************
  176.  
  177. BOOL GPaletteC::snapshot(GPaletteSnapshotC &s)
  178. {
  179.     s.setSelection(selected());
  180.     return GModelC::snapshot(s);
  181. }
  182.  
  183. BOOL GPaletteC::stamp(GPaletteSnapshotC &s)
  184. {
  185.     select(s.selected());
  186.     return GModelC::stamp(s);
  187. }
  188.  
  189. // ********************************************************
  190.  
  191. BOOL GTextC::snapshot(GTextSnapshotC &s)
  192. {
  193.     s.setString(get());
  194.     return GModelC::snapshot(s);
  195. }
  196.  
  197. BOOL GTextC::stamp(GTextSnapshotC &s)
  198. {
  199.     set(s.string());
  200.     return GModelC::stamp(s);
  201. }
  202.  
  203. // ********************************************************
  204.  
  205. BOOL GNumberC::snapshot(GNumberSnapshotC &s)
  206. {
  207.     s.setInteger(get());
  208.     return GModelC::snapshot(s);
  209. }
  210.  
  211. BOOL GNumberC::stamp(GNumberSnapshotC &s)
  212. {
  213.     set(s.integer());
  214.     return GModelC::stamp(s);
  215. }
  216.  
  217. // ********************************************************
  218.  
  219. GadgetListC::GadgetListC()
  220. {
  221.     disabled = FALSE;
  222.     idcmpFlags = 0;
  223. }
  224.  
  225. GadgetListC::~GadgetListC()
  226. {
  227. }
  228.  
  229. VOID GadgetListC::add(GadgetC &g)
  230. {
  231.     idcmpFlags |= g.idcmp();
  232.     addTail(g);
  233. }
  234.  
  235. struct Gadget *GadgetListC::rebuild(struct Gadget *prev)
  236. {
  237.     ListCursorC lc(*this);
  238.     gadget_ob = NULL;
  239.     if (!prev)
  240.         return NULL;
  241.     lc.last();
  242.     while (!lc.isDone()) {
  243.         if (!(prev = ((GadgetC *) lc.item())->rebuild(prev)))
  244.         {
  245.             gadget_ob = NULL;
  246.             return NULL;
  247.         };
  248.         if (!gadget_ob)
  249.             gadget_ob = ((GadgetC *) lc.item())->gadget();
  250.         lc.prev();
  251.     };
  252.     return prev;
  253. }
  254.  
  255. VOID GadgetListC::erase(WindowC *w)
  256. {
  257.     ListCursorC lc(*this);
  258.     while (!lc.isDone()) {
  259.         ((GadgetC *) lc.item())->erase(w);
  260.         lc.next();
  261.     };
  262. }
  263.  
  264. VOID GadgetListC::refresh(WindowC *w)
  265. {
  266.     ListCursorC lc(*this);
  267.     while (!lc.isDone()) {
  268.         ((GadgetC *) lc.item())->refresh(w);
  269.         lc.next();
  270.     };
  271. }
  272.  
  273. BOOL GadgetListC::disable(BOOL value)
  274. {
  275.     disabled = value;
  276.     ListCursorC lc(*this);
  277.     while (!lc.isDone()) {
  278.         if (((GadgetC *) lc.item())->deepfollow())
  279.             ((GadgetC *) lc.item())->disable(value);
  280.         lc.next();
  281.     };
  282.     return TRUE;
  283. }
  284.  
  285. VOID GadgetListC::setTextAttr(const TextAttrC *tattr)
  286. {
  287.     ListCursorC lc(*this);
  288.     while (!lc.isDone()) {
  289.         if (((GadgetC *) lc.item())->deepfollow())
  290.             ((GadgetC *) lc.item())->setTextAttr(tattr);
  291.         lc.next();
  292.     };
  293. }
  294.  
  295. VOID GadgetListC::setDefTextAttr(const TextAttrC *tattr)
  296. {
  297.     ListCursorC lc(*this);
  298.     while (!lc.isDone()) {
  299.         if (((GadgetC *) lc.item())->deepfollow())
  300.             ((GadgetC *) lc.item())->setDefTextAttr(tattr);
  301.         lc.next();
  302.     };
  303. }
  304.  
  305. // ********************************************************
  306. AnchorGadgetListC::AnchorGadgetListC()
  307.     : GadgetListC()
  308. {
  309. }
  310.  
  311. AnchorGadgetListC::~AnchorGadgetListC()
  312. {
  313. }
  314.  
  315. // ********************************************************
  316.  
  317. RootGadgetListC::RootGadgetListC(WindowC &w)
  318. {
  319.     window = &w;
  320.     window->setGadgetList(glist);
  321. }
  322.  
  323. RootGadgetListC::~RootGadgetListC()
  324. {
  325.     window->clearGadgetList();
  326. }
  327.  
  328. VOID RootGadgetListC::add(GadgetC &g)
  329. {
  330.     glist.add(g);
  331. }
  332.  
  333. VOID RootGadgetListC::rebuild(BOOL refresh)
  334. {
  335.     window->clearGadgetList(FALSE,FALSE);
  336.     struct Gadget first;
  337.     glist.rebuild(&first);
  338.     window->addIDCMP(glist.idcmp());
  339.     window->resetGadgetList(refresh);
  340. }
  341.  
  342. VOID RootGadgetListC::erase()
  343. {
  344.     window->clearGadgetList(FALSE,FALSE);
  345.     glist.erase(window);
  346. }
  347.  
  348. VOID RootGadgetListC::refresh()
  349. {
  350.     glist.refresh(window);
  351. }
  352.  
  353. VOID RootGadgetListC::setTextAttr(const TextAttrC *tattr)
  354. {
  355.     glist.setTextAttr(tattr);
  356. }
  357.  
  358. VOID RootGadgetListC::setDefTextAttr(const TextAttrC *tattr)
  359. {
  360.     glist.setDefTextAttr(tattr);
  361. }
  362.  
  363. // *************************************************************
  364.  
  365. BOOL GadgetUpHandlerC::_handle(IntuiMessageC &msg)
  366. {
  367.     GadgetC *g = (GadgetC *) (
  368.         ((struct Gadget *) msg.IAddress)->UserData);
  369.     if (g && g->event())
  370.     {
  371.         g->event()->up((WindowC *) msg.IDCMPWindow->UserData,g,&msg);
  372.         _exit = g->event()->exit();
  373.     };
  374.     return TRUE;
  375. }
  376.  
  377. BOOL GadgetUpHandlerC::exit()
  378. {
  379.     return _exit;
  380. }
  381.  
  382. // *************************************************************
  383.  
  384. BOOL GadgetDownHandlerC::_handle(IntuiMessageC &msg)
  385. {
  386.     GadgetC *g = (GadgetC *) (
  387.         ((struct Gadget *) msg.IAddress)->UserData);
  388.     if (g && g->event())
  389.     {
  390.         g->event()->down((WindowC *) msg.IDCMPWindow->UserData,g,&msg);
  391.         _exit = g->event()->exit();
  392.     };
  393.     return TRUE;
  394. }
  395.  
  396. BOOL GadgetDownHandlerC::exit()
  397. {
  398.     return _exit;
  399. }
  400.  
  401. // *************************************************************
  402.  
  403. BOOL GadgetMoveDownHandlerC::_handle(IntuiMessageC &msg)
  404. {
  405.     handler->gadget = (struct Gadget *) msg.IAddress;
  406.     return TRUE;
  407. }
  408.  
  409. // *************************************************************
  410.  
  411. BOOL GadgetMoveUpHandlerC::_handle(IntuiMessageC &msg)
  412. {
  413.     handler->gadget = NULL;
  414.     return TRUE;
  415. }
  416.  
  417. // *************************************************************
  418.  
  419. GadgetMoveHandlerC::GadgetMoveHandlerC()
  420.     : GadgetEventHandlerC(IDCMP_MOUSEMOVE),
  421.       down_handler(*this), up_handler(*this),
  422.       _exit(FALSE)
  423. {
  424.     gadget = NULL;
  425. }
  426.  
  427. BOOL GadgetMoveHandlerC::_handle(IntuiMessageC &msg)
  428. {
  429.     if (gadget)
  430.     {
  431.         GadgetC *g = (GadgetC *) gadget->UserData;
  432.         if (g && g->event())
  433.         {
  434.             g->event()->move((WindowC *) msg.IDCMPWindow->UserData,g,&msg);
  435.             _exit = g->event()->exit();
  436.         };
  437.         return TRUE;
  438.     };
  439.     return FALSE;
  440. }
  441.  
  442. BOOL GadgetMoveHandlerC::exit()
  443. {
  444.     return _exit;
  445. }
  446.  
  447. // *************************************************************
  448.  
  449. GadgetKeyHandlerC::GadgetKeyHandlerC(WindowC &w)
  450.     : WindowEventHandlerC(w,IDCMP_RAWKEY),
  451.       keys(sizeof(struct GadgetKey),10),
  452.       _exit(FALSE)
  453. {
  454. }
  455.  
  456. BOOL GadgetKeyHandlerC::add(STRPTR key, GadgetC &g)
  457. {
  458.     IX ix;
  459.     if (ParseIX(key,&ix) == 0)
  460.     {
  461.         struct GadgetKey &k = (struct GadgetKey &) keys.addTail();
  462.         k.gadget = &g;
  463.         k.ix = ix;
  464.         return TRUE;
  465.     };
  466.     return FALSE;
  467. }
  468.  
  469. static BOOL MatchIX37(struct InputEvent *ev, struct InputXpression *ix)
  470. {
  471.     if (ev->ie_Class != ix->ix_Class)
  472.         return FALSE;
  473.     if ((ev->ie_Code & ix->ix_CodeMask) != (ix->ix_Code & ix->ix_CodeMask))
  474.         return FALSE;
  475.     UWORD qie = ev->ie_Qualifier & ix->ix_QualMask;
  476.     UWORD qix = ix->ix_Qualifier & ix->ix_QualMask;
  477.     if (ix->ix_QualSame & IXSYM_SHIFT)
  478.     {
  479.         if (qie & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT))
  480.             qie |= (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT);
  481.         if (qix & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT))
  482.             qix |= (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT);
  483.     };
  484.     if (ix->ix_QualSame & IXSYM_CAPS)
  485.     {
  486.         if (qie & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT|IEQUALIFIER_CAPSLOCK))
  487.             qie |= (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT|IEQUALIFIER_CAPSLOCK);
  488.         if (qix & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT|IEQUALIFIER_CAPSLOCK))
  489.             qix |= (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT|IEQUALIFIER_CAPSLOCK);
  490.     };
  491.     if (ix->ix_QualSame & IXSYM_ALT)
  492.     {
  493.         if (qie & (IEQUALIFIER_LALT|IEQUALIFIER_RALT))
  494.             qie |= (IEQUALIFIER_LALT|IEQUALIFIER_RALT);
  495.         if (qix & (IEQUALIFIER_LALT|IEQUALIFIER_RALT))
  496.             qix |= (IEQUALIFIER_LALT|IEQUALIFIER_RALT);
  497.     };
  498.     return qie == qix;
  499. };
  500.  
  501. BOOL GadgetKeyHandlerC::_handle(IntuiMessageC &msg)
  502. {
  503.     _exit = FALSE;
  504.     struct InputEvent ev;
  505.     ev.ie_NextEvent = NULL;
  506.     ev.ie_Class = IECLASS_RAWKEY;
  507.     ev.ie_SubClass = 0;
  508.     ev.ie_Code = msg.Code;
  509.     ev.ie_Qualifier = msg.Qualifier;
  510.     ev.ie_EventAddress = (APTR) *((ULONG *) msg.IAddress);
  511.     gen_arraycursor gac(keys);
  512.     extern struct Library *CxBase;
  513.     BOOL v37 = CxBase->lib_Version < 38;
  514.     while (!gac.isDone())
  515.     {
  516.         struct GadgetKey &k = (struct GadgetKey &) gac.item();
  517.         BOOL matched;
  518.         if (v37)
  519.             matched = MatchIX37(&ev,&k.ix)
  520.         else
  521.             matched = MatchIX(&ev,&k.ix);
  522.         if (matched)
  523.         {
  524.             if (k.gadget && k.gadget->event())
  525.             {
  526.                 if (msg.Code & 0x80)
  527.                 {
  528.                     k.gadget->event()->keyUp(window(),k.gadget,&msg);
  529.                 }
  530.                 else {
  531.                     k.gadget->event()->keyDown(window(),k.gadget,&msg);
  532.                 };
  533.                 _exit = k.gadget->event()->exit();
  534.             };
  535.         };
  536.         gac.next();
  537.     };
  538.     return TRUE;
  539. }
  540.  
  541. BOOL GadgetKeyHandlerC::exit()
  542. {
  543.     return _exit;
  544. }
  545.