home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d534 / term.lha / Term / Source.LZH / termSub.c < prev    next >
C/C++ Source or Header  |  1991-07-06  |  9KB  |  454 lines

  1. /* $Revision Header * Header built automatically - do not edit! *************
  2.  *
  3.  *    (C) Copyright 1990 by Olaf 'Olsen' Barthel & MXM
  4.  *
  5.  *    Name .....: TermSub.c
  6.  *    Created ..: Monday 21-Jan-91 20:12
  7.  *    Revision .: 0
  8.  *
  9.  *    Date            Author          Comment
  10.  *    =========       ========        ====================
  11.  *    21-Jan-91       Olsen           Created this file!
  12.  *
  13.  * $Revision Header ********************************************************/
  14.  
  15. #include "TermGlobal.h"
  16.  
  17.     /* This module deals with the so-called `sub window', which is
  18.      * brought up whenever a list of phone entries is to be dialed.
  19.      */
  20.  
  21. STATIC struct Menu    *SubMenu;
  22.  
  23. STATIC struct Gadget    *SubGadgetList;
  24. STATIC struct Gadget    *SubGadgetArray[4];
  25.  
  26. STATIC WORD         PositionX = -1,PositionY = -1;
  27.  
  28. #define SUB_DIAL    1
  29. #define SUB_QUIT    2
  30.  
  31. #define SUBWIDTH    354
  32. #define SUBHEIGHT    124
  33.  
  34. enum    {    MEN_NEXT=1,MEN_PREV,MEN_WINDOW,MEN_DIALENTRY,MEN_DELETECALL,
  35.         MEN_CANCEL,MEN_QUITPANEL };
  36.  
  37. STATIC struct NewMenu CallMenu[] =
  38. {
  39.     { NM_TITLE, "Project",         0 , 0, 0, (APTR)0},
  40.     {  NM_ITEM, "Next Entry",    "N", 0, 0, (APTR)MEN_NEXT},
  41.     {  NM_ITEM, "Previous Entry",    "P", 0, 0, (APTR)MEN_PREV},
  42.     {  NM_ITEM, "Other Window",    "W", 0, 0, (APTR)MEN_WINDOW},
  43.     {  NM_ITEM, NM_BARLABEL,     0 , 0, 0, (APTR)0},
  44.     {  NM_ITEM, "Dial",        "D", 0, 0, (APTR)MEN_DIALENTRY},
  45.     {  NM_ITEM, "Delete Call",    "E", 0, 0, (APTR)MEN_DELETECALL},
  46.     {  NM_ITEM, "Cancel",        "C", 0, 0, (APTR)MEN_CANCEL},
  47.     {  NM_ITEM, NM_BARLABEL,     0 , 0, 0, (APTR)0},
  48.     {  NM_ITEM, "Quit",        "Q", 0, 0, (APTR)MEN_QUITPANEL},
  49.     { NM_END, 0,             0 , 0, 0, (APTR)0}
  50. };
  51.  
  52. STATIC struct Gadget *
  53. SubCreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge)
  54. {
  55.     struct Gadget        *Gadget;
  56.     struct NewGadget     NewGadget;
  57.     UWORD             Offset,Counter = 0;
  58.  
  59.     if(Gadget = CreateContext(GadgetList))
  60.     {
  61.         NewGadget . ng_Width        = 334;
  62.         NewGadget . ng_Height        = 100;
  63.         NewGadget . ng_GadgetText    = NULL;
  64.         NewGadget . ng_TextAttr        = &DefaultFont;
  65.         NewGadget . ng_VisualInfo    = VisualInfo;
  66.         NewGadget . ng_GadgetID        = Counter;
  67.         NewGadget . ng_LeftEdge        = 10;
  68.         NewGadget . ng_TopEdge        = 1 + TopEdge;
  69.  
  70.         GadgetArray[Counter++] = Gadget = CreateGadget(LISTVIEW_KIND,Gadget,&NewGadget,
  71.             GTLV_Labels,        &EmptyList,
  72.             GTLV_ShowSelected,    NULL,
  73.         TAG_DONE);
  74.  
  75.         Offset = SUBWIDTH / 3 + 3;
  76.  
  77.         NewGadget . ng_Width        = 92;
  78.         NewGadget . ng_Height        = 12;
  79.         NewGadget . ng_GadgetText    = "_Dial";
  80.         NewGadget . ng_GadgetID        = Counter;
  81.         NewGadget . ng_Flags        = 0;
  82.         NewGadget . ng_LeftEdge        = 10;
  83.         NewGadget . ng_TopEdge        = SUBHEIGHT - 3 - NewGadget . ng_Height;
  84.  
  85.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  86.             GT_Underscore,    '_',
  87.         TAG_DONE);
  88.  
  89.         NewGadget . ng_GadgetText    = "D_elete Call";
  90.         NewGadget . ng_GadgetID        = Counter;
  91.         NewGadget . ng_LeftEdge        = NewGadget . ng_LeftEdge + Offset;
  92.  
  93.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  94.             GT_Underscore,    '_',
  95.         TAG_DONE);
  96.  
  97.         NewGadget . ng_GadgetText    = "_Cancel";
  98.         NewGadget . ng_GadgetID        = Counter;
  99.         NewGadget . ng_LeftEdge        = NewGadget . ng_LeftEdge + Offset;
  100.  
  101.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  102.             GT_Underscore,    '_',
  103.         TAG_DONE);
  104.     }
  105.  
  106.     return(Gadget);
  107. }
  108.  
  109. BYTE
  110. OpenSubWindow()
  111. {
  112.     if(SubCreateAllGadgets(&SubGadgetArray[0],&SubGadgetList,VisualInfo,Screen -> WBorTop + Screen -> Font -> ta_YSize + 1))
  113.     {
  114.         if(SubMenu = CreateMenus(CallMenu,
  115.             GTMN_FrontPen, 0,
  116.         TAG_DONE))
  117.         {
  118.             if(LayoutMenus(SubMenu,VisualInfo,
  119.                 GTMN_TextAttr,&DefaultFont,
  120.             TAG_DONE))
  121.             {
  122.                 if(PositionX == -1)
  123.                     PositionX = (Screen -> Width - SUBWIDTH) >> 1;
  124.  
  125.                 if(PositionY == -1)
  126.                     PositionY = Window -> Height - SUBHEIGHT;
  127.  
  128.                 if(SubWindow = OpenWindowTags(NULL,
  129.                     WA_Width,    SUBWIDTH,
  130.                     WA_Height,    SUBHEIGHT,
  131.  
  132.                     WA_Left,    PositionX,
  133.                     WA_Top,        PositionY,
  134.  
  135.                     WA_DragBar,    TRUE,
  136.                     WA_DepthGadget,    TRUE,
  137.                     WA_CloseGadget,    TRUE,
  138.                     WA_RMBTrap,    TRUE,
  139.                     WA_CustomScreen,Screen,
  140.  
  141.                     WA_IDCMP,    IDCMP_CLOSEWINDOW | BUTTONIDCMP | LISTVIEWIDCMP | IDCMP_MENUPICK,
  142.  
  143.                     WA_Title,    "Dial List",
  144.                 TAG_DONE))
  145.                 {
  146.                     AddGList(SubWindow,SubGadgetList,(UWORD)-1,(UWORD)-1,NULL);
  147.                     RefreshGList(SubGadgetList,SubWindow,NULL,(UWORD)-1);
  148.                     GT_RefreshWindow(SubWindow,NULL);
  149.  
  150.                     if(SubList)
  151.                     {
  152.                         SubItemNum = SubListNum - 1;
  153.  
  154.                         GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
  155.                             GTLV_Labels,SubList,
  156.                             GTLV_Selected,SubListNum,
  157.                         TAG_DONE);
  158.                     }
  159.  
  160.                     SetMenuStrip(SubWindow,SubMenu);
  161.  
  162.                     SubWindow -> Flags &= ~WFLG_RMBTRAP;
  163.  
  164.                     return(TRUE);
  165.                 }
  166.             }
  167.  
  168.             FreeMenus(SubMenu);
  169.             SubMenu = NULL;
  170.         }
  171.  
  172.         FreeGadgets(SubGadgetList);
  173.         SubGadgetList = NULL;
  174.     }
  175.  
  176.     return(FALSE);
  177. }
  178.  
  179. VOID
  180. CloseSubWindow()
  181. {
  182.     if(SubWindow)
  183.     {
  184.         SubWindow -> Flags |= WFLG_RMBTRAP;
  185.         ClearMenuStrip(SubWindow);
  186.  
  187.         if(SubGadgetList)
  188.             RemoveGList(SubWindow,SubGadgetList,(UWORD)-1);
  189.  
  190.         PositionX = SubWindow -> LeftEdge;
  191.         PositionY = SubWindow -> TopEdge;
  192.  
  193.         CloseWindow(SubWindow);
  194.  
  195.         SubWindow = NULL;
  196.     }
  197.  
  198.     if(SubMenu)
  199.     {
  200.         FreeMenus(SubMenu);
  201.  
  202.         SubMenu = NULL;
  203.     }
  204.  
  205.     if(SubGadgetList)
  206.     {
  207.         FreeGadgets(SubGadgetList);
  208.  
  209.         SubGadgetList = NULL;
  210.     }
  211. }
  212.  
  213. VOID
  214. AddSubEntry(LONG Entry)
  215. {
  216.     if(!SubList)
  217.     {
  218.         if(SubList = (struct List *)AllocMem(sizeof(struct List),MEMF_PUBLIC | MEMF_CLEAR))
  219.             NewList(SubList);
  220.     }
  221.  
  222.     if(SubList)
  223.     {
  224.         struct PhoneNode *SubNode;
  225.  
  226.         if(SubNode = (struct PhoneNode *)AllocMem(sizeof(struct PhoneNode),MEMF_PUBLIC|MEMF_CLEAR))
  227.         {
  228.             GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
  229.                 GTLV_Labels,~0,
  230.             TAG_DONE);
  231.  
  232.             SubNode -> VanillaNode . ln_Name    = Phonebook[Entry] -> Name;
  233.             SubNode -> Entry            = Phonebook[Entry];
  234.             SubNode -> Number            = Entry;
  235.  
  236.             AddTail(SubList,&SubNode -> VanillaNode);
  237.  
  238.             SubItemNum = SubListNum;
  239.  
  240.             GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
  241.                 GTLV_Labels,    SubList,
  242.                 GTLV_Selected,    SubListNum++,
  243.             TAG_DONE);
  244.         }
  245.     }
  246. }
  247.  
  248. BYTE
  249. RemSubEntry()
  250. {
  251.     struct PhoneNode    *SubNode;
  252.     LONG             i;
  253.  
  254.     SubNode = (struct PhoneNode *)SubList -> lh_Head;
  255.  
  256.     i = 0;
  257.  
  258.     while(i < SubItemNum)
  259.     {
  260.         SubNode = (struct PhoneNode *)SubNode -> VanillaNode . ln_Succ;
  261.  
  262.         i++;
  263.     }
  264.  
  265.     if(SubListNum)
  266.     {
  267.         if(SubItemNum == (--SubListNum))
  268.         {
  269.             if(SubItemNum)
  270.                 SubItemNum--;
  271.         }
  272.     }
  273.     else
  274.         SubItemNum = 0;
  275.  
  276.     if(SubWindow)
  277.     {
  278.         GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
  279.             GTLV_Labels,~0,
  280.         TAG_DONE);
  281.     }
  282.  
  283.     Remove(SubNode);
  284.  
  285.     FreeMem(SubNode,sizeof(struct PhoneNode));
  286.  
  287.     if(!SubListNum)
  288.     {
  289.         if(SubList)
  290.             FreeMem(SubList,sizeof(struct List));
  291.  
  292.         SubList = NULL;
  293.  
  294.         CloseSubWindow();
  295.  
  296.         return(TRUE);
  297.     }
  298.     else
  299.     {
  300.         if(SubWindow)
  301.         {
  302.             GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
  303.                 GTLV_Labels,SubList,
  304.                 GTLV_Selected,SubItemNum,
  305.             TAG_DONE);
  306.         }
  307.  
  308.         return(FALSE);
  309.     }
  310. }
  311.  
  312. VOID
  313. FreeSubList()
  314. {
  315.     if(SubList)
  316.     {
  317.         struct PhoneNode    *NextNode,*SubNode;
  318.         LONG             i;
  319.  
  320.         if(SubList -> lh_Head)
  321.             NextNode = (struct PhoneNode *)SubList -> lh_Head -> ln_Succ;
  322.         else
  323.             NextNode = NULL;
  324.  
  325.         SubNode = (struct PhoneNode *)SubList -> lh_Head;
  326.  
  327.         for(i = 0 ; i < SubListNum ; i++)
  328.         {
  329.             NextNode = (struct PhoneNode *)SubNode -> VanillaNode . ln_Succ;
  330.  
  331.             FreeMem(SubNode,sizeof(struct PhoneNode));
  332.  
  333.             SubNode = NextNode;
  334.         }
  335.  
  336.         SubListNum = 0;
  337.  
  338.         FreeMem(SubList,sizeof(struct List));
  339.  
  340.         SubList = NULL;
  341.     }
  342. }
  343.  
  344. BYTE
  345. HandleSubWindow(struct Window *PanelWindow)
  346. {
  347.     if(SubWindow)
  348.     {
  349.         struct IntuiMessage    *Massage;
  350.         ULONG             Class,Code;
  351.         struct Gadget        *Gadget;
  352.  
  353.         while(Massage = (struct IntuiMessage *)GT_GetIMsg(SubWindow -> UserPort))
  354.         {
  355.             Class    = Massage -> Class;
  356.             Code    = Massage -> Code;
  357.             Gadget    = (struct Gadget *)Massage -> IAddress;
  358.  
  359.             GT_ReplyIMsg(Massage);
  360.  
  361.             if(Class == IDCMP_MENUPICK)
  362.             {
  363.                 struct MenuItem *MenuItem;
  364.  
  365.                 while(Code != MENUNULL)
  366.                 {
  367.                     MenuItem = ItemAddress(SubMenu,Code);
  368.  
  369.                     switch((ULONG)MENU_USERDATA(MenuItem))
  370.                     {
  371.                         case MEN_QUITPANEL:    return(SUB_QUIT);
  372.  
  373.                         case MEN_CANCEL:    CloseSubWindow();
  374.                                     FreeSubList();
  375.  
  376.                                     return(0);
  377.  
  378.                         case MEN_NEXT:        if(SubItemNum == SubListNum - 1)
  379.                                         SubItemNum = 0;
  380.                                     else
  381.                                         SubItemNum++;
  382.  
  383.                                     GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
  384.                                         GTLV_Selected,SubItemNum,
  385.                                     TAG_DONE);
  386.  
  387.                                     break;
  388.  
  389.                         case MEN_PREV:        if(SubItemNum == 0)
  390.                                         SubItemNum = SubListNum - 1;
  391.                                     else
  392.                                         SubItemNum--;
  393.  
  394.                                     GT_SetGadgetAttrs(SubGadgetArray[0],SubWindow,NULL,
  395.                                         GTLV_Selected,SubItemNum,
  396.                                     TAG_DONE);
  397.  
  398.                                     break;
  399.  
  400.                         case MEN_WINDOW:    if(PanelWindow)
  401.                                     {
  402.                                         WindowToFront(PanelWindow);
  403.  
  404.                                         ActivateWindow(PanelWindow);
  405.                                     }
  406.  
  407.                                     break;
  408.  
  409.                         case MEN_DIALENTRY:    return(SUB_DIAL);
  410.                                     break;
  411.  
  412.                         case MEN_DELETECALL:    if(RemSubEntry())
  413.                                         return(0);
  414.  
  415.                                     break;
  416.  
  417.                         default:        break;
  418.                     }
  419.  
  420.                     Code = MenuItem -> NextSelect;
  421.                 }
  422.             }
  423.  
  424.             if(Class == IDCMP_CLOSEWINDOW)
  425.                 return(SUB_QUIT);
  426.  
  427.             if(Class == IDCMP_GADGETUP)
  428.             {
  429.                 switch(Gadget -> GadgetID)
  430.                 {
  431.                     case 0:    SubItemNum = Code;
  432.                         break;
  433.  
  434.                     case 1:    return(SUB_DIAL);
  435.                         break;
  436.  
  437.                     case 2:    if(RemSubEntry())
  438.                             return(0);
  439.  
  440.                         break;
  441.  
  442.                     case 3:    CloseSubWindow();
  443.  
  444.                         FreeSubList();
  445.  
  446.                         return(0);
  447.                 }
  448.             }
  449.         }
  450.     }
  451.  
  452.     return(0);
  453. }
  454.