home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyOOMenus.p < prev    next >
Encoding:
Text File  |  1997-01-17  |  6.4 KB  |  250 lines  |  [TEXT/CWIE]

  1. unit MyOOMenus;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, MyFMenus;
  7.  
  8.     procedure StartupOOMenus;
  9.     procedure DisplayMenuBar;
  10.     procedure DoDefaultMenu (themenu, theitem: integer);
  11.     function SetOOMenuBar: boolean;
  12.     procedure EnableHandleQuitBoth (creator: OSType; both_index, justus_index: integer);
  13.  
  14. implementation
  15.  
  16.     uses
  17.         Traps, Balloons, Devices, TextUtils, Processes, Files, Menus, AppleEvents, Quickdraw, Events, Windows,
  18.         MyTypes, MySystemGlobals, MyMenus, MyStrings, MyVersionResource, MyEvents, 
  19.         BaseGlobals, MyFMenus, MyOOMainLoop, AERegistry, MyAEUtils, AEObjects, MyStartup, MyProcesses;
  20.  
  21. {$ifc do_debug}
  22.     var
  23.         startup_check: integer;
  24. {$endc}
  25.  
  26.     var
  27.         creatorType: OSType;
  28.         both, justus: integer;
  29.         quit_both_menu, quit_both: Boolean;
  30.  
  31.     procedure SetQuit (themenu, theitem: integer);
  32.         var
  33.             process: ProcessSerialNumber;
  34.             s: Str255;
  35.             fs: FSSpec;
  36.     begin
  37.         quit_both_menu := last_event_had_option & FindProcess(creatorType, application, process, fs);
  38.         if quit_both_menu then begin
  39.             GetIndString(s, global_strh_id, both);
  40.         end else begin
  41.             GetIndString(s, global_strh_id, justus);
  42.         end;
  43.         SetMenuItemText(GetMenuHandle(themenu), theitem, s);
  44.     end;
  45.  
  46.     function SetOOMenuBar: boolean;
  47.     begin
  48.         AssertDidStartup( startup_check );
  49.         SetOOMenuBar := FrontObject.SetMenuBar;
  50.     end;
  51.  
  52.     function HandleEditMenu (var event, reply: AppleEvent; refcon: longint): OSErr;
  53.     begin
  54. {$unused(event, reply)}
  55.         FrontObject.DoEditMenu(refcon);
  56.         HandleEditMenu := noErr;
  57.     end;
  58.  
  59.     procedure DoDefaultMenu (themenu, theitem: integer);
  60.         var
  61.             save: GrafPtr;
  62.             DAName: Str255;
  63.             oe: OSErr;
  64.     begin
  65.         AssertDidStartup( startup_check );
  66.         if themenu = M_Apple then begin
  67.             GetPort(save);
  68.             GetMenuItemText(GetMenuHandle(M_Apple), theitem, DAName);
  69.             oe := OpenDeskAcc(DAName);
  70.             SetPort(save);
  71.         end else if themenu = M_Edit then begin
  72.             if has_AppleEvents then begin
  73.                 case theitem of
  74.                     EMundo: 
  75.                         SendSelfSimpleEvent(kAECoreSuite, kAEUndo);
  76.                     EMcut: 
  77.                         SendSelfSimpleEvent(kAECoreSuite, kAECut);
  78.                     EMcopy: 
  79.                         SendSelfSimpleEvent(kAECoreSuite, kAECopy);
  80.                     EMpaste: 
  81.                         SendSelfSimpleEvent(kAECoreSuite, kAEPaste);
  82.                     EMclear: 
  83.                         SendSelfSimpleEvent(kAECoreSuite, kAEDelete);
  84.                     EMselectall: 
  85.                         SendSelfSimpleEvent(kAECoreSuite, kAESelect); { hmmm }
  86.                     otherwise begin
  87.                         FrontObject.DoEditMenu(theitem);
  88.                     end;
  89.                 end;
  90.             end else begin
  91.                 FrontObject.DoEditMenu(theitem);
  92.             end;
  93.         end;
  94.     end;
  95.  
  96.     procedure DoClose;
  97.     begin
  98.         DoCloseAll(last_event_had_option);
  99.     end;
  100.  
  101.     procedure SetCloseMenu (themenu, theitem: integer);
  102.         var
  103.             fw: WindowPtr;
  104.             er: EventRecord;
  105.             dummy: boolean;
  106.     begin
  107.         fw := FrontWindow;
  108.         if fw = nil then begin
  109.             SetIDItemEnable(themenu, theitem, (fw <> nil) & WindowPeek(fw)^.goAwayFlag & (GetWType(fw) <> WT_NotMine));
  110.         end else begin
  111.             SetIDItemEnable(themenu, theitem, WindowPeek(fw)^.goAwayFlag);
  112.         end;
  113.         dummy := OSEventAvail(everyEvent, er);
  114.         last_event_had_option := EventHasOptionKey( er );
  115.         if ord(GS_OptionClose) > 0 then begin
  116.             if last_event_had_option then begin
  117.                 SetIDItem(themenu, theitem, GetGlobalStr( GS_OptionClose ));
  118.             end else begin
  119.                 SetIDItem(themenu, theitem, GetGlobalStr( GS_NormalClose ));
  120.             end;
  121.         end;
  122.     end;
  123.  
  124.     procedure SetEditMenus (menu, item: integer);
  125.     begin
  126. {$unused(menu)}
  127.         FrontObject.SetEditMenuItem(item);
  128.     end;
  129.  
  130.     procedure SendSelfQuitEvent;
  131.         var
  132.             event, reply: AppleEvent;
  133.             err, junk: OSErr;
  134.             target: AEDesc;
  135.     begin
  136.         AECreate(reply);
  137.         err := CreateSelfTarget(target);
  138.         err := AECreateAppleEvent(kCoreEventClass, kAEQuitApplication, target, kAutoGenerateReturnID, kAnyTransactionID, event);
  139.         AEDestroy(target);
  140.         junk := PutBooleanToAERecord(event, keyOdocOption, quit_both_menu);
  141.         if err = noErr then begin
  142.             junk := AESend(event, reply, kAENoReply + kAEAlwaysInteract, kAENormalPriority, kAEDefaultTimeout, nil, nil);
  143.         end;
  144.         AEDestroy(event);
  145.         AEDestroy(reply);
  146.     end;
  147.  
  148.     procedure DoQuit;
  149.     begin
  150.         quit_both := quit_both_menu;
  151.         if has_AppleEvents then begin
  152.             SendSelfQuitEvent;
  153.         end else begin
  154.             quitNow := true;
  155.         end;
  156.     end;
  157.  
  158.     procedure DisplayMenuBar;
  159.         var
  160.             dummyb: boolean;
  161.     begin
  162.         dummyb := SetOOMenuBar;
  163.         DrawMenuBar;
  164.     end;
  165.  
  166.     function InitOOMenus(var msg: integer): OSStatus;
  167.         var
  168.             junk: OSErr;
  169.             HandleEditMenuProc : UniversalProcPtr;
  170.     begin
  171. {$unused(msg)}
  172.         DidStartup( startup_check );
  173.         quitNow := false;
  174.         quit_both_menu := false;
  175.         quit_both := false;
  176.  
  177.         MH_Apple := GetFMenu(M_Apple);
  178.         AppendResMenu(MH_Apple, 'DRVR');
  179.         InsertMenu(MH_Apple, 0);
  180.  
  181.         MH_File := GetFMenu(M_File);
  182.         InsertMenu(MH_File, 0);
  183.         MH_Edit := GetFMenu(M_Edit);
  184.         InsertMenu(MH_Edit, 0);
  185.  
  186. {$IFC 0}
  187.         M_HM_Help_I := -1;
  188.         hstr := GetGlobalString(help_menu_text);
  189.         if has_HelpManager and (hstr <> '') then begin
  190.             GetVersion(vers);
  191.             SPrintS3(hstr, hstr, vers.name, '', '');
  192.             oe := HMGetHelpMenuHandle(mh);
  193.             if (oe = noErr) and (mh <> nil) then begin
  194.                 AppendMenu(mh, hstr);
  195.                 M_HM_Help_I := CountMItems(mh);
  196.                 AddFCommand(kHMHelpMenuID, M_HM_Help_I, Chelp);
  197.             end;
  198.         end;
  199. {$ENDC}
  200.  
  201.         if has_AppleEvents then begin
  202.             HandleEditMenuProc := NewAEEventHandlerProc(HandleEditMenu);
  203.             junk := AEInstallEventHandler(kAECoreSuite, kAEUndo, HandleEditMenuProc, EMundo, false);
  204.             junk := AEInstallEventHandler(kAECoreSuite, kAECut, HandleEditMenuProc, EMcut, false);
  205.             junk := AEInstallEventHandler(kAECoreSuite, kAECopy, HandleEditMenuProc, EMcopy, false);
  206.             junk := AEInstallEventHandler(kAECoreSuite, kAEPaste, HandleEditMenuProc, EMpaste, false);
  207.             junk := AEInstallEventHandler(kAECoreSuite, kAEDelete, HandleEditMenuProc, EMclear, false);
  208.             junk := AEInstallEventHandler(kAECoreSuite, kAESelect, HandleEditMenuProc, EMselectall, false);
  209.         end;
  210.  
  211.         SetFBoth(Cclose, DoClose, SetCloseMenu);
  212.         SetFCommand(Cquit, DoQuit);
  213.         SetFSetMenu(Cundo, SetEditMenus);
  214.         SetFSetMenu(Ccut, SetEditMenus);
  215.         SetFSetMenu(Ccopy, SetEditMenus);
  216.         SetFSetMenu(Cpaste, SetEditMenus);
  217.         SetFSetMenu(Cclear, SetEditMenus);
  218.         SetFSetMenu(Cselectall, SetEditMenus);
  219.         SetFMenus;
  220.         InitOOMenus := noErr;
  221.     end;
  222.  
  223.     procedure EnableHandleQuitBoth (creator: OSType; both_index, justus_index: integer);
  224.     begin
  225.         creatorType := creator;
  226.         both := both_index;
  227.         justus := justus_index;
  228.         SetFSetMenu(Cquit, SetQuit);
  229.     end;
  230.     
  231.     procedure FinishOOMenus;
  232.     begin
  233.         if quit_both then begin
  234.             QuitApplication(creatorType, application);
  235.         end;
  236.     end;
  237.     
  238.     procedure StartupOOMenus;
  239.     begin
  240.         StartupFMenus;
  241.         StartupMainLoop;
  242.         SetStartup(InitOOMenus, nil, 0, FinishOOMenus);
  243.     end;
  244.     
  245. end.
  246.     var
  247.         editEnabled: boolean;
  248.  
  249.         editEnabled := true;
  250.