home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994…tember: Reference Library / Dev.CD Sep 94.toast / Periodicals / develop / develop Issue 6 / develop 6 code / TCP / NewsWatcher / NewsWatcher 2.0d15 source / source / cmd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-16  |  7.6 KB  |  369 lines  |  [TEXT/KAHL]

  1. /*----------------------------------------------------------------------------
  2.  
  3.     cmd.c
  4.  
  5.     This module handles command dispatching.
  6.     
  7.     Portions copyright © 1990, Apple Computer.
  8.     Portions copyright © 1993, Northwestern University.
  9.  
  10. ----------------------------------------------------------------------------*/
  11.  
  12. #include <ctype.h>
  13. #include <string.h>
  14.  
  15. #include "glob.h"
  16. #include "article.h"
  17. #include "close.h"
  18. #include "cmd.h"
  19. #include "dlgutil.h"
  20. #include "full.h"
  21. #include "header.h"
  22. #include "killdlg.h"
  23. #include "mark.h"
  24. #include "message.h"
  25. #include "menus.h"
  26. #include "newart.h"
  27. #include "newsrc.h"
  28. #include "next.h"
  29. #include "nntp.h"
  30. #include "open.h"
  31. #include "prefsdlog.h"
  32. #include "print.h"
  33. #include "save.h"
  34. #include "scroll.h"
  35. #include "search.h"
  36. #include "send.h"
  37. #include "subject.h"
  38. #include "subscribe.h"
  39. #include "util.h"
  40. #include "wind.h"
  41. #include "about.h"
  42.  
  43.  
  44. /*    DoSelectAll is called in response to a Select-All menu command.
  45.     If in a list manager window, all cells are hilited.  If in a 
  46.     textedit window, the entire range of a message is hilited.
  47. */
  48.  
  49. void DoSelectAll (WindowPtr wind)
  50. {
  51.     TWindow **info;
  52.     Cell theCell;
  53.     ListHandle theList;
  54.     EWindowKind kind;
  55.     
  56.     info = (TWindow**)GetWRefCon(wind);
  57.     kind = (**info).kind;
  58.     if (kind == kFullGroup || kind == kNewGroup || kind == kUserGroup || kind == kSubject) {
  59.         theList = (**info).theList;
  60.         SetPt(&theCell,0,0);
  61.         do {
  62.             LSetSelect(true,theCell,theList);
  63.         } while (LNextCell(false,true,&theCell,theList));
  64.     } else {
  65.         TESetSelect(0,32767,(**info).theTE);
  66.     }
  67. }
  68.  
  69.  
  70. /*    DoRot is called in response to the Do Rot-13 menu command.  It
  71.     encrypts/decrypts an entire message, or just a selection using
  72.     the Rot-13 method common on USENET news groups.
  73. */
  74.  
  75. static void DoRot (WindowPtr wind)
  76. {
  77.     TWindow **info;
  78.     TEHandle theTE;
  79.     GrafPtr savePort;
  80.     short i,sStart,sEnd;
  81.     
  82.     info = (TWindow**)GetWRefCon(wind);
  83.     theTE = (**info).theTE;
  84.     HLock((**theTE).hText);
  85.     
  86.     sStart = (**theTE).selStart;
  87.     sEnd = (**theTE).selEnd;
  88.     if (sStart == sEnd) {
  89.         sStart = 0;
  90.         sEnd = (**theTE).teLength;
  91.     }
  92.     
  93.     for (i=sStart; i<= sEnd; i++)
  94.         if (isalpha((*(**theTE).hText)[i]))
  95.             (*(**theTE).hText)[i] += (toupper((*(**theTE).hText)[i]) > 'M') ? -13 : 13;        
  96.             
  97.     HUnlock((**theTE).hText);
  98.     GetPort(&savePort);
  99.     SetPort(wind);
  100.     InvalRect(&wind->portRect);
  101.     SetPort(savePort);
  102. }
  103.  
  104.  
  105. /* DoCommand: Process pull-down menu requests */
  106.  
  107. void DoCommand (long mResult)
  108. {
  109.     short selItem,selMenu,temp;
  110.     Str255    name;
  111.     GrafPtr    tempPort;
  112.     WindowPtr wind;
  113.     TWindow **info;
  114.     EWindowKind kind;
  115.     short editCmd;
  116.     Boolean daEditCmd=false;
  117.     TEHandle theTE;
  118.     
  119.     wind = FrontWindow();
  120.     if (IsStatusWindow(wind)) {
  121.         return;
  122.     } else if (wind != nil && IsAppWindow(wind)) {
  123.         info = (TWindow**)GetWRefCon(wind);
  124.         kind = (**info).kind;
  125.         theTE = (**info).theTE;
  126.     }
  127.         
  128.     selItem = LoWord(mResult);
  129.     selMenu = HiWord(mResult);
  130.     
  131.     switch (selMenu) {
  132.         case kAppleMenu:
  133.             if (selItem > 2) {
  134.                 GetPort(&tempPort);
  135.                 SetCursor(&qd.arrow);
  136.                 GetItem(GetMHandle(kAppleMenu),selItem,name);
  137.                 temp = OpenDeskAcc(name);
  138.                 SetPort(tempPort);
  139.             } else {
  140.                 DoAboutBox();
  141.             }
  142.             break;
  143.             
  144.         case kFileMenu:
  145.             switch (selItem) {
  146.                 case kNewItem:
  147.                     wind = NewUserGroupWindow("\puntitled", nil, 0);
  148.                     ShowWindow(wind);
  149.                     break;
  150.                 case kOpenItem:
  151.                     DoOpenGroupList();
  152.                     break;
  153.                 case kCloseItem:
  154.                     if (kind == kFullGroup) {
  155.                         ShowHideGroups();
  156.                     } else {
  157.                         DoCloseWindow(wind);
  158.                     }
  159.                     break;
  160.                 case kSaveItem:
  161.                 case kSaveAsItem:
  162.                     switch (kind) {
  163.                         case kArticle:
  164.                         case kMiscArticle:
  165.                         case kPostMessage:
  166.                         case kMailMessage:
  167.                             DoSaveWindow(wind);
  168.                             break;
  169.                         case kUserGroup:
  170.                             if (selItem == kSaveItem) {
  171.                                 DoSave(wind);
  172.                             } else {
  173.                                 DoSaveAs(wind);
  174.                             }
  175.                             break;
  176.                     }
  177.                     break;
  178.                 case kPageSetupItem:
  179.                     DoPageSetup();
  180.                     break;
  181.                 case kPrintItem:
  182.                     DoPrint(wind);
  183.                     break;
  184.                 case kPrintSelItem:
  185.                     ErrorMessage("Not yet implemented.");
  186.                     break;
  187.                 case kGetFromHostItem:
  188.                     DoGetGroupListFromHost(false);
  189.                     break;
  190.                 case kSendToHostItem:
  191.                     DoSendGroupListToHost(wind, "", "", "", "");
  192.                     break;
  193.                 case kPrefsItem:
  194.                     DoPrefsDialog();
  195.                     break;
  196.                 case kQuitItem:
  197.                     gDone = true;
  198.                     break;
  199.             }
  200.             break;
  201.             
  202.         case kEditMenu:
  203.             if (selItem == kUndoItem || selItem == kCutItem || selItem == kCopyItem ||
  204.                 selItem == kPasteItem || selItem == kClearItem)
  205.             {
  206.                 editCmd = selItem == kClearItem ? 5 : selItem-1;
  207.                 daEditCmd = SystemEdit(editCmd);
  208.             }
  209.             if (!daEditCmd)
  210.                 switch (selItem) {
  211.                     case kUndoItem:
  212.                         break;
  213.                     case kCutItem:
  214.                         TECut(theTE);
  215.                         ZeroScrap();
  216.                         TEToScrap();
  217.                         AdjustScrollBar(wind);
  218.                         CheckInsertion(wind);
  219.                         break;
  220.                     case kCopyItem:
  221.                         TECopy(theTE);
  222.                         ZeroScrap();
  223.                         TEToScrap();
  224.                         break;
  225.                     case kPasteItem:
  226.                         TEFromScrap();
  227.                         TEPaste(theTE);
  228.                         AdjustScrollBar(wind);
  229.                         CheckInsertion(wind);
  230.                         break;
  231.                     case kPasteQuoteItem:
  232.                         ErrorMessage("Not yet implemented.");
  233.                         break;
  234.                     case kClearItem:
  235.                         TEDelete(theTE);
  236.                         AdjustScrollBar(wind);
  237.                         CheckInsertion(wind);
  238.                         break;
  239.                     case kSelectAllItem:
  240.                         DoSelectAll(wind);
  241.                         break;
  242.                     case kShowHideHeaderItem:
  243.                         DoShowHideHeader(wind);
  244.                         break;
  245.                     case kRotItem:
  246.                         DoRot(wind);
  247.                         break;
  248.                 }
  249.             break;
  250.  
  251.         case kNewsMenu:
  252.             switch (selItem) {
  253.                 case kNextArticleItem:
  254.                     DoNextArticle(wind, false);
  255.                     break;
  256.                 case kNextThreadItem:
  257.                     DoNextThread(wind);
  258.                     break;
  259.                 case kNextGroupItem:
  260.                     DoNextGroup(wind);
  261.                     break;
  262.                 case kMarkReadItem:
  263.                     DoMarkCommand(wind, true);
  264.                     break;
  265.                 case kMarkUnreadItem:
  266.                     DoMarkCommand(wind, false);
  267.                     break;
  268.                 case kPostItem:
  269.                     MakePost(wind);
  270.                     break;
  271.                 case kFollowUpItem:
  272.                     MakeFollowUp(wind);
  273.                     break;
  274.                 case kReplyViaEmailItem:
  275.                     MakeRespond(wind);
  276.                     break;
  277.                 case kSendItem:
  278.                     if (DoSendMsg(wind)) DoCloseWindow(wind);
  279.                     break;
  280.                 case kCheckNewArticlesItem:
  281.                     DoCheckNewArticles(wind);
  282.                     break;
  283.             }
  284.             break;
  285.         
  286.         case kSearchMenu:
  287.             switch (selItem) {
  288.                 case kFindItem:
  289.                     ErrorMessage("Not yet implemented.");
  290.                     break;
  291.                 case kFindAgainItem:
  292.                     ErrorMessage("Not yet implemented.");
  293.                     break;
  294.                 case kSearchItem:
  295.                     DoSearch(wind);
  296.                     break;
  297.                 case kGroupKillItem:
  298.                     #ifdef FILTERS
  299.                         GroupKillDialog(wind);
  300.                     #else
  301.                         ErrorMessage("Not yet implemented.");
  302.                     #endif
  303.                     break;
  304.                 case kKillAuthorItem:
  305.                     #ifdef FILTERS
  306.                         KillThisAuthor(wind);
  307.                     #else
  308.                         ErrorMessage("Not yet implemented.");
  309.                     #endif
  310.                     break;
  311.                 case kKillSubjectItem:
  312.                     #ifdef FILTERS
  313.                         KillThisSubject(wind);
  314.                     #else
  315.                         ErrorMessage("Not yet implemented.");
  316.                     #endif
  317.                     break;
  318.             }
  319.             break;
  320.  
  321.         case kSpecialMenu:
  322.             switch (selItem) {
  323.                 case kSubscribeItem:
  324.                     DoSubscribe(wind);
  325.                     break;
  326.                 case kUnsubscribeItem:
  327.                     DoUnsubscribe(wind);
  328.                     break;
  329.                 case kCheckNewGroupsItem:
  330.                     CheckForNewGroups();
  331.                     CreateNewGroupListWindow();
  332.                     break;
  333.                 case kCheckDeletedGroupsItem:
  334.                     CheckForDeletedGroups();
  335.                     break;
  336.                 case kRebuildFullGroupsItem:
  337.                     ReadGroupsFromServer();
  338.                     break;
  339.                 case kOpenSelRefItem:
  340.                     OpenSelectedReference(wind);
  341.                     break;
  342.                 case kOpenAllRefsItem:
  343.                     OpenReferences(wind);
  344.                     break;
  345.                 case kGetServerInfoItem:
  346.                     GetServerInfo();
  347.                     break;
  348.             }
  349.             break;
  350.  
  351.         case kWindMenu:
  352.             switch (selItem) {
  353.                 case kCycleItem:
  354.                     SendBehind(wind,nil);
  355.                     break;
  356.                 case kZoomItem:
  357.                     ToggleZoom(wind);
  358.                     break;
  359.                 case kShowHideFullItem:
  360.                     ShowHideGroups();
  361.                     break;
  362.                 default:
  363.                     SelectWindMenu(selItem);
  364.                     break;
  365.             }
  366.      }
  367.     HiliteMenu(0);
  368. }
  369.