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 / pref.c < prev    next >
C/C++ Source or Header  |  1991-09-15  |  14KB  |  423 lines

  1. /*----------------------------------------------------------------------*
  2.    pref.c Version 3.0 - © Copyright 1990-91 Jaba Development
  3.  
  4.    Author  : Jan van den Baard
  5.    Purpose : the preferences requester
  6.  *----------------------------------------------------------------------*/
  7.  
  8. static UBYTE UNDOBUFFER[80];
  9.  
  10. static SHORT MainPairs2[] =
  11.  { 0,0,296,0,296,157,0,157,0,0 };
  12. static struct Border MainBorder2 =
  13.  { 2,1,0,0,JAM1,5,MainPairs2,NULL };
  14. static SHORT MainPairs1[] =
  15.  { 0,0,296,0 };
  16. static struct Border MainBorder1 =
  17.  { 2,12,0,0,JAM1,2,MainPairs1,&MainBorder2 };
  18.  
  19. static SHORT SUPairs[] =
  20.  { 0,0,87,0,87,13,0,13,0,0 };
  21. static struct Border SUBorder =
  22.  { -1,-1,0,0,JAM1,5,SUPairs,NULL };
  23.  
  24. static struct IntuiText SUText =
  25.  { 0,0,JAM1,3,2,NULL,(UBYTE *)"Save & Use",NULL };
  26. static struct Gadget SU =
  27.  { NULL,203,143,86,12,NULL,RELVERIFY,BOOLGADGET,
  28.    (APTR)&SUBorder,NULL,&SUText,NULL,NULL,9,NULL };
  29.  
  30. static struct IntuiText USText =
  31.  { 0,0,JAM1,33,2,NULL,(UBYTE *)"Use",NULL };
  32. static struct Gadget US =
  33.  { &SU,107,143,86,12,NULL,RELVERIFY,BOOLGADGET,
  34.    (APTR)&SUBorder,NULL,&USText,NULL,NULL,8,NULL };
  35.  
  36. static struct IntuiText SAText =
  37.  { 0,0,JAM1,27,2,NULL,(UBYTE *)"Save",NULL };
  38. static struct Gadget SA =
  39.  { &US,12,143,86,12,NULL,RELVERIFY,BOOLGADGET,
  40.    (APTR)&SUBorder,NULL,&SAText,NULL,NULL,7,NULL };
  41.  
  42. static SHORT RWPairs[] =
  43.  { 0,0,136,0,136,10,0,10,0,0 };
  44. static struct Border RWBorder =
  45.  { -1,-1,0,0,JAM1,5,RWPairs,NULL };
  46.  
  47. static struct IntuiText REText =
  48.  { 0,0,JAM1,30,1,NULL,(UBYTE *)"REQUESTER",NULL };
  49. static struct Gadget RE =
  50.  { &SA,155,129,135,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  51.    (APTR)&RWBorder,NULL,&REText,1L,NULL,3,NULL };
  52.  
  53. static struct IntuiText WDText =
  54.  { 0,0,JAM1,43,1,NULL,(UBYTE *)"WINDOW",NULL };
  55. static struct Gadget WD =
  56.  { &RE,12,129,135,9,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  57.    (APTR)&RWBorder,NULL,&WDText,2L,NULL,2,NULL };
  58.  
  59. static SHORT OPPairs[] =
  60.  { 0,0,279,0,279,11,0,11,0,0 };
  61. static struct Border OPBorder =
  62.  { -1,-1,0,0,JAM1,5,OPPairs,NULL };
  63.  
  64. static struct IntuiText CRText =
  65.  { 0,0,JAM1,95,1,NULL,(UBYTE *)"Coordinates",NULL };
  66. static struct Gadget CR =
  67.  { &WD,12,113,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  68.    (APTR)&OPBorder,NULL,&CRText,NULL,NULL,1,NULL };
  69.  
  70. static struct IntuiText HBText =
  71.  { 0,0,JAM1,71,1,NULL,(UBYTE *)"OS 2.0 HighBorder",NULL };
  72. static struct Gadget HB =
  73.  { &CR,12,99,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  74.    (APTR)&OPBorder,NULL,&HBText,NULL,NULL,1,NULL };
  75.  
  76. static struct IntuiText NFText =
  77.  { 0,0,JAM1,59,1,NULL,(UBYTE *)"RAW Assembler Source",NULL };
  78. static struct Gadget NF =
  79.  { &HB,12,85,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  80.    (APTR)&OPBorder,NULL,&NFText,NULL,NULL,4,NULL };
  81.  
  82. static struct IntuiText STText =
  83.  { 0,0,JAM1,71,1,NULL,(UBYTE *)"Static Structures",NULL };
  84. static struct Gadget ST =
  85.  { &NF,12,71,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  86.    (APTR)&OPBorder,NULL,&STText,NULL,NULL,1,NULL };
  87.  
  88. static struct IntuiText TCText =
  89.  { 0,0,JAM1,103,1,NULL,(UBYTE *)"Text Copy",NULL };
  90. static struct Gadget TC =
  91.  { &ST,12,57,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  92.    (APTR)&OPBorder,NULL,&TCText,NULL,NULL,1,NULL };
  93.  
  94. static struct IntuiText ICText =
  95.  { 0,0,JAM1,99,1,NULL,(UBYTE *)"Image Copy",NULL };
  96. static struct Gadget IC =
  97.  { &TC,12,43,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  98.    (APTR)&OPBorder,NULL,&ICText,NULL,NULL,1,NULL };
  99.  
  100. static struct IntuiText AUSText =
  101.  { 0,0,JAM1,40,1,NULL,(UBYTE *)"Auto Gadget -> Image size",NULL };
  102. static struct Gadget AUS =
  103.  { &IC,12,29,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  104.    (APTR)&OPBorder,NULL,&AUSText,1,NULL,0,NULL };
  105.  
  106. static struct IntuiText SZPText =
  107.  { 0,0,JAM1,58,1,NULL,(UBYTE *)"Skip zero bit-planes",NULL };
  108. static struct Gadget SZP =
  109.  { &AUS,12,15,278,10,NULL,GADGIMMEDIATE+TOGGLESELECT,BOOLGADGET,
  110.    (APTR)&OPBorder,NULL,&SZPText,NULL,NULL,0,NULL };
  111.  
  112. static struct IntuiText MainText =
  113.  { 0,0,JAM1,107,3,NULL,(UBYTE *)"Preferences",NULL };
  114.  
  115. static struct NewWindow pr_req =
  116.  { 10,15,301,160,0,1,GADGETUP+GADGETDOWN,
  117.    NOCAREREFRESH+SMART_REFRESH+ACTIVATE+RMBTRAP+BORDERLESS,
  118.    NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN };
  119.  
  120. extern struct Window     *MainWindow;
  121. extern struct Screen     *MainScreen;
  122. extern struct Gadget     *Gadget;
  123. extern struct RastPort   *MainRP;
  124. extern struct ge_prefs    prefs;
  125. extern BOOL               REQUESTER;
  126. extern ULONG              Class;
  127. extern USHORT             GadgetCount, BackFill, BackPen, FrontPen, WDBackFill;
  128. extern struct NewWindow   nw_main;
  129. extern struct GadgetList  Gadgets;
  130. extern UBYTE              wdt[80],wlb[MAXLABEL];
  131. extern ULONG              WindowFlags;
  132. extern struct Gadget      TextGadget;
  133.  
  134. static struct Window  *pw;
  135. static struct ge_prefs pbuf;
  136. static BOOL            req;
  137.  
  138. /*
  139.  * write the preferences to "DEVS:PowerSource.PREFS"
  140.  */
  141. static long save_prefs( void )
  142. {
  143.     BPTR file;
  144.     BOOL ret = TRUE;
  145.  
  146.     if(NOT(file = Open("DEVS:PowerSource.PREFS",MODE_NEWFILE))) return(FALSE);
  147.  
  148.     if(Write(file,(char *)&prefs,sizeof(struct ge_prefs)) == -1) ret = FALSE;
  149.     Close(file);
  150.  
  151.     return(ret);
  152. }
  153.  
  154. /*
  155.  * set the preferences
  156.  */
  157. static void set_prefs( void )
  158. {
  159.     USHORT i;
  160.  
  161.     prefs.flag_bits = NULL;
  162.  
  163.     if(SelectTest(&SZP))  prefs.skip_zero_planes = TRUE;
  164.     else                  prefs.skip_zero_planes = FALSE;
  165.     if(SelectTest(&AUS))  prefs.auto_size        = TRUE;
  166.     else                  prefs.auto_size = FALSE;
  167.     if(SelectTest(&IC))   prefs.image_copy = TRUE;
  168.     else                  prefs.image_copy = FALSE;
  169.     if(SelectTest(&RE))   REQUESTER = TRUE;
  170.     else                  REQUESTER = FALSE;
  171.     if(SelectTest(&ST))   prefs.static_structures = TRUE;
  172.     else                  prefs.static_structures = FALSE;
  173.     if(SelectTest(&TC))   prefs.text_copy = TRUE;
  174.     else                  prefs.text_copy = FALSE;
  175.     if(SelectTest(&NF))   prefs.no_flags = TRUE;
  176.     else                  prefs.no_flags = FALSE;
  177.     if(SelectTest(&HB))   prefs.os2_hborder = TRUE;
  178.     else                  prefs.os2_hborder = FALSE;
  179.     if(SelectTest(&CR)) { prefs.flag_bits |= GP_COORDS;
  180.                           Forbid();
  181.                           MainWindow->Flags |= REPORTMOUSE;
  182.                           Permit();
  183.                           set_coords();
  184.                           do_coords();
  185.                         } else {
  186.                           Forbid();
  187.                           MainWindow->Flags &= ~REPORTMOUSE;
  188.                           while(read_msg(MainWindow));
  189.                           Permit();
  190.                         }
  191.     refresh();
  192. }
  193.  
  194. /*
  195.  * re arrange the gadget list
  196.  */
  197. struct Gadget *re_arrange( void )
  198. {
  199.     register struct MyGadget *g;
  200.     register struct Gadget   *gd;
  201.  
  202.     if(NOT Gadgets.Head->Succ) return(NULL);
  203.  
  204.     for(g = Gadgets.TailPred; g != (struct MyGadget *)&Gadgets; g = g->Pred) {
  205.         gd = &g->Gadget;
  206.         if(g->Pred == (struct MyGadget *)&Gadgets) gd->NextGadget = NULL;
  207.         else gd->NextGadget = &g->Pred->Gadget;
  208.     }
  209.     return(&Gadgets.TailPred->Gadget);
  210. }
  211.  
  212. /*
  213.  * change the window to requester or viceversa
  214.  */
  215. long change_window( void )
  216. {
  217.     register struct Gadget    *g, *g1, *gl;
  218.     register struct IntuiText *t;
  219.     struct Window             *w;
  220.  
  221.     nw_main.LeftEdge       =   MainWindow->LeftEdge;
  222.     nw_main.TopEdge        =   MainWindow->TopEdge;
  223.     nw_main.Width          =   MainWindow->Width;
  224.     nw_main.Height         =   MainWindow->Height;
  225.     nw_main.Flags          =   NULL;
  226.     nw_main.FirstGadget    =   NULL;
  227.     nw_main.Screen         =   MainScreen;
  228.     nw_main.MinWidth       =   MainWindow->MinWidth;
  229.     nw_main.MinHeight      =   MainWindow->MinHeight;
  230.     nw_main.MaxWidth       =   MainScreen->Width;
  231.     nw_main.MaxHeight      =   MainScreen->Height;
  232.  
  233.     add_bo();
  234.  
  235.     g = gl = re_arrange();
  236.  
  237.     if(REQUESTER) {
  238.         nw_main.DetailPen    =   0;
  239.         nw_main.BlockPen     =   1;
  240.         BackFill             =   1;
  241.         FrontPen             =   0;
  242.         BackPen              =   1;
  243.         nw_main.Flags        =   FLAGS_RQ;
  244.         strcpy((char *)&wlb,"requester");
  245.         strcpy((char *)&wdt,"Requester");
  246.         nw_main.Title        =   (UBYTE *)"Work Requester";
  247.         if((nw_main.LeftEdge + nw_main.Width + 17) < MainScreen->Width)
  248.             nw_main.Width += 17;
  249.         if((nw_main.TopEdge + nw_main.Height + 8) < MainScreen->Height)
  250.             nw_main.Height += 8;
  251.     } else {
  252.         nw_main.DetailPen    =   MainWindow->DetailPen;
  253.         nw_main.BlockPen     =   MainWindow->BlockPen;
  254.         strcpy((char *)&wdt,"Work Window");
  255.         nw_main.Title        =   (UBYTE *)&wdt;
  256.         strcpy((char *)&wlb,"new_window");
  257.         FrontPen             =   1;
  258.         BackPen              =   0;
  259.         nw_main.Width       -=   17;
  260.         nw_main.Height      -=   8;
  261.         if(TestBits(WindowFlags,WINDOWCLOSE))  nw_main.Flags |= WINDOWCLOSE;
  262.         if(TestBits(WindowFlags,WINDOWDRAG))   nw_main.Flags |= WINDOWDRAG;
  263.         if(TestBits(WindowFlags,WINDOWDEPTH))  nw_main.Flags |= WINDOWDEPTH;
  264.         if(TestBits(WindowFlags,WINDOWSIZING)) nw_main.Flags |= WINDOWSIZING;
  265.         if(TestBits(WindowFlags,SIZEBRIGHT))   nw_main.Flags |= SIZEBRIGHT;
  266.         if(TestBits(WindowFlags,SIZEBBOTTOM))  nw_main.Flags |= SIZEBBOTTOM;
  267.         nw_main.Flags |= NOCAREREFRESH|SMART_REFRESH|ACTIVATE;
  268.     }
  269.  
  270.     if(TestBits((ULONG)prefs.flag_bits,GP_COORDS))
  271.         nw_main.Flags |= REPORTMOUSE;
  272.  
  273.     if(NOT(w = OpenWindow(&nw_main))) {
  274.         Error("Can't change window !");
  275.         if(g) AddGList(MainWindow,g,-1L,GadgetCount,NULL);
  276.         return;
  277.     }
  278.  
  279.     if(REQUESTER) {
  280.         if(g) {
  281.             while(1) {
  282.                 g1 = g->NextGadget;
  283.                 un_grel(MainWindow,g);
  284.                 if(TestBits((ULONG)g->Flags,GRELWIDTH))  g->Flags ^= GRELWIDTH;
  285.                 if(TestBits((ULONG)g->Flags,GRELHEIGHT)) g->Flags ^= GRELHEIGHT;
  286.                 if(TestBits((ULONG)g->Flags,GRELRIGHT))  g->Flags ^= GRELRIGHT;
  287.                 if(TestBits((ULONG)g->Flags,GRELBOTTOM)) g->Flags ^= GRELBOTTOM;
  288.  
  289.                 if(TestBits((ULONG)g->Activation,RIGHTBORDER))
  290.                     g->Activation ^= RIGHTBORDER;
  291.                 if(TestBits((ULONG)g->Activation,LEFTBORDER))
  292.                     g->Activation ^= LEFTBORDER;
  293.                 if(TestBits((ULONG)g->Activation,TOPBORDER))
  294.                     g->Activation ^= TOPBORDER;
  295.                 if(TestBits((ULONG)g->Activation,BOTTOMBORDER))
  296.                     g->Activation ^= BOTTOMBORDER;
  297.  
  298.                 g->TopEdge  -= MainWindow->BorderTop - 1;
  299.  
  300.                 if(NOT g1) break;
  301.                 g = g1;
  302.             }
  303.        }
  304.  
  305.        if((t = TextGadget.GadgetText)) {
  306.            while(1) {
  307.                t->TopEdge -= MainWindow->BorderTop - 1;
  308.                if(NOT(t = t->NextText)) break;
  309.            }
  310.        }
  311.     } else {
  312.         if(g) {
  313.             while(1) {
  314.                 g1 = g->NextGadget;
  315.                 if(TestBits((ULONG)g->Activation,ENDGADGET))
  316.                     g->Activation ^= ENDGADGET;
  317.                 g->TopEdge  += MainWindow->BorderTop + 1;
  318.                 if(NOT g1) break;
  319.                 g = g1;
  320.             }
  321.         }
  322.  
  323.         if((t = TextGadget.GadgetText)) {
  324.             while(1) {
  325.                 t->TopEdge += MainWindow->BorderTop + 1;
  326.                 if(NOT(t = t->NextText)) break;
  327.             }
  328.         }
  329.     }
  330.  
  331.     ClearMenuStrip(MainWindow);
  332.     CloseWindow(MainWindow);
  333.     MainWindow = w;
  334.     MainRP     = MainWindow->RPort;
  335.     SetMenu(MainWindow);
  336.     if(gl) AddGList(MainWindow,gl,-1L,GadgetCount,NULL);
  337.     rem_bo();
  338.     refresh();
  339. }
  340.  
  341. /*
  342.  * open the preferences window
  343.  */
  344. void preferences( void )
  345. {
  346.     struct RastPort *rp;
  347.     BOOL             running = TRUE, req;
  348.     USHORT           g_id;
  349.  
  350.     pr_req.Screen = MainScreen;
  351.  
  352.     if(NOT(pw = OpenWindow(&pr_req))) return;
  353.  
  354.     disable_window();
  355.     rp = pw->RPort;
  356.  
  357.     draw(pw,&SZP,&MainBorder1,&MainText);
  358.  
  359.     DeSelectGList(pw,&SZP,NULL,7);
  360.  
  361.     if(prefs.skip_zero_planes)  SelectGadget(pw,&SZP,NULL);
  362.     if(prefs.auto_size)         SelectGadget(pw,&AUS,NULL);
  363.     if(prefs.image_copy)        SelectGadget(pw,&IC,NULL);
  364.     if(prefs.static_structures) SelectGadget(pw,&ST,NULL);
  365.     if(prefs.text_copy)         SelectGadget(pw,&TC,NULL);
  366.     if(prefs.no_flags)          SelectGadget(pw,&NF,NULL);
  367.     if(prefs.os2_hborder)       SelectGadget(pw,&HB,NULL);
  368.     if(TestBits((ULONG)prefs.flag_bits,GP_COORDS))
  369.         SelectGadget(pw,&CR,NULL);
  370.  
  371.     if(REQUESTER) SelectGadget(pw,&RE,NULL);
  372.     else          SelectGadget(pw,&WD,NULL);
  373.  
  374.     req = REQUESTER;
  375.  
  376.     do {
  377.         Wait(1 << pw->UserPort->mp_SigBit);
  378.         while(read_msg(pw)) {
  379.             g_id = Gadget->GadgetID;
  380.             switch(g_id) {
  381.                 case 2:
  382.                 case 3: MutualExclude(pw,Gadget,&WD,NULL);
  383.                         SelectGadget(pw,Gadget,NULL);
  384.                         break;
  385.                 case 7:
  386.                 case 8:
  387.                 case 9: running = FALSE;
  388.                         break;
  389.             }
  390.         }
  391.     } while(running == TRUE);
  392.     CloseWindow(pw);
  393.  
  394.     enable_window();
  395.  
  396.     if(g_id == 7) {
  397.         req = REQUESTER;
  398.         CopyMem((char *)&prefs,(char *)&pbuf,(long)sizeof(struct ge_prefs));
  399.         set_prefs();
  400.         if(NOT save_prefs()) {
  401.             Error("Error writing preferences !");
  402.             REQUESTER = req;
  403.             CopyMem((char *)&pbuf,(char *)&prefs,(long)sizeof(struct ge_prefs));
  404.             return;
  405.         }
  406.         REQUESTER = req;
  407.         CopyMem((char *)&pbuf,(char *)&prefs,(long)sizeof(struct ge_prefs));
  408.     } else if(g_id == 8) {
  409.         set_prefs();
  410.         if(REQUESTER != req) change_window();
  411.         set_extra_items(MainWindow);
  412.     } else {
  413.         set_prefs();
  414.         if(REQUESTER != req) change_window();
  415.         set_extra_items(MainWindow);
  416.         if(NOT save_prefs()) {
  417.  
  418.             Error("Error writing preferences !");
  419.             return;
  420.         }
  421.     }
  422. }
  423.