home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1999 November / PCOnline_11_1999.iso / filesbbs / OS2 / MMSRC029.ZIP / mmail-0.29 / interfac / packet.cc < prev    next >
C/C++ Source or Header  |  1999-08-17  |  6KB  |  324 lines

  1. /*
  2.  * MultiMail offline mail reader
  3.  * packet list window, vanity plate
  4.  
  5.  Copyright (c) 1996 Kolossvary Tamas <thomas@vma.bme.hu>
  6.  Copyright (c) 1997 John Zero <john@graphisoft.hu>
  7.  Copyright (c) 1999 William McBrine <wmcbrine@clark.net>
  8.  
  9.  Distributed under the GNU General Public License.
  10.  For details, see the file COPYING in the parent directory. */
  11.  
  12. #include "interfac.h"
  13.  
  14. void Welcome::MakeActive()
  15. {
  16.     window = new ShadowedWin(6, 50, 2, C_WBORDER);
  17.     window->attrib(C_WELCOME1);
  18.     window->put(1, 7,
  19.         "Welcome to " MM_NAME " Offline Reader!");
  20.     window->attrib(C_WELCOME2);
  21.     window->put(3, 2,
  22.         "Copyright (c) 1999 William McBrine, Kolossvary"); 
  23.     window->put(4, 7,
  24.         "Tamas, Toth Istvan, John Zero, et al.");
  25.     window->touch();
  26. }
  27.  
  28. void Welcome::Delete()
  29. {
  30.     delete window;
  31. }
  32.  
  33. PacketListWindow::PacketListWindow()
  34. {
  35.     origDir = strdupplus(mm.resourceObject->get(PacketDir));
  36.     sorttype = mm.resourceObject->getInt(PacketSort);
  37.     packetList = dirList = 0;
  38.     newList();
  39.     if (noFiles)            // If there are any files,
  40.         active = noDirs;    // set active to the first one.
  41. }
  42.  
  43. PacketListWindow::~PacketListWindow()
  44. {
  45.     delete packetList;
  46.     delete dirList;
  47.     delete[] origDir;
  48. }
  49.  
  50. void PacketListWindow::newList()
  51. {
  52.     delete packetList;
  53.     delete dirList;
  54.  
  55.     mm.resourceObject->set(oldPacketName, 0);
  56.  
  57.     time(&currTime);
  58.     currDir = mm.resourceObject->get(PacketDir);
  59.  
  60.     dirList = new file_list(currDir, false, true);
  61.     packetList = new file_list(currDir, sorttype);
  62.  
  63.     noDirs = dirList->getNoOfFiles();
  64.     noFiles = packetList->getNoOfFiles();
  65.  
  66.     if (!NumOfItems())
  67.         error();
  68. }
  69.  
  70. void PacketListWindow::error()
  71. {
  72.     char tmp[512];
  73.  
  74.     sprintf(tmp, "No packets found.\n\n"
  75.         "Please place any packets to be read in:\n%s", currDir);
  76.     fatalError(tmp);
  77. }
  78.  
  79. void PacketListWindow::MakeActive()
  80. {
  81.     const int stline = 9;
  82.     list_max_y = LINES - (stline + 9);
  83.     list_max_x = 48;
  84.     top_offset = 2;
  85.  
  86.     borderCol = C_PBBACK;
  87.  
  88.     if (list_max_y > NumOfItems())
  89.         list_max_y = NumOfItems();
  90.  
  91.     welcome.MakeActive();
  92.  
  93.     list = new InfoWin(list_max_y + 3, 50, stline, borderCol, currDir,
  94.         C_PHEADTEXT);
  95.     list->attrib(C_PHEADTEXT);
  96.     list->put(1, 3, "Packet                  Size    Date");
  97.     list->touch();
  98.     DrawAll();
  99. }
  100.  
  101. int PacketListWindow::NumOfItems()
  102. {
  103.     return noDirs + noFiles;
  104. }
  105.  
  106. void PacketListWindow::Delete()
  107. {
  108.     delete list;
  109.     welcome.Delete();
  110. }
  111.  
  112. void PacketListWindow::oneLine(int i)
  113. {
  114.     char *tmp = list->lineBuf;
  115.     int absPos = position + i;
  116.     time_t tmpt;
  117.  
  118.     if (absPos < noDirs) {
  119.         dirList->gotoFile(absPos);
  120.  
  121.         absPos = sprintf(tmp, "  <%.32s", dirList->getName());
  122.         char *tmp2 = tmp + absPos;
  123.         *tmp2++ = '>';
  124.  
  125.         absPos = 32 - absPos;
  126.         while (--absPos)
  127.             *tmp2++ = ' ';
  128.         tmpt = dirList->getDate();
  129.     } else {
  130.         packetList->gotoFile(absPos - noDirs);
  131.  
  132.         const char *tmp2 = packetList->getName();
  133.  
  134.         strcpy(tmp, "          ");
  135.  
  136.         if (*tmp2 == '.')
  137.             sprintf(&tmp[2], "%-20.20s", tmp2);
  138.         else {
  139.             for (int j = 2; *tmp2 && (*tmp2 != '.') &&
  140.                 (j < 10); j++)
  141.                     tmp[j] = *tmp2++;
  142.  
  143.             sprintf(&tmp[10], "%-10.10s", tmp2);
  144.         }
  145.  
  146.         sprintf(&tmp[20], "%12u",
  147.             (unsigned) packetList->getSize());
  148.  
  149.         tmpt = packetList->getDate();
  150.     }
  151.     long dtime = currTime - tmpt;
  152.  
  153.     // 15000000 secs = approx six months (use year if older):
  154.     strftime(&tmp[32], 17, ((dtime < 0 || dtime > 15000000) ?
  155.         "  %b %d  %Y  " : "  %b %d %H:%M  "), localtime(&tmpt));
  156.  
  157.     DrawOne(i, C_PLINES);
  158. }
  159.  
  160. searchret PacketListWindow::oneSearch(int x, const char *item, int mode)
  161. {
  162.     file_list *foo;
  163.     const char *s;
  164.     searchret retval;
  165.  
  166.     if (x < noDirs)
  167.         foo = dirList;
  168.     else {
  169.         foo = packetList;
  170.         x -= noDirs;
  171.     }
  172.     foo->gotoFile(x);
  173.  
  174.     s = foo->getName();
  175.     retval = searchstr(s, item) ? True : False;
  176.  
  177.     if ((retval == False) && (foo == packetList) &&
  178.         (mode < s_pktlist)) {
  179.         int oldactive = active;
  180.         active = x + noDirs;
  181.         if (OpenPacket() == PKT_OK) {
  182.             mm.checkForReplies();
  183.             mm.openReply();
  184.  
  185.             interface->redraw();
  186.             ShadowedWin searchsay(3, 31, (LINES >> 1) - 2,
  187.                 C_WTEXT);
  188.             searchsay.put(1, 2, "Searching (ESC to abort)...");
  189.             searchsay.update();
  190.  
  191.             mm.areaList = new area_list(&mm);
  192.             mm.areaList->relist();
  193.             interface->changestate(arealist);
  194.             interface->areas.setActive(-1);
  195.             retval = interface->areas.search(item, mode);
  196.             if (retval != True) {
  197.                 active = oldactive;
  198.                 mm.Delete();
  199.                 interface->changestate(packetlist);
  200.             }
  201.         } else
  202.             active = oldactive;
  203.     }
  204.  
  205.     return retval;
  206. }
  207.  
  208. void PacketListWindow::Select()
  209. {
  210.     if (active < noDirs)
  211.         dirList->gotoFile(active);
  212.     else
  213.         packetList->gotoFile(active - noDirs);
  214. }
  215.  
  216. bool PacketListWindow::back()
  217. {
  218.     bool end = false;
  219.  
  220.     if (strcmp(currDir, origDir)) {
  221.         mm.resourceObject->set(PacketDir, dirList->changeDir(".."));
  222.         active = position = 0;
  223.         extrakeys('U');
  224.     } else
  225.         end = true;
  226.     return end;
  227. }
  228.  
  229. bool PacketListWindow::extrakeys(int key)
  230. {
  231.     bool end = false;
  232.  
  233.     switch (key) {
  234.     case 'S':
  235.     case '$':
  236.         packetList->resort();
  237.         sorttype = !sorttype;
  238.         DrawAll();
  239.         break;
  240.     case 'G':
  241.         gotoDir();
  242.         break;
  243.     case 'R':
  244.         renamePacket();
  245.         break;
  246.     case KEY_DC:
  247.     case 'K':
  248.         killPacket();
  249.         break;
  250.     case 'U':
  251.         newList();
  252.         interface->redraw();
  253.     }
  254.     return end;
  255. }
  256.  
  257. void PacketListWindow::gotoDir()
  258. {
  259.     char pathname[70];
  260.     pathname[0] = '\0';
  261.  
  262.     if (interface->savePrompt("New directory:", pathname) &&
  263.         pathname[0]) {
  264.         mm.resourceObject->set(PacketDir,
  265.             dirList->changeDir(pathname));
  266.         active = position = 0;
  267.         extrakeys('U');
  268.     } else
  269.         interface->redraw();
  270. }
  271.  
  272. void PacketListWindow::renamePacket()
  273. {
  274.     if (active >= noDirs) {
  275.         Select();
  276.  
  277.         char question[60], answer[60];
  278.         sprintf(question, "New filename for %.39s:",
  279.             packetList->getName());
  280.         answer[0] = '\0';
  281.  
  282.         if (interface->savePrompt(question, answer) &&
  283.             answer[0]) {
  284.             packetList->changeName(answer);
  285.             extrakeys('U');
  286.         } else
  287.             interface->redraw();
  288.     }
  289. }
  290.  
  291. void PacketListWindow::killPacket()
  292. {
  293.     if (active >= noDirs) {
  294.         Select();
  295.  
  296.         char tmp[128];
  297.         sprintf(tmp, "Do you really want to delete %.90s?",
  298.             packetList->getName());
  299.  
  300.         if (interface->WarningWindow(tmp)) {
  301.             packetList->kill();
  302.             noFiles = packetList->getNoOfFiles();
  303.         }
  304.         if (NumOfItems())
  305.             interface->redraw();
  306.         else
  307.             error();
  308.     }
  309. }
  310.  
  311. pktstatus PacketListWindow::OpenPacket()
  312. {
  313.     Select();
  314.     if (active < noDirs) {
  315.         mm.resourceObject->set(PacketDir, dirList->changeDir());
  316.         newList();
  317.         position = 0;
  318.         active = noFiles ? noDirs : 0;    // active = first file
  319.         interface->redraw();
  320.         return NEW_DIR;
  321.     } else
  322.         return mm.selectPacket(packetList->getName());
  323. }
  324.