home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / util / rsys-1.3.lha / RSys / src / RSysList.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-07  |  5.4 KB  |  296 lines

  1. /*
  2. ***************************************************************************
  3. *
  4. * Datei:
  5. *    RSysList.c
  6. *
  7. * Inhalt:
  8. *    int CountIntuiObjects(int typ);
  9. *    int CountDevices(long mask);
  10. *    int CountNodes(struct List *list);
  11. *    int CountMemory(void);
  12. *    int NoEntries(void);
  13. *    void RefreshList(int type);
  14. *    void SaveCurrentList(void);
  15. *    void RestoreList(void);
  16. *    void KillList(void);
  17. *
  18. * Bemerkungen:
  19. *    Listenverwaltung von RSys, Zählroutinen und interne Liste.
  20. *
  21. * Erstellungsdatum:
  22. *    07-Jul-93    Rolf Böhme
  23. *
  24. * Änderungen:
  25. *    07-Jul-93    Rolf Böhme    Erstellung
  26. *
  27. ***************************************************************************
  28. */
  29.  
  30. #include "RSysDebug.h"
  31. #include "RSysFunc.h"
  32.  
  33.    /*
  34.     * CountIntuiObjects() zählt Screens oder Fenster,
  35.     * abhängig von Typ
  36.     */
  37. int
  38. CountIntuiObjects(int typ)
  39. {
  40.    int   wincount = 0,
  41.          scrcount = 0;
  42.    register struct Window *win;
  43.    register struct Screen *scr;
  44.    ULONG lock;
  45.  
  46.    lock = LockIBase(NULL);
  47.  
  48.    for (scr = IntuitionBase->FirstScreen; scr; scr = scr->NextScreen)
  49.    {
  50.       scrcount++;
  51.       for (win = scr->FirstWindow; win; win = win->NextWindow)
  52.          wincount++;
  53.    }
  54.  
  55.    UnlockIBase(lock);
  56.  
  57.    return ((typ == SCREENS) ? scrcount : wincount);
  58. }
  59.  
  60.    /*
  61.     * CountDevices() zählt im System angemeldete Devices
  62.     * entsprechend der übergebenen Maske
  63.     */
  64. int
  65. CountDevices(long mask)
  66. {
  67.    int   count = 0;
  68.    struct DosList *dl;
  69.  
  70.    dl = LockDosList(mask | LDF_READ);
  71.  
  72.    while (dl = NextDosEntry(dl, mask | LDF_READ))
  73.       count++;
  74.  
  75.    UnLockDosList(mask | LDF_READ);
  76.  
  77.    return (count);
  78. }
  79.  
  80.    /*
  81.     * CountNodes() zählt die Elemente einer Liste
  82.     */
  83. int
  84. CountNodes(struct List *list)
  85. {
  86.    int   count = 0;
  87.    register struct Node *node;
  88.  
  89.    Forbid();
  90.  
  91.    for (node = list->lh_Head; node->ln_Succ; node = node->ln_Succ)
  92.       count++;
  93.  
  94.    Permit();
  95.  
  96.    return (count);
  97. }
  98.  
  99.    /*
  100.     * CountMemory() zählt die Memory-Chunks
  101.     */
  102. int
  103. CountMemory(void)
  104. {
  105.    int   count = 0;
  106.    register struct Node *node;
  107.    register struct MemChunk *Loop;
  108.  
  109.    Disable();
  110.  
  111.    for (node = SysBase->MemList.lh_Head; node->ln_Succ; node = node->ln_Succ)
  112.    {
  113.       count++;
  114.  
  115.       for (Loop = ((struct MemHeader *) node)->mh_First; Loop;
  116.            Loop = Loop->mc_Next)
  117.          count++;
  118.    }
  119.  
  120.    Enable();
  121.  
  122.    return (count);
  123. }
  124.  
  125.    /*
  126.     * NoEntries() gibt FALSE zurück, falls keine Einträge zum
  127.     * Anzeigen da sind. In diesem Falle wird das ListView auf
  128.     * dem Hauptfenster initialisiert
  129.     */
  130. int
  131. NoEntries(void)
  132. {
  133.    DPOS;
  134.  
  135.    if (countentries == 0)
  136.    {
  137.       RefreshListView();
  138.       PrintStatistics();
  139.  
  140.       return (TRUE);
  141.    }
  142.  
  143.    PrintInfo("Creating list...", NO_SPEAK, 0);
  144.  
  145.    return (FALSE);
  146. }
  147.  
  148.    /*
  149.     * RefreshList() erneuert die anzuzeigende Liste im
  150.     * Hauptfenster
  151.     */
  152. void
  153. RefreshList(int type)
  154. {
  155.    DPOS;
  156.  
  157.    if (type <= GD_HardwareGad)
  158.    {
  159.       EmptyListView();
  160.       PrintHeader((enum ListTypes)type, NULL);
  161.    }
  162.  
  163.    topentry = 0;
  164.  
  165.    if(type <= DISPLAYMODES)
  166.       (*(EntryAttr[type].ea_func))();
  167.  
  168.    PrintStatistics();
  169.  
  170.    return;
  171. }
  172.  
  173. ScrollEntry *SaveEntries = NULL;
  174. struct List SavedList;
  175. int   SaveID;
  176. int   Savecountentries;
  177.  
  178.    /*
  179.     * SaveCurrentList() speichert die aktuelle Liste im
  180.     * Hauptfenster intern ab.  Diese kann dann wieder
  181.     * eingeladen werden
  182.     */
  183. void
  184. SaveCurrentList(void)
  185. {
  186.    int   i;
  187.  
  188.    DPOS;
  189.  
  190.    if (SaveEntries &&
  191.        (NOT(Question(SysWnd, "Internal List exist! Do you want create a new list?", YES))))
  192.    {
  193.       PrintStatistics();
  194.       return;
  195.    }
  196.  
  197.    KillList();
  198.  
  199.    SaveEntries = (ScrollEntry *) MyAllocVec(countentries * sizeof(ScrollEntry),
  200.                                             MEMF_CLEAR | MEMF_ANY, NO_KILL);
  201.    if (SaveEntries)
  202.    {
  203.       struct Node *node = ListeLVList.lh_Head;
  204.  
  205.       NewList(&SavedList);
  206.  
  207.       SaveID = LastID;
  208.       Savecountentries = countentries;
  209.  
  210.       for (i = 0; (i < countentries) && node; i++)
  211.       {
  212.          CopyMem((APTR) node, (APTR) & (SaveEntries[i].se_Node),
  213.                  sizeof(ScrollEntry));
  214.  
  215.          AddTail(&SavedList, &SaveEntries[i].se_Node);
  216.  
  217.          node = node->ln_Succ;
  218.       }
  219.  
  220.       PrintInfo("Current list saved", SPEAK, SEC);
  221.  
  222.       PrintStatistics();
  223.    }
  224.  
  225.    return;
  226. }
  227.  
  228.    /*
  229.     * RestoreList() stellt die vorher intern abgespeicherte
  230.     * Liste aus dem Hauptfenster wieder her und erneuert das
  231.     * ListView
  232.     */
  233. void
  234. RestoreList(void)
  235. {
  236.    int   i;
  237.  
  238.    DPOS;
  239.  
  240.    if (SaveEntries)
  241.    {
  242.       struct Node *node = SavedList.lh_Head;
  243.  
  244.       LastID = SaveID;
  245.       countentries = Savecountentries;
  246.  
  247.       PrintHeader((enum ListTypes)LastID, NULL);
  248.  
  249.       EmptyListView();
  250.  
  251.       PrintInfo("Restore saved list", NO_SPEAK, 0);
  252.  
  253.       Entries = AllocScrollEntries(Savecountentries);
  254.  
  255.       for (i = 0; (i < Savecountentries) && node; i++)
  256.       {
  257.          CopyMem((APTR) node, (APTR) & (Entries[i].se_Node), sizeof(ScrollEntry));
  258.  
  259.          Entries[i].se_Node.ln_Name = Entries[i].se_Entry;
  260.  
  261.          AddNodeToList(i, NO_SORT);
  262.  
  263.          node = node->ln_Succ;
  264.       }
  265.  
  266.       RefreshListView();
  267.  
  268.       PrintInfo("Previous saved list restored", SPEAK, 0);
  269.    }
  270.    else
  271.       ErrorHandle(LIST_NODE_ERR, SAVED_FAIL, NO_KILL);
  272.  
  273.    return;
  274. }
  275.  
  276.    /*
  277.     * KillList() gibt den Speicher der intern abgespeicherten
  278.     * Liste wieder frei
  279.     */
  280. void
  281. KillList(void)
  282. {
  283.    DPOS;
  284.  
  285.    if (SaveEntries)
  286.    {
  287.       MyFreeVec(SaveEntries);
  288.       SaveEntries = NULL;
  289.  
  290.       PrintInfo("Last saved list killed", SPEAK, SEC);
  291.       PrintStatistics();
  292.    }
  293.  
  294.    return;
  295. }
  296.