home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / dirs / gadgeted_438.lzh / GadgetED / Source / tsel.c < prev   
C/C++ Source or Header  |  1991-01-17  |  8KB  |  305 lines

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