home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 18 / amigaformatcd18.iso / -readerstuff- / steve_boxall / contact97gui_handle.c < prev    next >
C/C++ Source or Header  |  1997-07-18  |  38KB  |  1,687 lines

  1. /***********************************************
  2.     IDCMP Handler For Contact97
  3. ************************************************/
  4.  
  5. void ShowAboutContact97(void);
  6. void ShowEditContact97(char *name);
  7. void ShowFindContact97(void);
  8. void WriteDataFile(void);
  9. void updateStrGad(struct Window *win, struct Gadget *gad, UBYTE *newstr);
  10. void AddName(struct List *, struct List *, UBYTE *);
  11. void FreeNameNodes(struct List * list, int type);
  12. void UpdateLVList(struct Window *win,struct Gadget *gad,struct List *list,int num);
  13. struct List *FindAddrName(struct List *list, UBYTE *name);
  14. void AddAddr(struct List *list, struct AddressAddress *addrnode);
  15. void DeleteAddressLine(struct List *list,long number, int DelMode);
  16. void DeleteAddressName(struct List *list, UBYTE *name, int type);
  17. void NewAddrName(struct List *list, UBYTE *name);
  18. void LoadContactData(struct List *list1, struct List *list2);
  19. int ReadLine(char *s, int sdblim, FILE *input);
  20. char *substr(char *from, long start,long cnt);
  21. long ScanField(char *line,long start);
  22. void SaveDataFile(FILE *output,struct List *list, long DelMode);
  23. void DummyProjectIDCMP(struct Window *wnd);
  24. void AddTempName(struct List *list, struct NameNode *addrnode);
  25. void CheckName(struct List *list, UBYTE *name, struct Node *node);
  26. void CheckString(struct List *list, UBYTE *item, UBYTE *name, struct Node *node);
  27. struct List *FindItThen(UBYTE *name);
  28. void FindItWhen(struct List *list,UBYTE *name);
  29. void CheckAddress(struct List *list, UBYTE *name, struct Node *node);
  30. char *LocateFoundNode(struct List *list,long item);
  31. void PrintAddrNodes(struct List *list, char type[]);
  32. int WaitForPrinter(void);
  33. int PrintItNow(char *title,char *text);
  34. int PrintNameTitles(void);
  35. int PrintAddrNodes2(char *name, char type[]);
  36. int PrintItLine(char *title,char *text);
  37.  
  38. /***********************************************
  39.     Check for DblClick on Main Listview
  40. ************************************************/
  41.  
  42. int NameList01Clicked( void )
  43. {
  44.     /* routine when gadget "" is clicked. */
  45.  
  46.     long result=0;
  47.     long selected=-1;
  48.  
  49.     result=GT_GetGadgetAttrs(Project0Gadgets[4],Project0Wnd,NULL,GTLV_Selected,&selected,TAG_END);
  50.     if(result==1 && selected_g==selected)
  51.     {
  52.         Name01Clicked();
  53.         selected =-1;
  54.     }
  55.     selected_g=selected;
  56.  
  57.     ActivateGadget(Project0Gadgets[3],Project0Wnd,NULL);
  58.             
  59. }
  60.  
  61. /***********************************************
  62.     Add New Name Record Clicked
  63. ************************************************/
  64.  
  65. int Add01Clicked( void )
  66. {
  67.     /* routine when gadget "Add" is clicked. */
  68.  
  69.     if(Contact97Request(Project0Wnd,"Ok To Add New Name??\0","Ok|Cancel\0")==100)
  70.     {
  71.         if (FindName(NameList010List,GetString(Project0Gadgets[3]))==0)
  72.         {
  73.             AddName(NameList010List,AddrList010List,GetString(Project0Gadgets[3]));
  74.             Edit01Clicked();
  75.             UpdateLVList(Project0Wnd,Project0Gadgets[4],NameList010List,1);
  76.  
  77.  
  78.         }
  79.         else
  80.         {
  81.             Contact97Request(Project0Wnd,"Duplicate Name - Unable To Add\0","Ok\0");
  82.         }
  83.     }
  84. }
  85.  
  86. /***********************************************
  87.     Edit Record Clicked
  88. ************************************************/
  89.  
  90. int Edit01Clicked( void )
  91. {
  92.     /* routine when gadget "Edit" is clicked. */
  93.  
  94.     ShowEditContact97(GetString(Project0Gadgets[3]));
  95.  
  96. }
  97.  
  98. /***********************************************
  99.     Quit Contact97 Clicked    
  100. ************************************************/
  101.  
  102. int Quit01Clicked( void )
  103. {
  104.     /* routine when gadget "Quit" is clicked. */
  105.     return Project0CloseWindow();
  106. }
  107.  
  108. /***********************************************
  109.     Main LView entry box selected
  110. ************************************************/
  111.  
  112. int Name01Clicked( void )
  113. {
  114.     /* routine when gadget "" is clicked. */
  115.  
  116.     if(Project0RawKey()!=95)
  117.     {
  118.         if(FindName(NameList010List,GetString(Project0Gadgets[3]))==0)
  119.         {
  120.             Add01Clicked();
  121.         }
  122.         else
  123.         {
  124.             Edit01Clicked();
  125.         }
  126.     }
  127. }
  128.  
  129. /***********************************************
  130.     Find Button Clicked
  131. ************************************************/
  132.  
  133. int Find01Clicked( void )
  134. {
  135.     /* routine when gadget "Find" is clicked. */
  136.  
  137.     ShowFindContact97();
  138.  
  139. }
  140.  
  141. /***********************************************
  142.     Address LView Clicked
  143. ************************************************/
  144.  
  145. int Address01Clicked( void )
  146. {
  147.     /* routine when gadget "" is clicked. */
  148.  
  149.     ActivateGadget(Project1Gadgets[12],Project1Wnd,NULL);
  150.     
  151. }
  152.  
  153. /***********************************************
  154.     Add New Address Line Clicked
  155. ************************************************/
  156.  
  157. int AddAddress01Clicked( void )
  158. {
  159.         struct AddressAddress *addrnode=AllocMem(sizeof(struct AddressAddress),MEMF_CLEAR);
  160.  
  161.     AddAddr(addrlist_g, addrnode);
  162.  
  163.     UpdateLVList(Project1Wnd,Project1Gadgets[13],addrlist_g,1);
  164.  
  165.     GT_SetGadgetAttrs(Project1Gadgets[13],Project1Wnd,NULL,GTLV_Selected,999,GTLV_Top,999,TAG_END);
  166.  
  167.     ActivateGadget(Project1Gadgets[12],Project1Wnd,NULL);
  168.  
  169. }
  170.  
  171. /***********************************************
  172.     Delete Selected Address Line
  173. ************************************************/
  174.  
  175. int DelAddress01Clicked( void )
  176. {
  177.     /* routine when gadget "-" is clicked. */
  178.  
  179.     long result=0;
  180.     long selected=0;
  181.  
  182.     result=GT_GetGadgetAttrs(Project1Gadgets[13],Project1Wnd,NULL,GTLV_Selected,&selected,TAG_END);
  183.     if(result==1)
  184.     {
  185.         DeleteAddressLine(addrlist_g,selected,0);
  186.         UpdateLVList(Project1Wnd,Project1Gadgets[13],addrlist_g,1);
  187.     }
  188. }
  189.  
  190. /***********************************************
  191.     Keep Changes to Name / Address
  192. ************************************************/
  193.  
  194. int OkNew01Clicked( void )
  195. {
  196.     /* routine when gadget "Ok" is clicked on Edit Window. */
  197.  
  198.     struct NameNode *namenode;
  199.  
  200.     if((namenode=(struct NameNode *)FindName(NameList010List,GetString(Project1Gadgets[10])))!=0)
  201.     {
  202.         strcpy(namenode->nn_Address.AddrComp, GetString(Project1Gadgets[11]));
  203.         strcpy(namenode->nn_Address.AddrEmail, GetString(Project1Gadgets[14]));
  204.         strcpy(namenode->nn_Address.AddrTel, GetString(Project1Gadgets[15]));
  205.         strcpy(namenode->nn_Address.AddrFax, GetString(Project1Gadgets[16]));
  206.  
  207.         DeleteAddressName(AddrList010List,GetString(Project1Gadgets[10]),0);
  208.         NewAddrName(addrlist_g, GetString(Project1Gadgets[10]));
  209.     }
  210. return 100;    
  211. }
  212.  
  213. /***********************************************
  214.     Cancel Changes to name /address
  215. ************************************************/
  216.  
  217. int AddCancel01Clicked( void )
  218. {
  219.     /* routine when gadget "Cancel" is clicked. */
  220.     return 100;
  221. }
  222.  
  223. /***********************************************
  224.     Ignore Next 2 routines
  225. ************************************************/
  226.  
  227.  
  228. int ContactName01Clicked( void )
  229. {
  230.     /* routine when gadget "" is clicked. */
  231.  
  232.     Project1RawKey();
  233. }
  234.  
  235. int CompanyName01Clicked( void )
  236. {
  237.     /* routine when gadget "" is clicked. */
  238.  
  239.     Project1RawKey();
  240. }
  241.  
  242. /***********************************************
  243.     Update Address Item
  244. ************************************************/
  245.  
  246. int AddressText01Clicked( void )
  247. {
  248.     /* routine when gadget "" is clicked. */
  249.  
  250.     long result=0;
  251.     long selected=0;
  252.  
  253.     result=GT_GetGadgetAttrs(Project1Gadgets[13],Project1Wnd,NULL,GTLV_Selected,&selected,TAG_END);
  254.     
  255.     if(result==1 && Project1RawKey()!=95)
  256.     {
  257.         DeleteAddressLine(addrlist_g,selected,1);
  258.         UpdateLVList(Project1Wnd,Project1Gadgets[13],addrlist_g,1);
  259.     }
  260. }
  261.  
  262. /***********************************************
  263.     Ignore next 3 routines
  264. ************************************************/
  265.  
  266. int EmailEntry01Clicked( void )
  267. {
  268.     /* routine when gadget "" is clicked. */
  269.  
  270.     Project1RawKey();
  271. }
  272.  
  273. int PhoneEntry01Clicked( void )
  274. {
  275.     /* routine when gadget "" is clicked. */
  276.  
  277.     Project1RawKey();
  278. }
  279.  
  280. int FaxEntry01Clicked( void )
  281. {
  282.     /* routine when gadget "" is clicked. */
  283.  
  284.     Project1RawKey();
  285. }
  286.  
  287.  
  288. int AboutOk1Clicked( void )
  289. {
  290.     /* routine when gadget "Continue" is clicked. */
  291.     return 100;
  292. }
  293.  
  294. int Project0Item0( void )
  295. {
  296.     /* routine when (sub)item "Add" is selected. */
  297.  
  298.     Add01Clicked();
  299.  
  300. }
  301.  
  302. int Project0Edit01( void )
  303. {
  304.     /* routine when (sub)item "Edit" is selected. */
  305.  
  306.     Edit01Clicked();
  307.  
  308. }
  309.  
  310. int Project0Find01( void )
  311. {
  312.     /* routine when (sub)item "Find" is selected. */
  313.  
  314.     ShowFindContact97();
  315.  
  316. }
  317.  
  318. int Project0About01( void )
  319. {
  320.     /* routine when (sub)item "About" is selected. */
  321.  
  322.     ShowAboutContact97();
  323. return 0;
  324. }
  325.  
  326. int Project0Quit01( void )
  327. {
  328.     /* routine when (sub)item "Quit" is selected. */
  329.     return Project0CloseWindow();
  330. }
  331.  
  332. int Project0CloseWindow( void )
  333. {
  334.     /* routine for "IDCMP_CLOSEWINDOW". */
  335.  
  336.     int reply=0;
  337.  
  338.     reply=Contact97Request(Project0Wnd,"Save Contact97 Data Changes??\0","Yes|No\0");
  339.  
  340.     if(reply !=0)
  341.     {
  342.         WriteDataFile();
  343.     }
  344.  
  345.     return Contact97Request(Project0Wnd,"Quit Contact97??\0","Ok|Cancel\0");
  346. }
  347.  
  348. int Project1CloseWindow( void )
  349. {
  350.     /* routine for "IDCMP_CLOSEWINDOW". */
  351.  
  352.     return 100;
  353. }
  354.  
  355. int Project2CloseWindow( void )
  356. {
  357.     /* routine for "IDCMP_CLOSEWINDOW". */
  358.     return 100;
  359. }
  360.  
  361. int Project3CloseWindow( void )
  362. {
  363.     /* routine for "IDCMP_CLOSEWINDOW". */
  364.     return 100;
  365. }
  366.  
  367.  
  368.  
  369. /***********************************************
  370.     Show Contact97 AboutBox
  371. ************************************************/
  372.  
  373. void ShowAboutContact97(void)
  374. {
  375.     int runninga=0;
  376.  
  377.     OpenProject3Window();
  378.  
  379.     while(runninga!=100)
  380.     {
  381.         runninga=HandleProject3IDCMP();
  382.         DummyProjectIDCMP(Project0Wnd);
  383.     }
  384.  
  385.     CloseProject3Window();
  386.  
  387. }
  388.  
  389.  
  390.  
  391. /***********************************************
  392.     Kill Contact97 (Ok|Cancel)
  393. ************************************************/
  394.  
  395. int Contact97Request(struct Window *Win, char *MessageRequest, char *ReplyGadget)
  396. {
  397.     struct EasyStruct Contact97ES = {
  398.         sizeof (struct EasyStruct),
  399.         0,
  400.         "Contact97 Request",
  401.         MessageRequest,
  402.         ReplyGadget
  403.         };
  404.     int reply =0;
  405.  
  406.     reply=EasyRequest( Win, &Contact97ES, NULL, NULL);
  407.  
  408.     if(reply ==1)
  409.     {
  410.         reply =100;
  411.     }
  412.     return reply;
  413. }
  414.  
  415. /***********************************************
  416.     Show Contact97 Edit Window
  417. ************************************************/
  418.  
  419. void ShowEditContact97(char *name)
  420. {
  421.     int runninga=0;
  422.  
  423.     struct NameNode *namenode;
  424.     struct List *addrnode;
  425.  
  426.     if((namenode=(struct NameNode *)FindName(NameList010List,name))!=0)
  427.     {
  428.         addrnode=FindAddrName(AddrList010List,name);
  429.         addrlist_g=addrnode;
  430.  
  431.         OpenProject1Window();
  432.  
  433.         updateStrGad(Project1Wnd,Project1Gadgets[10],name);
  434.         updateStrGad(Project1Wnd,Project1Gadgets[11],namenode->nn_Address.AddrComp);
  435.         updateStrGad(Project1Wnd,Project1Gadgets[14],namenode->nn_Address.AddrEmail);
  436.         updateStrGad(Project1Wnd,Project1Gadgets[15],namenode->nn_Address.AddrTel);
  437.         updateStrGad(Project1Wnd,Project1Gadgets[16],namenode->nn_Address.AddrFax);
  438.  
  439.         UpdateLVList(Project1Wnd,Project1Gadgets[13],addrnode,1);
  440.         
  441.         while(runninga!=100)
  442.         {
  443.             runninga=HandleProject1IDCMP();
  444.  
  445.             if(Project0Wnd!=NULL)
  446.             {
  447.                 DummyProjectIDCMP(Project0Wnd);
  448.             }
  449.  
  450.             if(Project2Wnd!=NULL)
  451.             {
  452.                 DummyProjectIDCMP(Project2Wnd);
  453.             }
  454.         
  455.         }
  456.  
  457.         CloseProject1Window();
  458.  
  459.         addrlist_g=NULL;
  460.     }
  461. }
  462.  
  463. /***********************************************
  464.     Show Contact97 Find Window
  465. ************************************************/
  466.  
  467. void ShowFindContact97(void)
  468. {
  469.     int runninga=0;
  470.     OpenProject2Window();
  471.  
  472.     ActivateGadget(Project2Gadgets[4],Project2Wnd,NULL);
  473.  
  474.     while(runninga!=100)
  475.     {
  476.         runninga=HandleProject2IDCMP();
  477.         DummyProjectIDCMP(Project0Wnd);        
  478.     }
  479.  
  480.     CloseProject2Window();
  481. }
  482.  
  483. /***********************************************
  484.     Open Contact97.dat for Write Access
  485. ************************************************/
  486.  
  487. void WriteDataFile(void)
  488. {
  489.     FILE *output;
  490.  
  491.     output=fopen("s:contact97.dat","w");
  492.     if(output >0)
  493.     {
  494.         SaveDataFile(output,NameList010List,0);
  495.         SaveDataFile(output,AddrList010List,1);
  496.         fclose(output);
  497.     }
  498.     else
  499.     {
  500.         Contact97Request(Project0Wnd,"Unable to Save Contact97 Data\0","Ok\0");
  501.     }
  502. }
  503.     
  504.  
  505. /************************************************
  506.     Load Contact97 Data File (contact97.dat)
  507. *************************************************/
  508.  
  509. void LoadContactData(struct List *list1, struct List *list2)
  510. {
  511.     char *arg;
  512.     char line[141];
  513.     long start=0;
  514.     long end=0;
  515.     struct NameNode *namenode;
  516.     struct AddressAddress *addrnode;
  517.  
  518.     int i=0;
  519.     FILE *input=fopen("s:contact97.dat","r");
  520.     
  521.     if(input >0)
  522.     {
  523.         while(!feof(input))
  524.         {
  525.             ReadLine(line,140,input);
  526.             
  527.             start=ScanField(line,0);
  528.             arg=substr(line,0,start);
  529.  
  530.             if(strcmp("01",arg)==0 || strcmp("02",arg)==0)
  531.             {
  532.                 start++;
  533.  
  534.                 if(strcmp("01",arg)==0)
  535.                 {
  536.                     free(arg);
  537.  
  538.                     namenode=AllocMem(sizeof(struct NameNode),MEMF_CLEAR);
  539.                     if(!(namenode))
  540.                     {
  541.                     }
  542.                     else
  543.                     {
  544.                 /************************************************
  545.                     Data field 1
  546.                 *************************************************/
  547.                                         
  548.                         end=ScanField(line,start);
  549.                         arg=substr(line,start,end);
  550.  
  551.                         strcpy(namenode->nn_Address.AddrName,arg);
  552.  
  553.                         start=start+end+1;
  554.                         free(arg);
  555.  
  556.                 /************************************************
  557.                     Data field 2
  558.                 *************************************************/
  559.                                         
  560.                         end=ScanField(line,start);
  561.                         arg=substr(line,start,end);
  562.  
  563.                         strcpy(namenode->nn_Address.AddrComp,arg);
  564.  
  565.                         start=start+end+1;
  566.  
  567.                         free(arg);
  568.  
  569.                 /************************************************
  570.                     Data field 3
  571.                 *************************************************/
  572.                                         
  573.                         end=ScanField(line,start);
  574.                         arg=substr(line,start,end);
  575.  
  576.                         strcpy(namenode->nn_Address.AddrEmail,arg);
  577.  
  578.                         start=start+end+1;
  579.  
  580.                         free(arg);
  581.  
  582.                 /************************************************
  583.                     Data field 4
  584.                 *************************************************/
  585.                                         
  586.                         end=ScanField(line,start);
  587.                         arg=substr(line,start,end);
  588.  
  589.                         strcpy(namenode->nn_Address.AddrTel,arg);
  590.  
  591.                         start=start+end+1;
  592.  
  593.                         free(arg);
  594.  
  595.                 /************************************************
  596.                     Data field 5
  597.                 *************************************************/
  598.                                         
  599.                         end=ScanField(line,start);
  600.                         arg=substr(line,start,end);
  601.  
  602.                         strcpy(namenode->nn_Address.AddrFax,arg);
  603.  
  604.                         start=start+end+1;
  605.  
  606.                         free(arg);
  607.                             namenode->nn_Node.ln_Name = namenode->nn_Address.AddrName;
  608.                             namenode->nn_Node.ln_Type = NAMENODE_ID;
  609.                             namenode->nn_Node.ln_Pri  = 0;
  610.                             AddTail((struct List *)list1,(struct Node *)namenode);
  611.                     }
  612.  
  613.                 }
  614.                 if(strcmp("02",arg)==0)
  615.                 {
  616.                     free(arg);
  617.  
  618.                     addrnode=AllocMem(sizeof(struct AddressAddress),MEMF_CLEAR);
  619.                     if(!(addrnode))
  620.                     {
  621.                     }
  622.                     else
  623.                     {
  624.                 /************************************************
  625.                     Data field 1
  626.                 *************************************************/
  627.                                         
  628.                         end=ScanField(line,start);
  629.                         arg=substr(line,start,end);
  630.  
  631.                         addrnode->nn_Node.ln_Name=((struct NameNode *)FindName(list1,arg))->nn_Address.AddrName;
  632.  
  633.                         start=start+end+1;
  634.                         free(arg);
  635.  
  636.                 /************************************************
  637.                     Data field 2
  638.                 *************************************************/
  639.                                         
  640.                         end=ScanField(line,start);
  641.                         arg=substr(line,start,end);
  642.  
  643.                         strcpy(addrnode->nn_Data,arg);
  644.  
  645.                         start=start+end+1;
  646.  
  647.                         free(arg);
  648.  
  649.                             addrnode->nn_Node.ln_Type = ADDRNODE_ID;
  650.                             addrnode->nn_Node.ln_Pri  = 0;
  651.                             AddTail((struct List *)list2,(struct Node *)addrnode);
  652.                     }
  653.                 }
  654.             }
  655.             else
  656.             {
  657.                 free(arg);
  658.             }
  659.  
  660.         }
  661.         fclose(input);
  662.     }
  663. }
  664.  
  665. /************************************************
  666.     Read a line from the Contact Data file
  667. *************************************************/
  668.  
  669. int ReadLine(char *s, int sdblim, FILE *input)
  670. {
  671.     int c,i;
  672.     for(i=0;i<sdblim-1 && (c=getc(input))!=EOF && c!='\n';i++)
  673.     {
  674.         s[i]=c;
  675.     }
  676.     s[i]='\0';
  677. return i;
  678. }
  679.  
  680. /************************************************
  681.     Obtain a sub string from string
  682. *************************************************/
  683.  
  684. char *substr(char *from,long start,long cnt)
  685. {
  686.     char *arg;
  687.     arg=calloc(sizeof(char),cnt+1);
  688.     strncpy(arg,&from[start],cnt);
  689.     arg[cnt]='\0';
  690. return arg;
  691. }
  692.  
  693.  
  694. /************************************************
  695.     Find Length of Data Field
  696. *************************************************/
  697.  
  698. long ScanField(char *line,long start)
  699. {
  700. return    strcspn(&line[start],",\n");
  701. }
  702.  
  703. /************************************************
  704.     Update string gadget to show new entry
  705. *************************************************/
  706.  
  707. void updateStrGad(struct Window *win, struct Gadget *gad, UBYTE *newstr)
  708. {
  709.  
  710. /************************************************
  711.     remove gadget from display before changing contents
  712. *************************************************/
  713.  
  714.     RemoveGList(win,gad,1);
  715.  
  716. /************************************************
  717.     Change contents and reset current cursor positions in string
  718. *************************************************/
  719.     
  720.     strcpy(((struct StringInfo *) (gad->SpecialInfo))->Buffer,newstr);
  721.  
  722.     ((struct StringInfo *)(gad->SpecialInfo))->BufferPos =0;
  723.     ((struct StringInfo *)(gad->SpecialInfo))->DispPos =0;
  724.  
  725. /************************************************
  726.     Add Gadget back to display and refresh
  727. *************************************************/
  728.  
  729.     AddGList(win,gad,~0,1,NULL);
  730.     RefreshGList(gad,win,NULL,1);
  731.  
  732. /************************************************
  733.     Finally re-activate string gadget
  734. *************************************************/
  735.  
  736.     ActivateGadget(gad,win,NULL);
  737.  
  738. }
  739.  
  740. /***********************************************
  741.     Add New Record to List(s)
  742. ************************************************/
  743.  
  744. void AddName(struct List *list, struct *list2, UBYTE *name)
  745. {
  746.     struct NameNode *namenode;
  747.     struct AddressAddress *addrnode;
  748.  
  749.     namenode = AllocMem(sizeof(struct NameNode),MEMF_CLEAR);
  750.     addrnode = AllocMem(sizeof(struct AddressAddress),MEMF_CLEAR);
  751.  
  752.         if (!(namenode) || !(addrnode))
  753.     {
  754.     }
  755.         else
  756.     {
  757.             strcpy(namenode->nn_Address.AddrName,name);
  758.             namenode->nn_Node.ln_Name = namenode->nn_Address.AddrName;
  759.             namenode->nn_Node.ln_Type = NAMENODE_ID;
  760.             namenode->nn_Node.ln_Pri  = 0;
  761.             AddHead((struct List *)list,(struct Node *)namenode);
  762.  
  763.         addrnode->nn_Node.ln_Name = namenode->nn_Address.AddrName; 
  764.             addrnode->nn_Node.ln_Type = ADDRNODE_ID;
  765.             addrnode->nn_Node.ln_Pri  = 0;
  766.             AddTail((struct List *)list2,(struct Node *)addrnode);
  767.         }
  768. }
  769.  
  770. void UpdateLVList(struct Window *win,struct Gadget *gad,struct List *list,int num)
  771. {
  772.     /************************************************
  773.         Remove Gadget prior to update
  774.     *************************************************/
  775.  
  776.     RemoveGList(win,gad,num);
  777.  
  778.     /************************************************
  779.         Update ListView Display
  780.     *************************************************/
  781.  
  782.     GT_SetGadgetAttrs(gad,win,NULL,GTLV_Labels,~0,TAG_DONE);
  783.     GT_SetGadgetAttrs(gad,win,NULL,GTLV_Labels,list,TAG_DONE);
  784.  
  785.     /************************************************
  786.         Gadget updated now add back to window
  787.     *************************************************/
  788.  
  789.     AddGList(win,gad,~0,num,NULL);
  790.     RefreshGList(gad,win,NULL,num);
  791.  
  792.     /*
  793.         Done???
  794.     */
  795. }
  796.  
  797. /***********************************************
  798.      Find Name in Address Master and create temp list of Address
  799. ************************************************/
  800.  
  801. struct List *FindAddrName(struct List *list, UBYTE *name)
  802. {
  803.     struct AddrAddress *node2;
  804.  
  805.     struct List *list2;
  806.  
  807.     list2=AllocMem(sizeof(struct List),MEMF_CLEAR);
  808.  
  809.     NewList(list2);
  810.  
  811.     if (node2 =(struct AddressAddress *) FindName(list,name)) 
  812.     {
  813.         while(node2>0)
  814.         {
  815.             AddAddr(list2,node2);
  816.             node2 = (struct AddressAddress *)FindName(node2,name);
  817.         }
  818.                
  819.     
  820.         }
  821. return list2;
  822. }
  823.  
  824. /***********************************************
  825.     Allocate a AddrNode structure, copy the given name into the structure,
  826.     then add it the specified list.  
  827. ************************************************/
  828.  
  829. void AddAddr(struct List *list, struct AddressAddress *addrnode)
  830. {
  831.     struct AddressAddress *namenode=AllocMem(sizeof(struct AddressAddress),MEMF_CLEAR);
  832.     if(!(namenode))
  833.     {
  834.     }
  835.     else
  836.     {
  837.             namenode->nn_Node.ln_Name = addrnode->nn_Data;
  838.             namenode->nn_Node.ln_Type = NAMENODE_ID;
  839.             namenode->nn_Node.ln_Pri  = 0;
  840.             AddTail((struct List *)list,(struct Node *)namenode);
  841.     }
  842. }
  843.  
  844. /***********************************************
  845.     Delete / Update the Address Line Selected in a list.
  846. ************************************************/
  847.  
  848. void DeleteAddressLine(struct List *list,long number, int DelMode)
  849. {
  850. struct Node *node;
  851.  
  852.     long count=0;
  853.  
  854.     if (list->lh_TailPred == (struct Node *)list)
  855.     {
  856.     } 
  857.     else
  858.     {
  859.         for (node = list->lh_Head ; node->ln_Succ ; node = node->ln_Succ)
  860.         {
  861.             if(count==number && count >=0)
  862.             {
  863.                 if(DelMode ==0)
  864.                 {
  865.                     Remove(node);
  866.                     FreeMem(node,sizeof(struct AddressAddress));
  867.                 }
  868.                 else
  869.                 {
  870.                     strcpy(node->ln_Name,GetString(Project1Gadgets[12]));
  871.                 }
  872.             }
  873.             count++;
  874.         }
  875.     }
  876. }
  877.  
  878. /***********************************************
  879.     Delete ALL Address Nodes with a specified name.
  880. ************************************************/
  881.  
  882. void DeleteAddressName(struct List *list, UBYTE *name, int type)
  883. {
  884.     struct Node *node;
  885.  
  886.     if (node = FindName(list,name))
  887.     {
  888.         while(node>0)
  889.         {
  890.             Remove(node);
  891.             if(type==0)
  892.             {
  893.                 FreeMem(node,sizeof(struct AddressAddress));
  894.             }
  895.             else
  896.             {
  897.                 FreeMem(node,sizeof(struct NameNode));
  898.             }
  899.             node = FindName(list,name);
  900.         }
  901.     }
  902. }
  903.  
  904. /***********************************************
  905.     Add Back changes to Address list for Name
  906. ************************************************/
  907.  
  908. void NewAddrName(struct List *list, UBYTE *name)
  909. {
  910.     struct NameNode *namenode;
  911.     struct Node *node;
  912.     struct AddressAddress *addrname;
  913.  
  914.     namenode=(struct NameNode *)FindName(NameList010List,name);
  915.  
  916.     while (list->lh_TailPred!=(struct List *)list) 
  917.     {
  918.         node=(struct node *)list->lh_Head;
  919.         Remove(node);
  920.  
  921.         addrname=(struct AddressAddress *)node;
  922.         strcpy(addrname->nn_Data,addrname->nn_Node.ln_Name);
  923.         addrname->nn_Node.ln_Name = namenode->nn_Address.AddrName;
  924.         
  925.             AddTail((struct List *)AddrList010List,(struct Node *)addrname);        
  926.         }
  927. }
  928.  
  929. /***********************************************
  930.     Save Data File to Contact97.dat
  931. ************************************************/
  932.  
  933. void SaveDataFile(FILE *output,struct List *list, long DelMode)
  934. {
  935.     struct Node *node;
  936.     struct NameNode *namenode;
  937.     struct AddressAddress *addrnode;
  938.  
  939.     if (list->lh_TailPred == (struct Node *)list)
  940.     {
  941.     } 
  942.     else
  943.     {
  944.         for (node = list->lh_Head ; node->ln_Succ ; node = node->ln_Succ)
  945.         {
  946.             if(DelMode ==0)
  947.             {
  948.                 namenode=(struct NameNode *)node;
  949.                 fprintf(output,"01,%s,%s,%s,%s,%s\n",namenode->nn_Address.AddrName,namenode->nn_Address.AddrComp,namenode->nn_Address.AddrEmail,namenode->nn_Address.AddrTel,namenode->nn_Address.AddrFax);
  950.             }
  951.             else
  952.             {
  953.                 addrnode=(struct AddressAddress *)node;
  954.                 fprintf(output,"02,%s,%s\n",addrnode->nn_Node.ln_Name,addrnode->nn_Data);
  955.             }
  956.         }
  957.     }
  958. }
  959.  
  960. /***********************************************
  961.     Delete Selected Name from Names/Address
  962. ************************************************/
  963.  
  964. int Delete01Clicked( void )
  965. {
  966.     /* routine when gadget "Delete" is clicked. */
  967.  
  968.     int reply=0;
  969.  
  970.     reply=Contact97Request(Project0Wnd,"*** Delete Selected Name?? ***\0","Ok|Cancel\0");
  971.  
  972.     if(reply !=0)
  973.     {
  974.         if (FindName(NameList010List,GetString(Project0Gadgets[3]))!=0)
  975.         {
  976.             DeleteAddressName(AddrList010List,GetString(Project0Gadgets[3]),0);
  977.             DeleteAddressName(NameList010List,GetString(Project0Gadgets[3]),1);
  978.             UpdateLVList(Project0Wnd,Project0Gadgets[4],NameList010List,1);
  979.         }
  980.             
  981.     }
  982.  
  983.  
  984. }
  985.  
  986. /***********************************************
  987.     Delete Name selected (menu)
  988. ************************************************/
  989.  
  990. int Project0Delete01( void )
  991. {
  992.     /* routine when (sub)item "Delete Name" is selected. */
  993.  
  994.     return Delete01Clicked();
  995. }
  996.  
  997. /***********************************************
  998.     Disable Project Window Gadgets
  999. ************************************************/
  1000.  
  1001. void DummyProjectIDCMP(struct Window *wnd )
  1002. {
  1003.     struct IntuiMessage    *m;
  1004.  
  1005.     while( m = GT_GetIMsg( wnd->UserPort ))
  1006.     {
  1007.  
  1008.         GT_ReplyIMsg( m );
  1009.  
  1010.     }
  1011. }
  1012.  
  1013. /***********************************************
  1014.     Free List Nodes of type Name / Address
  1015. ************************************************/
  1016.  
  1017. void FreeNameNodes(struct List *list,int type)
  1018. {
  1019.     struct Node *node;
  1020.  
  1021.     while(list->lh_TailPred!=(struct Node *)list)
  1022.     {
  1023.         node=(struct Node *)list->lh_Head;
  1024.         Remove(node);
  1025.  
  1026.         if(type==0)
  1027.         {
  1028.             FreeMem(node,sizeof(struct AddressAddress));
  1029.         }
  1030.         else
  1031.         {
  1032.             FreeMem(node,sizeof(struct NameNode));
  1033.         }
  1034.     }
  1035.  
  1036. }
  1037.  
  1038. /***********************************************
  1039.     Find sub-string entered
  1040. ************************************************/
  1041.  
  1042. int FindContact01Clicked( void )
  1043. {
  1044.     /* routine when gadget "Find" is clicked. */
  1045.  
  1046.     if(Project2RawKey()!=95)
  1047.     {
  1048.         GT_SetGadgetAttrs(Project2Gadgets[2],Project2Wnd,NULL,GTLV_Labels,~0,TAG_DONE);
  1049.  
  1050.         namelist_g=FindItThen(GetString(Project2Gadgets[4]));
  1051.  
  1052.         UpdateLVList(Project2Wnd,Project2Gadgets[2],namelist_g,1);    
  1053.     
  1054.         ActivateGadget(Project2Gadgets[4],Project2Wnd,NULL);
  1055.     }    
  1056. }
  1057.  
  1058. /***********************************************
  1059.     Cancel Find window
  1060. ************************************************/
  1061.  
  1062. int CancelFind01Clicked( void )
  1063. {
  1064.     /* routine when gadget "Cancel" is clicked. */
  1065.     return 100;
  1066. }
  1067.  
  1068. /***********************************************
  1069.     Find Item Found Selection
  1070. ************************************************/
  1071.  
  1072. int FindResult01Clicked( void )
  1073. {
  1074.     /* routine when gadget "Result" is clicked. */
  1075.  
  1076.     char *name=NULL;
  1077.     long result=0;
  1078.     long selected=-1;
  1079.  
  1080.     result=GT_GetGadgetAttrs(Project2Gadgets[2],Project2Wnd,NULL,GTLV_Selected,&selected,TAG_END);
  1081.  
  1082.     if(result==1 && selected_g==selected)
  1083.     {
  1084.         name=LocateFoundNode(namelist_g,selected);
  1085.         
  1086.         if(name!=NULL) ShowEditContact97(name);
  1087.  
  1088.         selected =-1;
  1089.     }
  1090.     selected_g=selected;
  1091.  
  1092.     ActivateGadget(Project2Gadgets[4],Project2Wnd,NULL);    
  1093.  
  1094. }
  1095.  
  1096. /***********************************************
  1097.     Find sub-string entered
  1098. ************************************************/
  1099.  
  1100. int FindEdit01Clicked( void )
  1101. {
  1102.     /* routine when gadget "" is clicked. */
  1103.  
  1104. return    FindContact01Clicked();
  1105. }
  1106.  
  1107. /***********************************************
  1108.     Allocate a AddrNode structure, copy the given name into the structure,
  1109.     then add it the specified list.  
  1110. ************************************************/
  1111.  
  1112. void AddTempName(struct List *list, struct NameNode *addrnode)
  1113. {
  1114.     struct Node *namenode=AllocMem(sizeof(struct Node),MEMF_CLEAR);
  1115.     if(!(namenode))
  1116.     {
  1117.     }
  1118.     else
  1119.     {
  1120.             namenode->ln_Name = addrnode->nn_Address.AddrName;
  1121.             namenode->ln_Type = NAMENODE_ID;
  1122.             namenode->ln_Pri  = 0;
  1123.             AddTail((struct List *)list,(struct Node *)namenode);
  1124.     }
  1125. }
  1126.  
  1127. struct List *FindItThen(UBYTE *name)
  1128. {
  1129.     struct Node *node;
  1130.     struct List *list2;
  1131.     long selected;
  1132.     long result;
  1133.  
  1134.     list2=AllocMem(sizeof(struct List),MEMF_CLEAR);
  1135.  
  1136.     NewList(list2);
  1137.  
  1138.     namelist_g=list2;
  1139.  
  1140.     if(node=FindName(NameList010List,name))
  1141.     {
  1142.         result=GT_GetGadgetAttrs(Project2Gadgets[12],Project2Wnd,NULL,GTCB_Checked,&selected,TAG_END);
  1143.         if(result==1 && selected==TRUE)
  1144.         {
  1145.             CheckName(list2,name,node);
  1146.         }
  1147.     }
  1148.     else
  1149.     {
  1150.         FindItWhen(list2,name);
  1151.     }
  1152. return list2;
  1153. }
  1154.  
  1155. void FindItWhen(struct List *list,UBYTE *name)
  1156. {
  1157.     struct Node *node;
  1158.     long selected;
  1159.     long result;
  1160.  
  1161.     for(node=NameList010List->lh_Head;node->ln_Succ;node=node->ln_Succ)
  1162.     {
  1163.         result=GT_GetGadgetAttrs(Project2Gadgets[12],Project2Wnd,NULL,GTCB_Checked,&selected,TAG_END);
  1164.         if(result==1 && selected==TRUE)
  1165.         {
  1166.             CheckString(list,((struct NameNode *)node)->nn_Address.AddrName,name,node);    
  1167.         }
  1168.  
  1169.         result=GT_GetGadgetAttrs(Project2Gadgets[6],Project2Wnd,NULL,GTCB_Checked,&selected,TAG_END);
  1170.         if(result==1 && selected==TRUE)
  1171.         {
  1172.             CheckString(list,((struct NameNode *)node)->nn_Address.AddrComp,name,node);    
  1173.         }
  1174.  
  1175.         result=GT_GetGadgetAttrs(Project2Gadgets[8],Project2Wnd,NULL,GTCB_Checked,&selected,TAG_END);
  1176.         if(result==1 && selected==TRUE)
  1177.         {
  1178.             CheckString(list,((struct NameNode *)node)->nn_Address.AddrEmail,name,node);    
  1179.         }
  1180.  
  1181.         result=GT_GetGadgetAttrs(Project2Gadgets[9],Project2Wnd,NULL,GTCB_Checked,&selected,TAG_END);
  1182.         if(result==1 && selected==TRUE)
  1183.         {
  1184.             CheckString(list,((struct NameNode *)node)->nn_Address.AddrTel,name,node);    
  1185.         }
  1186.  
  1187.         result=GT_GetGadgetAttrs(Project2Gadgets[10],Project2Wnd,NULL,GTCB_Checked,&selected,TAG_END);
  1188.         if(result==1 && selected==TRUE)
  1189.         {
  1190.             CheckString(list,((struct NameNode *)node)->nn_Address.AddrFax,name,node);    
  1191.         }
  1192.  
  1193.         result=GT_GetGadgetAttrs(Project2Gadgets[7],Project2Wnd,NULL,GTCB_Checked,&selected,TAG_END);
  1194.         if(result==1 && selected==TRUE)
  1195.         {
  1196.             CheckAddress(list,name,node);
  1197.         }
  1198.     }
  1199. }
  1200.  
  1201. void CheckString(struct List *list, UBYTE *item, UBYTE *name, struct Node *node)
  1202. {
  1203.     char *item1;
  1204.     char *name1;
  1205.     int i;
  1206.  
  1207.     item1=calloc(strlen(item)+1,sizeof(char));
  1208.     name1=calloc(strlen(name)+1,sizeof(char));
  1209.  
  1210.  
  1211.     for(i=0;i<=strlen(item);i++)
  1212.     {
  1213.         item1[i]=ToUpper(item[i]);
  1214.     }
  1215.  
  1216.     for(i=0;i<=strlen(name);i++)
  1217.     {
  1218.         name1[i]=ToUpper(name[i]);
  1219.     }
  1220.  
  1221.     if(strstr(item1,name1)!=NULL)
  1222.     {
  1223.         CheckName(list,node->ln_Name,node);
  1224.     }
  1225.  
  1226.     if(item1!=NULL) free(item1);
  1227.     if(name1!=NULL) free(name1);
  1228. }
  1229.  
  1230. void CheckName(struct List *list, UBYTE *name, struct Node *node)
  1231. {
  1232.     if(FindName(namelist_g,name)!=0)
  1233.     {
  1234.     }
  1235.     else
  1236.     {
  1237.         AddTempName(namelist_g,(struct NameNode *)FindName(NameList010List,name));
  1238.     }
  1239. }
  1240.  
  1241. /***********************************************
  1242.      Find sub-string in Address Master
  1243. ************************************************/
  1244.  
  1245. void CheckAddress(struct List *list, UBYTE *name, struct Node *node)
  1246. {
  1247.     struct Node *node2;
  1248.  
  1249.     if (node2 =FindName(AddrList010List,((struct NameNode *)node)->nn_Node.ln_Name)) 
  1250.     {
  1251.         while(node2>0)
  1252.         {
  1253.             CheckString(list,((struct AddressAddress *)node2)->nn_Data,name,node);
  1254.             node2 = FindName(node2,((struct NameNode *)node)->nn_Node.ln_Name);
  1255.         }
  1256.                
  1257.     
  1258.         }
  1259. }
  1260.  
  1261. int fndchk01Clicked( void )
  1262. {
  1263.     /* routine when gadget "Company" is clicked. */
  1264.     ActivateGadget(Project2Gadgets[4],Project2Wnd,NULL);    
  1265. }
  1266.  
  1267. int fndchk02Clicked( void )
  1268. {
  1269.     /* routine when gadget "Address" is clicked. */
  1270.  
  1271. return fndchk01Clicked();
  1272. }
  1273.  
  1274. int fndchk03Clicked( void )
  1275. {
  1276.     /* routine when gadget "Email" is clicked. */
  1277.  
  1278. return fndchk01Clicked();
  1279. }
  1280.  
  1281. int fndchk04Clicked( void )
  1282. {
  1283.     /* routine when gadget "Phone" is clicked. */
  1284.  
  1285. return fndchk01Clicked();
  1286. }
  1287.  
  1288. int fndchk05Clicked( void )
  1289. {
  1290.     /* routine when gadget "Fax" is clicked. */
  1291.  
  1292. return fndchk01Clicked();
  1293. }
  1294.  
  1295. int fndchk06Clicked( void )
  1296. {
  1297.     /* routine when gadget "Name" is clicked. */
  1298.  
  1299. return fndchk01Clicked();
  1300. }
  1301.  
  1302. char *LocateFoundNode(struct List *list,long item)
  1303. {
  1304.     struct Node *node;
  1305.     char *name=NULL;
  1306.     long count=0;
  1307.  
  1308.     if (list->lh_TailPred == (struct Node *)list)
  1309.     {
  1310.     } 
  1311.     else
  1312.     {
  1313.         for (node = list->lh_Head ; node->ln_Succ ; node = node->ln_Succ)
  1314.         {
  1315.             if(count==item && count >=0)
  1316.             {
  1317.                 name=node->ln_Name;
  1318.             }
  1319.             count++;
  1320.         }
  1321.     }
  1322. return name;
  1323. }
  1324.  
  1325. int Project0RawKey( void )
  1326. {
  1327.     /* routine for "IDCMP_RAWKEY". */
  1328.  
  1329.     if(Project0Msg.Code ==95)
  1330.     {
  1331.         SendAmigaGuideCmd(Contact97Guide,"Main",AGA_Context,NULL,TAG_DONE);
  1332.     }
  1333. return Project0Msg.Code;
  1334. }
  1335.  
  1336. int Project1RawKey( void )
  1337. {
  1338.     /* routine for "IDCMP_RAWKEY". */
  1339.  
  1340.     if(Project1Msg.Code ==95)
  1341.     {
  1342.         SendAmigaGuideCmd(Contact97Guide,"Main",AGA_Context,NULL,TAG_DONE);
  1343.     }
  1344. return Project1Msg.Code;
  1345. }
  1346.  
  1347. int Project2RawKey( void )
  1348. {
  1349.     /* routine for "IDCMP_RAWKEY". */
  1350.  
  1351.     if(Project2Msg.Code ==95)
  1352.     {
  1353.         SendAmigaGuideCmd(Contact97Guide,"Main",AGA_Context,NULL,TAG_DONE);
  1354.     }
  1355. return Project2Msg.Code;
  1356. }
  1357.  
  1358. int Project3RawKey( void )
  1359. {
  1360.     /* routine for "IDCMP_RAWKEY". */
  1361.  
  1362.     if(Project3Msg.Code ==95)
  1363.     {
  1364.         SendAmigaGuideCmd(Contact97Guide,"Main",AGA_Context,NULL,TAG_DONE);
  1365.     }
  1366. return Project3Msg.Code;
  1367. }
  1368.  
  1369. /***********************************************
  1370.     Print Button on Edit Screen
  1371. ************************************************/
  1372.  
  1373. int PrintIt01Clicked( void )
  1374. {
  1375.     /* routine when gadget "Print" is clicked. */
  1376.  
  1377.     struct NameNode *namenode;
  1378.  
  1379.     int reply=0;
  1380.     
  1381.     if(!(open_printer()))
  1382.     {
  1383.         
  1384.         if((namenode=(struct NameNode *)FindName(NameList010List,GetString(Project1Gadgets[10])))!=0)
  1385.         {
  1386.             init_printer();
  1387.  
  1388.             prt_ok_g=0;
  1389.  
  1390.             prt_ok_g=PrintItNow("Contact Name :", namenode->nn_Address.AddrName);
  1391.  
  1392.             if(prt_ok_g==0) prt_ok_g=PrintItNow("Company Name :", namenode->nn_Address.AddrComp);
  1393.  
  1394.             if(prt_ok_g==0) prt_ok_g=PrintItNow("Address      :",NULL);
  1395.  
  1396.             if(prt_ok_g==0) PrintAddrNodes(addrlist_g,"              ");
  1397.  
  1398.             if(prt_ok_g==0) prt_ok_g=PrintItNow("\nEmail        :", namenode->nn_Address.AddrEmail);
  1399.  
  1400.             if(prt_ok_g==0) prt_ok_g=PrintItNow("Telephone    :", namenode->nn_Address.AddrTel);
  1401.  
  1402.             if(prt_ok_g==0) prt_ok_g=PrintItNow("Fax          :", namenode->nn_Address.AddrFax);
  1403.  
  1404.             if(prt_ok_g==0) prt_ok_g=PrintItNow("--------------------------------------------------\n",NULL);
  1405.  
  1406.             if(prt_ok_g==0)
  1407.             {
  1408.                 reply=Contact97Request(Project0Wnd,"FormFeed Printer??\0","Yes|No\0");
  1409.  
  1410.                 if(reply !=0)
  1411.                 {
  1412.                     PrintItNow("\x0c",NULL);
  1413.                 }
  1414.             }
  1415.  
  1416.         }
  1417.     }    
  1418.     close_printer();
  1419. }
  1420.  
  1421. /***********************************************
  1422.     Print Names + Numbers Menu item
  1423. ************************************************/
  1424.  
  1425. int Project0Item1( void )
  1426. {
  1427.     /* routine when (sub)item "Names + Numbers" is selected. */
  1428.  
  1429.     struct PrinterData *PD;
  1430.     struct Preferences *prefs;
  1431.     struct Node *node;
  1432.     int cnt =3;
  1433.  
  1434.     prt_ok_g=0;
  1435.  
  1436.     int reply=0;
  1437.     reply=Contact97Request(Project0Wnd,"Print Names + Numbers??\0","Yes|No\0");
  1438.  
  1439.     if(reply !=0)
  1440.     {
  1441.  
  1442.         if(!(open_printer()))
  1443.         {
  1444.             init_printer();
  1445.  
  1446.             PD = (struct PrinterData *) pio->ios.io_Device;
  1447.  
  1448.             prefs = &PD->pd_Preferences;
  1449.  
  1450.             prt_ok_g=PrintNameTitles();
  1451.  
  1452.                 for (node=NameList010List->lh_Head; node->ln_Succ ; node = node->ln_Succ)
  1453.             {
  1454.  
  1455.                 if(prt_ok_g==0) prt_ok_g=PrintItLine(((struct NameNode *)node)->nn_Address.AddrName, ((struct NameNode *)node)->nn_Address.AddrTel);
  1456.                 if(prt_ok_g==0) prt_ok_g=PrintItNow("----------------------------------------------------\n",NULL);
  1457.  
  1458.                 cnt+=2;
  1459.  
  1460.                 if(prt_ok_g==0 && cnt >(prefs->PaperLength-2))
  1461.                 {
  1462.                     prt_ok_g=PrintItNow("\x0c",NULL);
  1463.                     prt_ok_g=PrintNameTitles();
  1464.                     cnt=3;
  1465.                 }
  1466.     
  1467.             }
  1468.  
  1469.             if(prt_ok_g==0)
  1470.             {
  1471.                 reply=Contact97Request(Project0Wnd,"FormFeed Printer??\0","Yes|No\0");
  1472.     
  1473.                 if(reply !=0)
  1474.                 {
  1475.                     PrintItNow("\x0c",NULL);
  1476.                 }
  1477.             }
  1478.         }
  1479.         close_printer();
  1480.     }
  1481. }
  1482.  
  1483. /***********************************************
  1484.     Print Names + Addresses Menu Item
  1485. ************************************************/
  1486.  
  1487. int Project0Item2( void )
  1488. {
  1489.     /* routine when (sub)item "Names + Addresses" is selected. */
  1490.  
  1491.     struct PrinterData *PD;
  1492.     struct Preferences *prefs;
  1493.     struct Node *node;
  1494.     int cnt =0;
  1495.  
  1496.     prt_ok_g=0;
  1497.  
  1498.     int reply=0;
  1499.     reply=Contact97Request(Project0Wnd,"Print Names + Addresses??\0","Yes|No\0");
  1500.  
  1501.     if(reply !=0)
  1502.     {
  1503.  
  1504.         if(!(open_printer()))
  1505.         {
  1506.             init_printer();
  1507.  
  1508.             PD = (struct PrinterData *) pio->ios.io_Device;
  1509.  
  1510.             prefs = &PD->pd_Preferences;
  1511.  
  1512.                 for (node=NameList010List->lh_Head; node->ln_Succ ; node = node->ln_Succ)
  1513.             {
  1514.  
  1515.                 PrintItNow("Contact Name :",((struct NameNode *) node)->nn_Address.AddrName);
  1516.  
  1517.                 if(prt_ok_g==0) prt_ok_g=PrintItNow("Company Name :",((struct NameNode *) node)->nn_Address.AddrComp);
  1518.  
  1519.                 if(prt_ok_g==0) prt_ok_g=PrintItNow("Address      :",NULL);
  1520.  
  1521.                 if(prt_ok_g==0) cnt +=PrintAddrNodes2(((struct NameNode *) node)->nn_Address.AddrName,"              ");
  1522.  
  1523.                 if(prt_ok_g==0) prt_ok_g=PrintItNow("\nEmail        :", ((struct NameNode *) node)->nn_Address.AddrEmail);
  1524.  
  1525.                 if(prt_ok_g==0) prt_ok_g=PrintItNow("Telephone    :", ((struct NameNode *) node)->nn_Address.AddrTel);
  1526.  
  1527.                 if(prt_ok_g==0) prt_ok_g=PrintItNow("Fax          :", ((struct NameNode *) node)->nn_Address.AddrFax);
  1528.  
  1529.                 if(prt_ok_g==0) prt_ok_g=PrintItNow("--------------------------------------------------\n",NULL);
  1530.  
  1531.  
  1532.                 cnt+=9;
  1533.  
  1534.                 if(prt_ok_g==0 && cnt >=(prefs->PaperLength -9))
  1535.                 {
  1536.                     prt_ok_g=PrintItNow("\x0c",NULL);
  1537.                     cnt=0;
  1538.                 }
  1539.     
  1540.             }
  1541.  
  1542.             if(prt_ok_g==0)
  1543.             {
  1544.                 reply=Contact97Request(Project0Wnd,"FormFeed Printer??\0","Yes|No\0");
  1545.     
  1546.                 if(reply !=0)
  1547.                 {
  1548.                     PrintItNow("\x0c",NULL);
  1549.                 }
  1550.             }
  1551.         }
  1552.         close_printer();
  1553.     }
  1554.  
  1555. }
  1556.  
  1557. /***********************************************
  1558.     Print Address Nodes for name
  1559. ************************************************/
  1560.  
  1561. void PrintAddrNodes(struct List *list, char type[])
  1562. {
  1563.     struct Node *node;
  1564.     int cnt =0;
  1565.  
  1566.         for (node = list->lh_Head ; node->ln_Succ ; node = node->ln_Succ)
  1567.     {
  1568.  
  1569.         if(cnt!=0)
  1570.         {
  1571.             if(prt_ok_g==0) prt_ok_g=PrintItNow(type,((struct AddressAddress *)node)->nn_Node.ln_Name);            
  1572.         }
  1573.         else
  1574.         {
  1575.             if(prt_ok_g==0) prt_ok_g=PrintItNow(NULL,((struct AddressAddress *)node)->nn_Node.ln_Name);    
  1576.         }
  1577.         cnt++;
  1578.     }
  1579.  
  1580. }
  1581.  
  1582. /***********************************************
  1583.     Wait for Printer Messages
  1584. ************************************************/
  1585.  
  1586. int WaitForPrinter(void)
  1587. {
  1588.     long signal=0;
  1589.  
  1590.     signal=Wait(1 << printMsgPort->mp_SigBit | SIGBREAKF_CTRL_C);
  1591.  
  1592.     if(signal & (1 << SIGBREAKF_CTRL_C))
  1593.     {
  1594.         AbortIO((struct IORequest *)pio);
  1595.         WaitIO((struct IORequest *)pio);
  1596.     }
  1597.  
  1598.     if(signal & (1 << printMsgPort->mp_SigBit))
  1599.     {
  1600.         while(GetMsg(printMsgPort));
  1601.     }
  1602. return pio->iodrp.io_Error;
  1603. }
  1604.  
  1605. /***********************************************
  1606.     Print Text to Printer
  1607. ************************************************/
  1608.  
  1609. int PrintItNow(char *title,char *text)
  1610. {
  1611.     char buffer[100];
  1612.     if(title!=NULL && text!=NULL)
  1613.     {
  1614.         sprintf(buffer,"%s\t%s\n",title, text);
  1615.     }
  1616.  
  1617.     if(title==NULL && text!=NULL)
  1618.     {
  1619.         sprintf(buffer,"\t%s\n", text);
  1620.     }
  1621.     if(title!=NULL && text==NULL)
  1622.     {
  1623.         sprintf(buffer,"%s", title);
  1624.     }
  1625.  
  1626.     queue_write(buffer);
  1627.  
  1628. return WaitForPrinter();
  1629. }
  1630.  
  1631. /***********************************************
  1632.     Print Text to Printer
  1633. ************************************************/
  1634.  
  1635. int PrintItLine(char *title,char *text)
  1636. {
  1637.     char buffer[100];
  1638.     if(title!=NULL && text!=NULL)
  1639.     {
  1640.         sprintf(buffer,"%-30s\t%20s\n",title, text);
  1641.     }
  1642.  
  1643.     queue_write(buffer);
  1644.  
  1645. return WaitForPrinter();
  1646. }
  1647.  
  1648. /***********************************************
  1649.     Print Titles for Names + Numbers
  1650. ************************************************/
  1651.  
  1652. int PrintNameTitles(void)
  1653. {
  1654.     if(prt_ok_g==0) prt_ok_g=PrintItLine("Name", "Telephone");
  1655.     
  1656.     if(prt_ok_g==0) prt_ok_g=PrintItLine("====", "=========");
  1657.  
  1658.     if(prt_ok_g==0) prt_ok_g=PrintItNow("\n\n",NULL);    
  1659.  
  1660. return prt_ok_g;
  1661. }
  1662.  
  1663. /***********************************************
  1664.     Print Address Nodes for name 2
  1665. ************************************************/
  1666.  
  1667. int PrintAddrNodes2(char *name, char type[])
  1668. {
  1669.     struct Node *node;
  1670.     int cnt =0;
  1671.  
  1672.         for (node =FindName(AddrList010List,name) ; node!=0 ; node = FindName((struct List *)node,name))
  1673.     {
  1674.  
  1675.         if(cnt!=0)
  1676.         {
  1677.             if(prt_ok_g==0) prt_ok_g=PrintItNow(type,((struct AddressAddress *)node)->nn_Data);            
  1678.         }
  1679.         else
  1680.         {
  1681.             if(prt_ok_g==0) prt_ok_g=PrintItNow(NULL,((struct AddressAddress *)node)->nn_Data);    
  1682.         }
  1683.         cnt++;
  1684.     }
  1685. return cnt-1;
  1686. }
  1687.