home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d8xx / d832 / term.lha / Term / term-3.1-Source.lha / ImportPanel.c < prev    next >
C/C++ Source or Header  |  1993-02-18  |  8KB  |  344 lines

  1. /*
  2. **    ImportPanel.c
  3. **
  4. **    Editing panel for phone unit settings
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_LIST,GAD_REPLACE,GAD_APPEND,GAD_CANCEL };
  13.  
  14. STATIC struct Hook ListViewHook;
  15.  
  16.     /* ListViewRender():
  17.      *
  18.      *    This callback routine is responsible for rendering
  19.      *    the single listview entries.
  20.      */
  21.  
  22. STATIC ULONG __saveds __asm
  23. ListViewRender(register __a0 struct Hook *Hook,register __a1 struct LVDrawMsg *Msg,register __a2 struct Node *Node)
  24. {
  25.         /* We only know how to redraw lines. */
  26.  
  27.     if(Msg -> lvdm_MethodID == LV_DRAW)
  28.     {
  29.         struct RastPort    *RPort    = Msg -> lvdm_RastPort;
  30.         LONG         Left    = Msg -> lvdm_Bounds . MinX,
  31.                  Top    = Msg -> lvdm_Bounds . MinY,
  32.                  Width    = Msg -> lvdm_Bounds . MaxX - Msg -> lvdm_Bounds . MinX + 1,
  33.                  Height    = Msg -> lvdm_Bounds . MaxY - Msg -> lvdm_Bounds . MinY + 1,
  34.                  FgPen,BgPen,
  35.                  Len,LabelLen;
  36.         STRPTR         String;
  37.  
  38.         String = &Node -> ln_Name[6];
  39.  
  40.             /* Determine the rendering pens. */
  41.  
  42.         switch(Msg -> lvdm_State)
  43.         {
  44.             case LVR_SELECTEDDISABLED:
  45.             case LVR_NORMALDISABLED:
  46.             case LVR_NORMAL:
  47.  
  48.                 FgPen = Msg -> lvdm_DrawInfo -> dri_Pens[TEXTPEN];
  49.                 BgPen = Msg -> lvdm_DrawInfo -> dri_Pens[BACKGROUNDPEN];
  50.                 break;
  51.  
  52.             case LVR_SELECTED:
  53.  
  54.                 FgPen = Msg -> lvdm_DrawInfo -> dri_Pens[FILLTEXTPEN];
  55.                 BgPen = Msg -> lvdm_DrawInfo -> dri_Pens[FILLPEN];
  56.                 break;
  57.         }
  58.  
  59.         SetAPen(RPort,BgPen);
  60.         RectFill(RPort,Left,Top,Left + 1,Top + Height - 1);
  61.  
  62.         Left    += 2;
  63.         Width    -= 2;
  64.  
  65.             /* Set the rendering pens. */
  66.  
  67.         SetDrMd(RPort,JAM2);
  68.         SetAPen(RPort,FgPen);
  69.         SetBPen(RPort,BgPen);
  70.  
  71.             /* Determine length of vanilla name. */
  72.  
  73.         LabelLen = strlen(String);
  74.  
  75.             /* Try to make it fit. */
  76.  
  77.         while(LabelLen > 0 && (Len = TextLength(RPort,String,LabelLen)) > Width)
  78.             LabelLen--;
  79.  
  80.             /* Print the vanilla name if possible. */
  81.  
  82.         if(LabelLen)
  83.         {
  84.             Move(RPort,Left,Top + RPort -> Font -> tf_Baseline);
  85.             Text(RPort,String,LabelLen);
  86.  
  87.             Left    += Len;
  88.             Width    -= Len;
  89.         }
  90.  
  91.             /* Fill the area to follow the vanilla name. */
  92.  
  93.         if(Width > 0)
  94.         {
  95.             SetAPen(RPort,BgPen);
  96.             RectFill(RPort,Left,Top,Left + Width - 1,Top + Height - 1);
  97.         }
  98.  
  99.             /* If the item happens to be disabled, draw the cross-hatch
  100.              * pattern across it.
  101.              */
  102.  
  103.         if(Msg -> lvdm_State == LVR_SELECTEDDISABLED || Msg -> lvdm_State == LVR_NORMALDISABLED)
  104.         {
  105.             SetAPen(RPort,Msg -> lvdm_DrawInfo -> dri_Pens[BLOCKPEN]);
  106.  
  107.             SetAfPt(RPort,(UWORD *)&Crosshatch,1);
  108.  
  109.             RectFill(RPort,Msg -> lvdm_Bounds . MinX,Msg -> lvdm_Bounds . MinY,Msg -> lvdm_Bounds . MaxX,Msg -> lvdm_Bounds . MaxY);
  110.  
  111.             SetAfPt(RPort,NULL,0);
  112.         }
  113.  
  114.         return(LVCB_OK);
  115.     }
  116.     else
  117.         return(LVCB_UNKNOWN);
  118. }
  119.  
  120. STATIC struct Gadget *
  121. CreateAllGadgets(struct List *PhoneList,struct Gadget **GadgetArray,struct Gadget **GadgetList)
  122. {
  123.     struct Gadget        *Gadget;
  124.     struct NewGadget     NewGadget;
  125.     UWORD             Counter = 0;
  126.  
  127.     SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  128.  
  129.     memset(&NewGadget,0,sizeof(struct NewGadget));
  130.  
  131.     if(Gadget = CreateContext(GadgetList))
  132.     {
  133.         UWORD Width,ButtonWidth;
  134.  
  135.         SZ_ResetMaxWidth();
  136.  
  137.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_IMPORTPANEL_REPLACE_RATES_GAD),0,NULL);
  138.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_IMPORTPANEL_APPEND_RATES_GAD),0,NULL);
  139.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  140.  
  141.         ButtonWidth = SZ_ResetMaxWidth();
  142.  
  143.         Width = SZ_Width(LISTVIEW_KIND,NULL,35,NULL);
  144.  
  145.         if(3 * ButtonWidth + 2 * InterWidth > Width)
  146.             SZ_SetWidth(3 * ButtonWidth + 2 * InterWidth);
  147.         else
  148.             SZ_SetWidth(Width);
  149.  
  150.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_NAME_LIST_GAD);
  151.         NewGadget . ng_GadgetID        = Counter;
  152.         NewGadget . ng_Flags        = PLACETEXT_ABOVE|NG_HIGHLABEL;
  153.  
  154.         ListViewHook . h_Entry = (LONG (*)())ListViewRender;
  155.  
  156.         GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
  157.             SZ_Adjust,        TRUE,
  158.             SZ_AutoWidth,        TRUE,
  159.             SZ_Lines,        8,
  160.  
  161.             GTLV_CallBack,        &ListViewHook,
  162.             GTLV_Labels,        PhoneList,
  163.             GTLV_ShowSelected,    NULL,
  164.         TAG_DONE);
  165.  
  166.         SZ_SetWidth(ButtonWidth);
  167.  
  168.         NewGadget . ng_GadgetText    = LocaleString(MSG_IMPORTPANEL_REPLACE_RATES_GAD);
  169.         NewGadget . ng_GadgetID        = Counter;
  170.         NewGadget . ng_Flags        = 0;
  171.  
  172.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  173.             SZ_Adjust,    TRUE,
  174.             SZ_AutoWidth,    TRUE,
  175.             SZ_GroupCount,    3,
  176.  
  177.             GA_Disabled,    TRUE,
  178.         TAG_DONE);
  179.  
  180.         NewGadget . ng_GadgetText    = LocaleString(MSG_IMPORTPANEL_APPEND_RATES_GAD);
  181.         NewGadget . ng_GadgetID        = Counter;
  182.  
  183.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  184.             SZ_Adjust,    TRUE,
  185.             SZ_AutoWidth,    TRUE,
  186.             SZ_GroupNext,    TRUE,
  187.  
  188.             GA_Disabled,    TRUE,
  189.         TAG_DONE);
  190.  
  191.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_CANCEL_GAD);
  192.         NewGadget . ng_GadgetID        = Counter;
  193.  
  194.         GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  195.             SZ_Adjust,    TRUE,
  196.             SZ_AutoWidth,    TRUE,
  197.             SZ_GroupNext,    TRUE,
  198.         TAG_DONE);
  199.     }
  200.  
  201.     return(Gadget);
  202. }
  203.  
  204. BYTE
  205. ImportPanel(struct PhoneEntry *Entry,struct List *PhoneList)
  206. {
  207.     struct Window    *PanelWindow;
  208.     struct Gadget    *GadgetList;
  209.     struct Gadget    *GadgetArray[GAD_CANCEL + 1];
  210.     BYTE         MadeChanges = FALSE;
  211.  
  212.     if(CreateAllGadgets(PhoneList,GadgetArray,&GadgetList))
  213.     {
  214.         if(PanelWindow = OpenWindowTags(NULL,
  215.             WA_Left,    GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
  216.             WA_Top,        GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight())    / 2,
  217.             WA_Width,    SZ_GetWindowWidth(),
  218.             WA_Height,    SZ_GetWindowHeight(),
  219.  
  220.             WA_Activate,    TRUE,
  221.             WA_DragBar,    TRUE,
  222.             WA_DepthGadget,    TRUE,
  223.             WA_RMBTrap,    TRUE,
  224.             WA_DepthGadget,    TRUE,
  225.             WA_CloseGadget,    TRUE,
  226.             WA_CustomScreen,Window -> WScreen,
  227.             WA_IDCMP,    IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY | IDCMP_RAWKEY | BUTTONIDCMP | LISTVIEWIDCMP,
  228.             WA_Title,    LocaleString(MSG_IMPORTPANEL_IMPORT_RATES_TXT),
  229.         TAG_DONE))
  230.         {
  231.             struct IntuiMessage    *Massage;
  232.             ULONG             IClass,Code;
  233.             struct Gadget        *Gadget;
  234.             BYTE             Terminated = FALSE;
  235.             LONG             Selected = ~0;
  236.  
  237.             GuideContext(CONTEXT_IMPORT);
  238.  
  239.             PushWindow(PanelWindow);
  240.  
  241.             AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  242.             RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  243.             GT_RefreshWindow(PanelWindow,NULL);
  244.  
  245.             SetSignal(0,SIG_BREAK);
  246.  
  247.             while(!Terminated)
  248.             {
  249.                 if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  250.                     break;
  251.  
  252.                 while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
  253.                 {
  254.                     IClass    = Massage -> Class;
  255.                     Code    = Massage -> Code;
  256.                     Gadget    = (struct Gadget *)Massage -> IAddress;
  257.  
  258.                     GT_ReplyIMsg(Massage);
  259.  
  260.                     KeySelect(GadgetArray,GAD_CANCEL,Code,PanelWindow,&Gadget,&IClass,&Code);
  261.  
  262.                     if(IClass == IDCMP_CLOSEWINDOW)
  263.                         Terminated = TRUE;
  264.  
  265.                     if(IClass == IDCMP_GADGETUP)
  266.                     {
  267.                         switch(Gadget -> GadgetID)
  268.                         {
  269.                             case GAD_LIST:
  270.  
  271.                                 if(Entry != Phonebook[Code])
  272.                                 {
  273.                                     if(Selected == ~0)
  274.                                     {
  275.                                         GT_SetGadgetAttrs(GadgetArray[GAD_REPLACE],PanelWindow,NULL,
  276.                                             GA_Disabled,    FALSE,
  277.                                         TAG_DONE);
  278.  
  279.                                         GT_SetGadgetAttrs(GadgetArray[GAD_APPEND],PanelWindow,NULL,
  280.                                             GA_Disabled,    FALSE,
  281.                                         TAG_DONE);
  282.                                     }
  283.  
  284.                                     Selected = Code;
  285.                                 }
  286.                                 else
  287.                                 {
  288.                                     if(Selected != ~0)
  289.                                     {
  290.                                         GT_SetGadgetAttrs(GadgetArray[GAD_REPLACE],PanelWindow,NULL,
  291.                                             GA_Disabled,    TRUE,
  292.                                         TAG_DONE);
  293.  
  294.                                         GT_SetGadgetAttrs(GadgetArray[GAD_APPEND],PanelWindow,NULL,
  295.                                             GA_Disabled,    TRUE,
  296.                                         TAG_DONE);
  297.  
  298.                                         Selected = ~0;
  299.                                     }
  300.                                 }
  301.  
  302.                                 break;
  303.  
  304.                             case GAD_APPEND:
  305.                             case GAD_REPLACE:
  306.  
  307.                                 if(Gadget -> GadgetID == GAD_REPLACE)
  308.                                 {
  309.                                     FreeTimeDateList((struct List *)&Entry -> TimeDateList);
  310.  
  311.                                     CopyTimeDateList((struct List *)&Phonebook[Selected] -> TimeDateList,(struct List *)&Entry -> TimeDateList,FALSE);
  312.                                 }
  313.                                 else
  314.                                     CopyTimeDateList((struct List *)&Phonebook[Selected] -> TimeDateList,(struct List *)&Entry -> TimeDateList,TRUE);
  315.  
  316.                                 Terminated = TRUE;
  317.  
  318.                                 MadeChanges = TRUE;
  319.  
  320.                                 break;
  321.  
  322.                             case GAD_CANCEL:
  323.  
  324.                                 Terminated = TRUE;
  325.  
  326.                                 break;
  327.                         }
  328.                     }
  329.                 }
  330.             }
  331.  
  332.             RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  333.  
  334.             PopWindow();
  335.  
  336.             CloseWindow(PanelWindow);
  337.         }
  338.  
  339.         FreeGadgets(GadgetList);
  340.     }
  341.  
  342.     return(MadeChanges);
  343. }
  344.