home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 September & October / Amiga-CD 1996 #9-10.iso / demos / storm-c / stormwizard / source / c-source / tree / tree.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-06  |  6.8 KB  |  279 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <string.h>
  4.  
  5. #include    <exec/exec.h>
  6. #include    <exec/memory.h>
  7.  
  8. #include    <clib/alib_protos.h>
  9.  
  10. #include    <pragma/asl_lib.h>
  11. #include    <pragma/dos_lib.h>
  12. #include    <pragma/exec_lib.h>
  13. #include    <pragma/intuition_lib.h>
  14. #include    <pragma/utility_lib.h>
  15. #include    <pragma/wizard_lib.h>
  16.  
  17. #include    <dos/dos.h>
  18. #include    <libraries/asl.h>
  19. #include    <libraries/wizard.h>
  20. #include    <intuition/gadgetclass.h>
  21. #include    <intuition/intuition.h>
  22.  
  23. #define HierarchyID         2
  24. #define ArgumentID            8
  25. #define VectorButtonID     9
  26.  
  27. struct Library *AslBase;
  28. struct Library *WizardBase;
  29. struct Library *UtilityBase;
  30.  
  31. APTR    MySurface;
  32.  
  33. struct Gadget *MyGadgets[10];
  34.  
  35. struct Screen *MyScreen;
  36. struct FileRequester *MyFReq;
  37.  
  38. struct Window *MyWindow;
  39.  
  40. struct NewWindow *MyNewWindow;
  41. struct WizardWindowHandle *MyWinHandle;
  42.  
  43. char ArgumentPuffer[256]="";
  44.  
  45. struct MyTreeNode
  46. {
  47.     struct WizardTreeNode Node;
  48.     struct MinList list;
  49.     char Name[32];
  50.     int Type;
  51. };
  52.  
  53. struct MinList MyList;
  54. struct MinList DummyList;
  55.  
  56. void FreeMyTreeList(struct MinList *list)
  57. {
  58.     while (list->mlh_Head->mln_Succ)
  59.     {
  60.         struct MyTreeNode *t=(struct MyTreeNode *)list->mlh_Head;
  61.  
  62.         if (t->Node.Childs)
  63.             FreeMyTreeList(&t->list);
  64.  
  65.         Remove((struct Node *)t);
  66.         FreeVec(t);
  67.     }
  68. };
  69.  
  70. void ReadDir(STRPTR dir,struct MinList *list,struct MyTreeNode *parent)
  71. {
  72.     struct FileInfoBlock fib;
  73.  
  74.     BPTR mylock;
  75.  
  76.     if (mylock=Lock(dir,SHARED_LOCK))
  77.     {
  78.         if (Examine(mylock,&fib))
  79.         {
  80.             while(ExNext(mylock,&fib))
  81.             {
  82.                 struct MyTreeNode *NewNode;
  83.  
  84.                 if (NewNode=(struct MyTreeNode *)AllocVec(sizeof(MyTreeNode),MEMF_CLEAR|MEMF_PUBLIC))
  85.                 {
  86.                     long Ready=FALSE;
  87.                     struct MyTreeNode *PredNode=(struct MyTreeNode *)list->mlh_Head;
  88.  
  89.                     NewList((struct List *)&NewNode->list);
  90.  
  91.                     NewNode->Node.Entrys=1;
  92.  
  93.                     NewNode->Node.StringEntrys[0].String=NewNode->Name;
  94.                     NewNode->Node.ParentNode=(struct WizardTreeNode *)parent;
  95.  
  96.                     strcpy(NewNode->Name,fib.fib_FileName);
  97.  
  98.                     NewNode->Node.StringEntrys[0].Style=FSF_BOLD;
  99.                     NewNode->Node.StringEntrys[0].SStyle=FSF_BOLD;
  100.  
  101.                     if (fib.fib_DirEntryType>=0)
  102.                     {
  103.                         char NewDir[256];
  104.  
  105.                         NewNode->Node.Flags=WTNF_Automatic|WTNF_Display;
  106.  
  107.                         NewNode->Type=0;
  108.                         NewNode->Node.StringEntrys[0].Pen=WZRD_HIGHLIGHTTEXTPEN;
  109.                         NewNode->Node.StringEntrys[0].SPen=WZRD_HIGHLIGHTTEXTPEN;
  110.  
  111.                         NewNode->Node.Childs=&NewNode->list;
  112.  
  113.                         strcpy (NewDir,dir);
  114.                         if (AddPart(NewDir,fib.fib_FileName,sizeof(NewDir)))
  115.                             ReadDir(NewDir,&NewNode->list,NewNode);
  116.                     }
  117.                     else
  118.                     {
  119.                         NewNode->Type=1;
  120.                         NewNode->Node.StringEntrys[0].Pen=WZRD_TEXTPEN;
  121.                         NewNode->Node.StringEntrys[0].SPen=WZRD_FILLTEXTPEN;
  122.  
  123.                         NewNode->Node.Childs=(struct MinList *)0L;
  124.                     }
  125.  
  126.                     while (!Ready && PredNode->Node.Node.mln_Succ)
  127.                     {
  128.                         if (NewNode->Type>=PredNode->Type)
  129.                         {
  130.                             if (NewNode->Type==PredNode->Type)
  131.                             {
  132.                                 if (Stricmp(NewNode->Name,PredNode->Name)<0)
  133.                                 {
  134.                                     PredNode=(struct MyTreeNode *)PredNode->Node.Node.mln_Pred;
  135.                                     Ready=TRUE;
  136.                                 }
  137.                                 else
  138.                                     PredNode=(struct MyTreeNode *)PredNode->Node.Node.mln_Succ;
  139.                             }
  140.                             else
  141.                                 PredNode=(struct MyTreeNode *)PredNode->Node.Node.mln_Succ;
  142.                         }
  143.                         else
  144.                         {
  145.                             PredNode=(struct MyTreeNode *)PredNode->Node.Node.mln_Pred;
  146.                             Ready=TRUE;
  147.                         }
  148.                     };
  149.                     Insert((struct List *)list,(struct Node *)NewNode,(struct Node *)PredNode);
  150.                 }
  151.             }
  152.         }
  153.         UnLock(mylock);
  154.     }
  155. }
  156.  
  157. main()
  158. {
  159.     NewList((struct List *)&MyList);
  160.     NewList((struct List *)&DummyList);
  161.  
  162.     if (UtilityBase=OpenLibrary("utility.library",0L))
  163.     {
  164.         if (WizardBase=OpenLibrary("wizard.library",0L))
  165.         {
  166.             if (AslBase=OpenLibrary("asl.library",0L))
  167.             {
  168.                 if (MySurface=WZ_OpenSurface("tree.wizard",0L,TAG_DONE))
  169.                 {
  170.                     if (MyScreen=LockPubScreen(0L))
  171.                     {
  172.                         if(MyFReq=AllocAslRequestTags(ASL_FileRequest,ASLFR_Screen,MyScreen,
  173.                                                                                             ASLFR_TitleText,"Choose Path ...",
  174.                                                                                             TAG_DONE))
  175.                         {
  176.                             if (MyWinHandle=WZ_AllocWindowHandle(MyScreen,0L,MySurface,TAG_DONE))
  177.                                 {
  178.                                 if (MyNewWindow=WZ_CreateWindowObj(MyWinHandle,1,WWH_GadgetArray,&MyGadgets,
  179.                                                                                                         WWH_GadgetArraySize,sizeof(MyGadgets),
  180.                                                                                                     TAG_DONE))
  181.                                 {
  182.                                     SetGadgetAttrs(MyGadgets[HierarchyID],0L,0L,WHIERARCHYA_List,&MyList,
  183.                                                                                                     TAG_DONE);
  184.                                     SetGadgetAttrs(MyGadgets[ArgumentID],0L,0L,WARGSA_Arg0,&ArgumentPuffer,
  185.                                                                                                     TAG_DONE);
  186.  
  187.                                     if (MyWindow=WZ_OpenWindow(MyWinHandle,MyNewWindow,
  188.                                                                                                         WA_AutoAdjust,TRUE,
  189.                                                                                                         TAG_DONE))
  190.                                     {
  191.                                         unsigned long Flag=FALSE;
  192.  
  193.                                         struct IntuiMessage *msg;
  194.  
  195.                                         do
  196.                                         {
  197.                                             WaitPort(MyWindow->UserPort);
  198.  
  199.                                             if (msg=(struct IntuiMessage *)GetMsg(MyWindow->UserPort))
  200.                                             {
  201.                                                 switch (msg->Class)
  202.                                                 {
  203.                                                     case IDCMP_CLOSEWINDOW:
  204.                                                         {
  205.                                                             Flag=TRUE;
  206.                                                         }
  207.                                                         break;
  208.  
  209.                                                     case IDCMP_IDCMPUPDATE:
  210.                                                         {
  211.  
  212.                                                             switch (GetTagData(GA_ID,0,(struct TagItem *)msg->IAddress))
  213.                                                             {
  214.                                                                 case HierarchyID:
  215.                                                                     {
  216.                                                                         struct MyTreeNode *t;
  217.  
  218.                                                                         if (t=(struct MyTreeNode *)WZ_GetNode(&MyList,GetTagData(WHIERARCHYA_Selected,0,(struct TagItem *)msg->IAddress)))
  219.                                                                         {
  220.                                                                             strcpy(ArgumentPuffer,t->Name);
  221.  
  222.                                                                             SetGadgetAttrs(MyGadgets[ArgumentID],MyWindow,0L,
  223.                                                                                                     WARGSA_Arg0,&ArgumentPuffer,
  224.                                                                                                     TAG_DONE);
  225.                                                                         }
  226.                                                                     }
  227.                                                                     break;
  228.  
  229.                                                                 case VectorButtonID:
  230.                                                                     {
  231.                                                                         WZ_LockWindow(MyWinHandle);
  232.  
  233.                                                                         if (AslRequestTags(MyFReq,ASLFR_DrawersOnly,TRUE,
  234.                                                                                                             TAG_DONE))
  235.                                                                         {
  236.                                                                             SetGadgetAttrs(MyGadgets[HierarchyID],MyWindow,0L,WHIERARCHYA_List,&DummyList,
  237.                                                                                                                     TAG_DONE);
  238.  
  239.                                                                             FreeMyTreeList(&MyList);
  240.  
  241.                                                                             ReadDir(MyFReq->fr_Drawer,&MyList,0L);
  242.  
  243.                                                                             SetGadgetAttrs(MyGadgets[HierarchyID],MyWindow,0L,
  244.                                                                                                     WHIERARCHYA_List,&MyList,
  245.                                                                                                     TAG_DONE);
  246.                                                                         }
  247.  
  248.                                                                         WZ_UnlockWindow(MyWinHandle);
  249.  
  250.                                                                     }
  251.                                                                     break;
  252.                                                             }
  253.  
  254.                                                         }
  255.                                                         break;
  256.                                                 }
  257.                                                 ReplyMsg((struct Message *)msg);
  258.                                             }
  259.  
  260.                                         }while (Flag==FALSE);
  261.  
  262.                                         WZ_CloseWindow(MyWinHandle);
  263.                                     }
  264.                                 }
  265.                                 WZ_FreeWindowHandle(MyWinHandle);
  266.                             }
  267.                             FreeAslRequest(MyFReq);
  268.                         }
  269.                         UnlockPubScreen(0L,MyScreen);
  270.                     }
  271.                     WZ_CloseSurface(MySurface);
  272.                 }
  273.                 CloseLibrary(AslBase);
  274.             }
  275.             CloseLibrary(WizardBase);
  276.         }
  277.         CloseLibrary(UtilityBase);
  278.     }
  279. }