home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 568b.lha / PowerSource_v3.0 / source.lzh / source / tsel.c < prev    next >
C/C++ Source or Header  |  1991-09-15  |  8KB  |  295 lines

  1. /*----------------------------------------------------------------------*
  2.    tsel.c Version 3.0 -  © Copyright 1990-91 Jaba Development
  3.  
  4.    Author : Jan van den Baard
  5.    Purpose: Selection requester for gadget & window/requester texts
  6.  *----------------------------------------------------------------------*/
  7.  
  8. static SHORT MainPairs3[] =
  9.  { 0,0,295,0 };
  10. static struct Border MainBorder3 =
  11.  { 2,13,0,0,JAM1,2,MainPairs3,NULL };
  12. static SHORT MainPairs2[] =
  13.  { 0,0,257,0,257,101,0,101,0,0 };
  14. static struct Border MainBorder2 =
  15.  { 8,17,0,0,JAM1,5,MainPairs2,&MainBorder3 };
  16. static SHORT MainPairs1[] =
  17.  { 0,0,295,0,295,147,0,147,0,0 };
  18. static struct Border MainBorder1 =
  19.  { 2,1,0,0,JAM1,5,MainPairs1,&MainBorder2 };
  20.  
  21. static struct IntuiText GText =
  22.  { 0,0,JAM1,78,4,NULL,(UBYTE *)"Select GadgetText",NULL };
  23. static struct IntuiText WText =
  24.  { 0,0,JAM1,78,4,NULL,(UBYTE *)"Select WindowText",NULL };
  25. static struct IntuiText RText =
  26.  { 0,0,JAM1,66,4,NULL,(UBYTE *)"Select RequesterText",NULL };
  27.  
  28. static SHORT CKPairs[] =
  29.  { 0,0,121,0,121,20,0,20,0,0 };
  30. static struct Border CKBorder =
  31.  { -1,-1,0,0,JAM1,5,CKPairs,NULL };
  32.  
  33. static struct IntuiText OKIDOKIText =
  34.  { 0,0,JAM1,50,6,NULL,(UBYTE *)"OK",NULL };
  35. static struct Gadget OKIDOKI =
  36.  { NULL,9,124,120,19,NULL,RELVERIFY,BOOLGADGET,
  37.    (APTR)&CKBorder,NULL,&OKIDOKIText,NULL,NULL,2,NULL };
  38.  
  39. static struct IntuiText CNCText =
  40.  { 0,0,JAM1,38,6,NULL,(UBYTE *)"CANCEL",NULL };
  41. static struct Gadget CNC =
  42.  { &OKIDOKI,170,124,120,19,NULL,RELVERIFY,BOOLGADGET,
  43.    (APTR)&CKBorder,NULL,&CNCText,NULL,NULL,1,NULL };
  44.  
  45. static struct PropInfo PROPInfo =
  46.  { AUTOKNOB+FREEVERT,-1,0,6553,6553,0,0,0,0,0,0 };
  47. static struct Image PROPImage;
  48. static struct Gadget PROP =
  49.  { &CNC,269,16,26,104,NULL,RELVERIFY,PROPGADGET,
  50.    (APTR)&PROPImage,NULL,NULL,NULL,(APTR)&PROPInfo,0,NULL };
  51.  
  52. static struct NewWindow sel_req =
  53.  { 10,15,300,150,0,1,GADGETUP|GADGETDOWN,
  54.    NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
  55.    NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN };
  56.  
  57. extern struct Window      *MainWindow;
  58. extern struct Screen      *MainScreen;
  59. extern struct Gadget      *Gadget;
  60. extern struct RastPort    *MainRP;
  61. extern struct MemoryChain  Memory;
  62. extern ULONG               Class;
  63. extern BOOL                REQUESTER;
  64. extern USHORT              BackFill;
  65.  
  66. static struct Gadget Gad[10];
  67. static struct Gadget G =
  68.  { NULL,9,18,256,10,GADGHCOMP,TOGGLESELECT+GADGIMMEDIATE,
  69.    BOOLGADGET,NULL,NULL,NULL,NULL,NULL,0,NULL };
  70. static struct RastPort *rp;
  71. static struct Window   *tswin;
  72. ULONG                   text_num = 0, num_text,selected = 0;
  73.  
  74. /*
  75.  * add the text gadgets to the window
  76.  */
  77. void do_gadgets( void )
  78. {
  79.     register UCOUNT i,top=18;
  80.     LONG            mutex = NULL;
  81.  
  82.     for(i = 0; i < 10; i++) mutex += (1 << (i + 3));
  83.     for(i = 0; i < 10; i++, top+=10) {
  84.         Gad[i]                   =   G;
  85.         Gad[i].TopEdge           =   top;
  86.         Gad[i].GadgetID          =   i+3;
  87.         Gad[i].MutualExclude     =   mutex;
  88.         Gad[i].NextGadget        =   &Gad[i+1];
  89.     }
  90.     Gad[i].NextGadget = NULL;
  91.     AddGList(tswin,&Gad[0],-1L,10,NULL);
  92. }
  93.  
  94. /*
  95.  * set the proportional gadget according to the number of texts
  96.  */
  97. void set_prop( struct Gadget *gadget )
  98. {
  99.     register struct IntuiText *t;
  100.  
  101.     num_text      = 1;
  102.     OKIDOKI.NextGadget = NULL;
  103.     t             = gadget->GadgetText;
  104.  
  105.     while((t = t->NextText)) num_text++;
  106.  
  107.     PROPInfo.VertPot = 0;
  108.  
  109.     if(num_text <= 10)      PROPInfo.VertBody = MAXBODY;
  110.     else if(num_text == 11) PROPInfo.VertBody = 0x8000;
  111.     else                    PROPInfo.VertBody = MAXBODY / (num_text - 10);
  112. }
  113.  
  114. /*
  115.  * get the pointer to the IntuitionText structure
  116.  * of text number 'num' in gadget 'gadget'
  117.  */
  118. struct IntuiText *GetPtr( struct Gadget *gadget, ULONG num )
  119. {
  120.     register struct IntuiText *t;
  121.     register ULONG             i=0;
  122.  
  123.     t = gadget->GadgetText;
  124.  
  125.     while(i != num) {
  126.         if(NOT(t = t->NextText)) break;
  127.         i++;
  128.     }
  129.     return(t);
  130. }
  131.  
  132. /*
  133.  * print the text list
  134.  */
  135. void do_text( struct Gadget *gadget )
  136. {
  137.     register struct IntuiText *t;
  138.     register ULONG             Max = 10, Pos = 0,i,y=25;
  139.  
  140.     Pos = PROPInfo.VertPot/PROPInfo.VertBody;
  141.     if(num_text - Pos < 10) Max = num_text;
  142.     DeSelectGadget(tswin,&Gad[selected],NULL);
  143.     t = GetPtr(gadget,Pos);
  144.  
  145.     SetDrMd(rp,JAM1);
  146.     SetAPen(rp,1);
  147.     RectFill(rp,9,18,264,117);
  148.  
  149.     for(i = 0; i < Max; i++, y+=10) {
  150.         if(t) {
  151.             SetAPen(rp,0);
  152.             Move(rp,9,y);
  153.             if(strlen((char *)t->IText) > 32) Text(rp,(char *)t->IText,32);
  154.             else Text(rp,(char *)t->IText,strlen((char *)t->IText));
  155.         }
  156.         t = t->NextText;
  157.     }
  158.  
  159.     if(i < 10) {
  160.         OffGList(tswin,&Gad[i],NULL,10-i);
  161.         SetAPen(rp,1);
  162.         RectFill(rp,9,y-8,264,117);
  163.     }
  164.  
  165.     if(text_num < Pos) {
  166.         text_num = Pos;
  167.         SelectGadget(tswin,&Gad[0],NULL);
  168.         selected = 0;
  169.     } else if(text_num > Pos+9) {
  170.         text_num = Pos+9;
  171.         SelectGadget(tswin,&Gad[9],NULL);
  172.         selected = 9;
  173.     } else {
  174.         SelectGadget(tswin,&Gad[text_num - Pos],NULL);
  175.         selected = text_num - Pos;
  176.     }
  177. }
  178.  
  179. /*
  180.  * calculate the text number according to the prop position
  181.  */
  182. void do_num( ULONG num )
  183. {
  184.     ULONG Pos;
  185.  
  186.     Pos = (ULONG)PROPInfo.VertPot/(ULONG)PROPInfo.VertBody;
  187.  
  188.     text_num = num + Pos;
  189.     selected = num;
  190. }
  191.  
  192. /*
  193.  * delete the text
  194.  */
  195. void delete_text( struct Gadget *gadget )
  196. {
  197.     struct IntuiText *t,*succ,*pred;
  198.     LONG              Pos;
  199.  
  200.     succ = GetPtr(gadget,text_num+1);
  201.     pred = GetPtr(gadget,text_num-1);
  202.     t    = GetPtr(gadget,text_num);
  203.     if(t) {
  204.         if(pred) pred->NextText = succ;
  205.         else gadget->GadgetText = succ;
  206.         FreeItem(&Memory,t->IText,80L);
  207.         FreeItem(&Memory,t,(long)sizeof(struct IntuiText));
  208.     }
  209. }
  210.  
  211. /*
  212.  * clear a text from the display
  213.  */
  214. void clear_text( struct Gadget *g )
  215. {
  216.     struct IntuiText *ttc,it;
  217.  
  218.     ttc = GetPtr(g,text_num);
  219.     CopyMem((void *)ttc,(void *)&it,sizeof(struct IntuiText));
  220.     it.FrontPen = it.BackPen = 0;
  221.     if(REQUESTER) it.FrontPen = it.BackPen = BackFill;
  222.     it.DrawMode = JAM2;
  223.     it.NextText = NULL;
  224.     un_grel(MainWindow,g);
  225.     PrintIText(MainRP,&it,g->LeftEdge,g->TopEdge);
  226.     grel(MainWindow,g);
  227. }
  228.  
  229. /*
  230.  * put up the text selector
  231.  */
  232. LONG text_select( struct Gadget *gadget, long mode, ULONG which)
  233. {
  234.     struct IntuiText *MT;
  235.     BOOL              running = TRUE;
  236.     USHORT            gid;
  237.  
  238.     text_num = 0;
  239.     set_prop(gadget);
  240.     if(num_text == 1) {
  241.         gid = 2;
  242.         goto doIt;
  243.     }
  244.     sel_req.Screen = MainScreen;
  245.  
  246.     if(NOT(tswin = OpenWindow(&sel_req))) return;
  247.  
  248.     disable_window();
  249.     if(which == 0)      MT = >ext;
  250.     else if(which == 1) MT = &WText;
  251.     else                MT = &RText;
  252.  
  253.     draw(tswin,&PROP,&MainBorder1,MT);
  254.     do_gadgets();
  255.     rp = tswin->RPort;
  256.     SelectGadget(tswin,&Gad[0],NULL);
  257.     do_num(0);
  258.     do_text(gadget);
  259.  
  260.     do {
  261.         Wait(1 << tswin->UserPort->mp_SigBit);
  262.         while(read_msg(tswin)) {
  263.             if((Class == GADGETUP) OR (Class == GADGETDOWN)) {
  264.                 gid = Gadget->GadgetID;
  265.                 if(gid > 2) {
  266.                     do_num(gid-3);
  267.                     MutualExclude(tswin,&Gad[gid-3],&PROP,NULL);
  268.                     SelectGadget(tswin,&Gad[gid-3],NULL);
  269.                 } else if((gid == 0) AND (num_text > 10))
  270.                     do_text(gadget);
  271.                 else if((gid == 1) OR (gid == 2))
  272.                     running = FALSE;
  273.             }
  274.         }
  275.     } while(running == TRUE);
  276.     while(read_msg(tswin));
  277.     CloseWindow(tswin);
  278.     enable_window();
  279. doIt:
  280.     if(gid == 2) {
  281.         if(mode == 1)
  282.             return(text_num);
  283.         else if(mode == 2) {
  284.             clear_text(gadget);
  285.             edit_text(gadget,mode,text_num,which);
  286.             return(NULL);
  287.         } else {
  288.             clear_text(gadget);
  289.             delete_text(gadget);
  290.             return(NULL);
  291.         }
  292.     }
  293.     return(-1L);
  294. }
  295.