home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyOOMainLoop.p < prev    next >
Encoding:
Text File  |  1995-10-23  |  33.1 KB  |  1,363 lines  |  [TEXT/CWIE]

  1. unit MyOOMainLoop;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Quickdraw, Windows, Dialogs, AppleEvents, Drag,
  7.         MyFMenus;
  8.  
  9.     const
  10.         WT_NotMine = 'NtMe';
  11.         WT_Generic = 'Genr';
  12.         bad_window_id = -1;
  13.         kAECloseAll = 'Clos';
  14.  
  15.     type
  16.         SCType = (SCSave, SCCancel, SCDiscard);
  17.         WObject = object
  18.                 window: dialogPtr;
  19.                 resid: integer;
  20.                 window_type: OSType;
  21.                 window_id: longInt;
  22.                 growRect: rect; { minimum/maximum rect size (for use with grow window) }
  23.                 zoomSize: point; { Optimum zoom size }
  24.                 zoomed: boolean;
  25.                 unzoomed: rect;
  26.                 draw_grow_icon: boolean;
  27.                 is_active: boolean;
  28.                 is_default_object: boolean;
  29.                 close_hides_window: boolean;
  30.                 popup_title_menu: MenuHandle;
  31.                 AppleGuideWindowType: str31;
  32.                 onlyone: ^WObject;    { Set onlyone^ to nil when we destroy ourselves }
  33.                 timetoclose:boolean;
  34.                 procedure JointCreate (id: integer);
  35.                 procedure Create (id: integer);
  36.                 procedure CreateBehind (id: integer; behind: WindowPtr);
  37.                 procedure Destroy;
  38.                 procedure GetWindowPos (h: handle);
  39.                 procedure SetWindowPos (h: handle; var wasvisible: boolean);
  40.                 function SaveChangesID (alert_id: integer): integer;
  41.                 function SaveChanges: SCType;
  42.                 procedure DoClose;
  43. { DoClose checks modified things etc, then calls Destroy }
  44.                 function SetMenuBar: boolean;
  45.                 procedure SetMenus;
  46.                 function EditMenuEnabled: boolean;
  47.                 procedure SetEditMenuItem (item: integer);
  48.                 procedure DoEditMenu (item: integer);
  49.                 function GetAESelection (var reply: AppleEvent): OSErr;
  50.                 function GetAEWindow (var windowrec: AERecord): OSErr;
  51.                 function DoMenuKey (er: eventRecord; ch: char): longInt;
  52.                 procedure CalculateRegion (var rgn: rgnHandle);
  53.                 function WaitForEvent (var er: eventRecord; sleep: longInt): boolean;
  54.                 procedure DoIdle;
  55.                 procedure DoIdleAlways;
  56.                 procedure DoDiskEvent (message: longInt);
  57.                 procedure DoSuspendResume (resume: boolean);
  58.                 procedure DoHighLevel (er: eventRecord);
  59.                 procedure DoContent (er: eventRecord);
  60.                 procedure DoKey (modifiers: integer; ch: char; code: integer);
  61.                 procedure DoSpecialKey (modifiers: integer; ch: char; code: integer);
  62.                 procedure DoAutoKey (modifiers: integer; ch: char; code: integer);
  63.                 procedure DoPopupTitle (choice: integer);
  64.                 function CheckPopupTitle (where: Point): boolean;
  65.                 procedure DoDrag (where: point);
  66.                 procedure DoGrow (where: point);
  67.                 procedure Zoom (zoomout: boolean; fullscreen: boolean);
  68.                 procedure DoZoom (where: point; code: integer);
  69.                 procedure DoGoAway (where: point);
  70.                 procedure DoUpdate;
  71.                 procedure DoMouseMoved (where: point);
  72.                 procedure DrawGrow;
  73.                 procedure DoActivateDeactivate (activate: boolean);
  74.                 procedure TextChanged; { called for paste/clear/cut/key down etc }
  75.                 procedure Resize;
  76.                 procedure InitialZoom (h, v: integer);
  77.                 procedure Draw;
  78.                 function TrackingHandler (message: DragTrackingMessage; dragref: DragReference): OSErr;
  79.                 function ReceiveHandler (dragref: DragReference): OSErr;
  80.                 function DragSend (flavor: FlavorType; item: ItemReference; dragref: DragReference): OSErr;
  81.                 function DoSetupDrag (dragref: DragReference; dragrgn: RgnHandle): OSErr;
  82.                 procedure DoTrackDrag (var er: EventRecord);
  83.                 function DoMainClick (er: eventRecord; wp: windowPtr; code: integer): boolean;
  84.                 function DoIsDialogEvent (er: eventRecord): boolean;
  85.                 function DoDialogSelect (er: eventRecord; var dlg: dialogPtr; var item: integer): boolean;
  86.                 function HandleSimpleEvents (er: eventRecord): boolean;
  87.                 function HandleEvents (er: eventRecord): boolean;
  88.             end;
  89.         DObject = object(WObject)
  90.                 ok_item, cancel_item, outline_item: integer;
  91.                 handle_activate_outline: boolean;
  92.                 handle_shift_tab: boolean;
  93.                 disable_edit_menu: boolean;
  94.                 text_return: boolean;
  95.                 procedure Create (id: integer);
  96.                 override;
  97.                 procedure CreateBehind (id: integer; behind: WindowPtr);
  98.                 override;
  99.                 procedure Destroy;
  100.                 override;
  101.                 procedure SetOOOutline (def_item, user_item: integer);
  102.                 procedure DrawOutline;
  103.                 procedure DoActivateDeactivate (activate: boolean);
  104.                 override;
  105.                 function HandleEvents (er: eventRecord): boolean;
  106.                 override;
  107.                 procedure DoItem (item: integer);
  108.                 procedure DoItemWhere (er: eventRecord; item: integer);
  109.                 procedure DoCancel (modifiers: integer; ch: char; code: integer);
  110.                 procedure DoOK (modifiers: integer; ch: char; code: integer);
  111.                 procedure SetEditMenuItem (item: integer);
  112.                 override;
  113.                 function EditMenuEnabled: boolean;
  114.                 override;
  115.                 procedure DoEditMenu (item: integer);
  116.                 override;
  117.                 function DoIsDialogEvent (er: eventRecord): boolean;
  118.                 override;
  119.                 function GetAESelection (var reply: AppleEvent): OSErr;
  120.                 override;
  121.                 procedure CalculateRegion (var rgn: rgnHandle);
  122.                 override;
  123.             end;
  124.  
  125.     var
  126.         default_object: WObject;
  127.         edit_menu_always_enabled: boolean;
  128.         last_event_time: longInt;
  129.         last_event_modifers: integer;
  130.         last_event_had_option: boolean;
  131.         last_event_had_command: boolean;
  132.         last_event_had_shift: boolean;
  133.         last_event_had_control: boolean;
  134.         has_DragManager: boolean;
  135.  
  136.     procedure StartupMainLoop;
  137.     procedure ConfigureMainLoop (dobj: DObject);
  138. { dobj will be used returned with window set to wp whenever GetWObject/GetDObject is called with a DA or nil window }
  139.     function GetWType (wp: windowPtr): OSType;
  140.     function GetWObject (wp: windowPtr): WObject;
  141.     function GetDObject (dlg: dialogPtr): DObject;
  142.     function FrontObject: WObject;
  143.     function IsWObjectFront (o: WObject): boolean;
  144.     function FindWindowID (id: longInt): WObject;
  145.     procedure DoCloseAll (all: boolean);
  146.  
  147. implementation
  148.  
  149.     uses
  150.         Memory, ToolUtils, Scrap, Fonts, Resources, Errors, DiskInit, AEObjects, AERegistry, 
  151.         CodeFragments, Drag, Script, Processes, GestaltEqu, MixedMode, MyStartup, 
  152.         MyMenus, MyTypes, MyFMenus, BaseGlobals, MySystemGlobals, MyCursors,MyCallProc,MyCleverAlerts, 
  153.         MyTEUtils, MyAssertions, MyDialogs, MyAEUtils, MyWindows, MyMathUtils, QLowLevel, MyUtils;
  154.  
  155.     const
  156.         titlebar_hight = 18;
  157.  
  158.     const
  159. { from EPPC }
  160.         OOMagic = 'MyOO';
  161.         BadOOMagic = 'bado';
  162.  
  163.     type
  164.         myWindowRecord = record
  165.                 thewindow: windowRecord;
  166.                 magic: OSType;
  167.             end;
  168.         myWindowPtr = ^myWindowRecord;
  169.         myDialogRecord = record
  170.                 thedialog: dialogRecord;
  171.                 magic: OSType;
  172.             end;
  173.         myDialogPtr = ^myDialogRecord;
  174.  
  175.     var
  176.         last_window_id: longInt;
  177.         gMyDragSendProc : UniversalProcPtr;
  178.  
  179.     procedure DoCloses (all: boolean);
  180.         var
  181.             fw: WindowPtr;
  182.     begin
  183.         if all then begin
  184.             fw := FrontWindow;
  185.             while fw <> nil do begin
  186.                 FrontObject.DoClose;
  187.                 if fw = FrontWindow then begin
  188.                     leave;
  189.                 end;
  190.                 fw := FrontWindow;
  191.             end;
  192.         end
  193.         else begin
  194.             FrontObject.DoClose;
  195.         end;
  196.     end;
  197.  
  198.     function HandleClose (var event, reply: AppleEvent; refcon: longInt): OSErr;
  199.         var
  200.             err: OSErr;
  201.     begin
  202.         event:=event; { UNUSED! }
  203.         reply:=reply; { UNUSED! }
  204.         if FrontWindow <> nil then begin
  205.             DoCloses(refcon <> 0);
  206.             err := noErr;
  207.         end
  208.         else begin
  209.             err := errAENoSuchObject;
  210.         end;
  211.         HandleClose := err;
  212.     end;
  213.  
  214.     procedure DoCloseAll (all: boolean);
  215.     begin
  216.         if has_AppleEvents then begin
  217.             if all then begin
  218.                 SendSelfSimpleEvent(kAECoreSuite, kAECloseAll);
  219.             end
  220.             else begin
  221.                 SendSelfSimpleEvent(kAECoreSuite, kAEClose);
  222.             end;
  223.         end
  224.         else begin
  225.             DoCloses(all);
  226.         end;
  227.     end;
  228.  
  229.     function WObject.TrackingHandler (message: DragTrackingMessage; dragref: DragReference): OSErr;
  230.     begin
  231.         message:=message; { UNUSED! }
  232.         dragref:=dragref;
  233.         TrackingHandler := -1;
  234.     end;
  235.  
  236.     function MyTrackingHandler (message: DragTrackingMessage; window: WindowPtr; refcon: Ptr; dragref: DragReference): OSErr;
  237.     begin
  238.         refcon:=refcon; { UNUSED! }
  239.         MyTrackingHandler := GetWObject(window).TrackingHandler(message, dragref);
  240.     end;
  241.  
  242.     function WObject.ReceiveHandler (dragref: DragReference): OSErr;
  243.     begin
  244.         dragref:=dragref; { UNUSED! }
  245.         ReceiveHandler := -1;
  246.     end;
  247.  
  248.     function MyReceiveHandler (window: WindowPtr; refcon: Ptr; dragref: DragReference): OSErr;
  249.     begin
  250.         refcon:=refcon; { UNUSED! }
  251.         MyReceiveHandler := GetWObject(window).ReceiveHandler(dragref);
  252.     end;
  253.  
  254.     function WObject.DragSend (flavor: FlavorType; item: ItemReference; dragref: DragReference): OSErr;
  255.     begin
  256.         flavor:=flavor; { UNUSED! }
  257.         item:=item; { UNUSED! }
  258.         dragref:=dragref; { UNUSED! }
  259.         DragSend := -1;
  260.     end;
  261.  
  262.     var
  263.         drag_obj: WObject;
  264.  
  265.     function MyDragSend (flavor: FlavorType; refcon: Ptr; item: ItemReference; dragref: DragReference): OSErr;
  266.     begin
  267.         refcon:=refcon; { UNUSED! }
  268.         MyDragSend := drag_obj.DragSend(flavor, item, dragref);
  269.     end;
  270.  
  271.     function GetWRC (wp: windowPtr): WObject;
  272.         var
  273.             rc: longInt;
  274.     begin
  275.         rc := 0;
  276.         if (wp <> nil) & (windowPeek(wp)^.windowKind >= 0) then begin
  277.             if ((windowPeek(wp)^.windowKind = dialogKind) & (myDialogPtr(wp)^.magic = OOMagic)) | (myWindowPtr(wp)^.magic = OOMagic) then begin
  278.                 rc := GetWRefCon(wp);
  279.             end;
  280.         end;
  281.         if rc = 0 then begin
  282.             default_object.window := wp;
  283.             rc := longInt(default_object);
  284.         end;
  285.         GetWRC := WObject(rc);
  286.     end;
  287.  
  288.     function GetWType (wp: windowPtr): OSType;
  289.         var
  290.             wo: WObject;
  291.     begin
  292.         wo := GetWRC(wp);
  293.         if wo.is_default_object then begin
  294.             GetWType := WT_NotMine;
  295.         end else begin
  296.             GetWType := wo.window_type;
  297.         end;
  298.     end;
  299.  
  300.     function GetWObject (wp: windowPtr): WObject;
  301.     begin
  302.         GetWObject := GetWRC(wp);
  303.     end;
  304.  
  305.     function FindWindowID (id: longInt): WObject;
  306.         const
  307.             WindowList = $9D6;
  308.         type
  309.             WindowPtrPtr = ^WindowPtr;
  310.         var
  311.             w: windowPtr;
  312.             wo: WObject;
  313.     begin
  314.         FindWindowID := nil;
  315.         if id <> bad_window_id then begin
  316.             w := WindowPtrPtr(WindowList)^;
  317.             while w <> nil do begin
  318.                 wo := GetWObject(w);
  319.                 if (not wo.is_default_object) & (wo.window_id = id) then begin
  320.                     FindWindowID := wo;
  321.                     leave;
  322.                 end;
  323.                 w := windowPtr(windowPeek(w)^.nextWindow);
  324.             end;
  325.         end;
  326.     end;
  327.  
  328.     function GetDObject (dlg: dialogPtr): DObject;
  329.     begin
  330.         GetDObject := DObject(GetWRC(dlg));
  331.     end;
  332.  
  333.     function FrontObject: WObject;
  334.     begin
  335.         FrontObject := GetWRC(FrontWindow);
  336.     end;
  337.  
  338.     function IsWObjectFront (o: WObject): boolean;
  339.     begin
  340.         if o = nil then begin
  341.             IsWObjectFront := false;
  342.         end else if o.window = nil then begin
  343.             IsWObjectFront := false;
  344.         end else begin
  345.             IsWObjectFront := o.window = FrontWindow;
  346.         end;
  347.     end;
  348.  
  349.     function WObject.DoSetupDrag (dragref: DragReference; dragrgn: RgnHandle): OSErr;
  350.     begin
  351.         dragref:=dragref; { UNUSED! }
  352.         dragrgn:=dragrgn; { UNUSED! }
  353.         DoSetupDrag := -1;
  354.     end;
  355.  
  356.     procedure WObject.DoTrackDrag (var er: EventRecord);
  357.         var
  358.             err: OSErr;
  359.             dragref: DragReference;
  360.             dragrgn: RgnHandle;
  361.     begin
  362.         drag_obj := self;
  363.         err := NewDrag(dragref);
  364.         if err = noErr then begin
  365.             dragrgn := NewRgn;
  366.             err := MemError;
  367.             if err = noErr then begin
  368.                 err := DoSetupDrag(dragref, dragrgn);
  369.                 if err = noErr then begin
  370.                     err := SetDragSendProc(dragref, gMyDragSendProc, nil);
  371.                 end;
  372.                 if err = noErr then begin
  373.                     CursorSetProcessing(false);
  374.                     err := TrackDrag(dragref, er, dragrgn);
  375.                 end;
  376.                 DisposeRgn(dragrgn);
  377.             end;
  378.             err := DisposeDrag(dragref);
  379.         end;
  380.     end;
  381.  
  382.     function WObject.SaveChangesID (alert_id: integer): integer;
  383.         var
  384.             a: integer;
  385.             title: str255;
  386.     begin
  387.         SelectWindow(window);
  388.         GetWTitle(window, title);
  389.         if quitNow then begin
  390.             CleverParamText(title, GetGlobalString(quiting_str), '', '');
  391.         end
  392.         else begin
  393.             CleverParamText(title, GetGlobalString(closing_str), '', '');
  394.         end;
  395.         a := CleverAlert(alert_id);
  396.         SaveChangesID := a;
  397.     end;
  398.  
  399.     function WObject.SaveChanges: SCType;
  400.     begin
  401.         SaveChanges := SCType(SaveChangesID(save_changes_alert_id) - 1);
  402.     end;
  403.  
  404.     function WObject.EditMenuEnabled: boolean;
  405.     begin
  406.         if window = nil then begin
  407.             EditMenuEnabled := false;
  408.         end else begin
  409.             EditMenuEnabled := windowPeek(window)^.windowKind < 0;
  410.         end;
  411.     end;
  412.  
  413.     function WObject.SetMenuBar: boolean;
  414.         var
  415.             oldEditEnabled, editEnabled: boolean;
  416.     begin
  417.         oldEditEnabled := GetIDItemEnable(M_Edit, 0);
  418.         editEnabled := FrontObject.EditMenuEnabled or edit_menu_always_enabled;
  419.         if editEnabled <> oldEditEnabled then begin
  420.             SetIDItemEnable(M_Edit, 0, editEnabled);
  421.         end;
  422.         SetMenuBar := editEnabled <> oldEditEnabled;
  423.     end;
  424.  
  425.     procedure WObject.SetMenus;
  426.     begin
  427.         SetFMenus;
  428.     end;
  429.  
  430.     procedure WObject.SetEditMenuItem (item: integer);
  431.     begin
  432.         if not EditMenuEnabled then begin
  433.             SetIDItemEnable(M_Edit, item, false);
  434.         end;
  435.     end;
  436.  
  437.     procedure WObject.DoEditMenu (item: integer);
  438.         var
  439.             dummyb: boolean;
  440.     begin
  441.         if item <= 6 then begin
  442.             dummyb := SystemEdit(item - 1);
  443.         end;
  444.     end;
  445.  
  446.     function WObject.GetAESelection (var reply: AppleEvent): OSErr;
  447.     begin
  448.         reply:=reply; { UNUSED! }
  449.         GetAESelection := errAENoUserSelection;
  450.     end;
  451.  
  452.     function WObject.GetAEWindow (var windowrec: AERecord): OSErr;
  453.         var
  454.             err, junk: OSErr;
  455.             s: str255;
  456.             r: rect;
  457.     begin
  458.         AECreate(windowrec);
  459.         if is_default_object then begin
  460.             err := errAEDescNotFound;
  461.         end
  462.         else begin
  463.             err := AECreateList(nil, 0, true, windowrec);
  464.             GetWTitle(window, s);
  465.             if err = noErr then begin
  466.                 junk := PutStringToAERecord(windowrec, pName, s);
  467.                 r := window^.portRect;
  468.                 SetPort(window);
  469.                 LocalToGlobal(r.topleft);
  470.                 LocalToGlobal(r.botright);
  471.                 junk := AEPutParamPtr(windowrec, keyAEBounds, typeQDRectangle, @r, SizeOf(r));
  472.                 junk := AEPutParamPtr(windowrec, keyAEPosition, typeQDPoint, @r.topleft, SizeOf(r.topleft));
  473.             end;
  474.         end;
  475.         GetAEWindow := err;
  476.     end;
  477.  
  478.     function WObject.DoMenuKey (er: eventRecord; ch: char): longInt;
  479.     begin
  480.         ch:=ch; { UNUSED! }
  481.         DoMenuKey := DoFMenuKey(er);
  482.     end;
  483.  
  484.     procedure WObject.CalculateRegion (var rgn: rgnHandle);
  485.     begin
  486.         CursorSetArrow;
  487.         rgn := nil;
  488.     end;
  489.  
  490.     function WObject.WaitForEvent (var er: eventRecord; sleep: longInt): boolean;
  491.         var
  492.             rgn: rgnHandle;
  493.     begin
  494.         if (window <> nil) & IsWindowShaded(window) then begin
  495.             CursorSetArrow;
  496.             rgn := nil;
  497.         end else begin
  498.             CalculateRegion(rgn);
  499.         end;
  500.         CursorSetProcessing(false);
  501.         WaitForEvent := WaitNextEvent(everyEvent, er, sleep, rgn);
  502.         if rgn <> nil then begin
  503.             DisposeRgn(rgn);
  504.         end;
  505.     end;
  506.  
  507.     procedure WObject.DoDiskEvent (message: longInt);
  508.         var
  509.             pt: point;
  510.             oe: OSErr;
  511.     begin
  512.         if (HiWord(message) <> noErr) then begin
  513.             pt.h := ((GetQDGlobals^.screenbits.bounds.Right - GetQDGlobals^.screenbits.bounds.Left - 304) div 2);
  514.             pt.v := ((GetQDGlobals^.screenbits.bounds.Bottom - GetQDGlobals^.screenbits.bounds.Top - 156) div 3);
  515.             CursorSetArrow;
  516.             CursorSetProcessing(false);
  517.             oe := DIBadMount(pt, message);
  518.         end;
  519.     end;
  520.  
  521.     procedure WObject.DoSuspendResume (resume: boolean);
  522.     begin
  523.         SetInForeground(resume);
  524.         if FrontWindow <> nil then begin
  525.             FrontObject.DoActivateDeactivate(resume);
  526.         end;
  527.         CursorSetArrow;
  528.     end;
  529.  
  530.     procedure WObject.DoHighLevel (er: eventRecord);
  531.         var
  532.             oe: OSErr;
  533.     begin
  534.         if has_AppleEvents then begin
  535.             oe := AEProcessAppleEvent(er);
  536.         end;
  537.     end;
  538.  
  539.     procedure WObject.JointCreate (id: integer); { Called for DefaultObject too! }
  540.     begin
  541.         MoveHHi(handle(self));
  542.         HLock(handle(self));
  543.         popup_title_menu := nil;
  544.         AppleGuideWindowType := '';
  545.         if window <> nil then begin
  546.             SetWRefCon(window, ord4(self));
  547.             GetWindowRect(window, unzoomed);
  548.         end;
  549.         zoomed := false;
  550.         close_hides_window := false;
  551.         SetRect(growRect, 63, 61, 25000, 25000);
  552.         zoomSize.h := 30000;
  553.         zoomSize.v := 30000;
  554.         window_type := WT_Generic;
  555.         draw_grow_icon := false;
  556.         window_id := last_window_id;
  557.         last_window_id := last_window_id + 1;
  558.         resid := id;
  559.         is_default_object := false;
  560.         onlyone := nil;
  561.         timetoclose:=false;
  562.     end;
  563.  
  564.     procedure WObject.CreateBehind (id: integer; behind: WindowPtr);
  565.         var
  566.             wp: myWindowPtr;
  567.     begin
  568.         wp := myWindowPtr(NewPtr(SizeOf(myWindowRecord)));
  569.         wp^.magic := OOMagic;
  570.         window := GetNewWindow(id, ptr(wp), behind);
  571.         JointCreate(id);
  572.     end;
  573.  
  574.     procedure WObject.Create (id: integer);
  575.     begin
  576.         CreateBehind(id, POINTER(-1));
  577.     end;
  578.  
  579.     procedure WObject.Destroy;
  580.     begin
  581.         if (window <> nil) & (GetWType(window) <> WT_NotMine) then begin
  582.             myWindowPtr(window)^.magic := BadOOMagic;
  583.             DisposeWindow(window);
  584.             if onlyone <> nil then begin
  585.                 onlyone^ := nil;
  586.             end;
  587.             dispose(self);
  588.         end;
  589.     end;
  590.  
  591.     type
  592.         savedWindowRecord = record
  593.                 windowpos: rect; { the window position }
  594.                 windowvis: rect; { the visible part of the title bar }
  595.                 zoomed: boolean;
  596.                 visible: boolean;
  597.             end;
  598.         savedWindowPtr = ^savedWindowRecord;
  599.         savedWindowHandle = ^savedWindowPtr;
  600.  
  601.     procedure WObject.GetWindowPos (h: handle);
  602.         var
  603.             rgn: RgnHandle;
  604.             r1, r2, global_portrect: rect;
  605.     begin
  606.         HUnlock(h);
  607.         SetHandleSize(h, SizeOf(savedWindowRecord));
  608.         HLock(h);
  609.         with savedWindowHandle(h)^^ do begin
  610.             SetPort(window);
  611.             visible := windowPeek(window)^.visible;
  612.             GetWindowPortRect(window, global_portrect);
  613.             LocalToGlobal(global_portrect.topleft);
  614.             LocalToGlobal(global_portrect.botright);
  615.             windowpos := global_portrect;
  616.             windowpos.top := windowpos.top - titlebar_hight; { title bar }
  617.             rgn := NewRgn;
  618.             RectRgn(rgn, windowpos);
  619.             SectRgn(GetGrayRgn, rgn, rgn);
  620.             windowvis := rgn^^.rgnBBox;
  621.             DisposeRgn(rgn);
  622.             r1 := global_portrect;
  623.             GetWindowStandardState(window, r2);
  624.             InsetRect(r1, -7, -7);
  625.             zoomed := PtInRect(r2.topLeft, r1) and PtInRect(r2.botRight, r1);
  626.         end;
  627.         HUnlock(h);
  628.     end;
  629.  
  630.     procedure WObject.SetWindowPos (h: handle; var wasvisible: boolean);
  631.         var
  632.             rgn: RgnHandle;
  633.             r: rect;
  634.             dummy: boolean;
  635.     begin
  636.         if (h <> nil) & (GetHandleSize(h) = SizeOf(savedWindowRecord)) then begin
  637.             HLock(h);
  638.             with savedWindowHandle(h)^^ do begin
  639.                 wasvisible := visible;
  640.                 rgn := NewRgn;
  641.                 RectRgn(rgn, windowvis);
  642.                 SectRgn(GetGrayRgn, rgn, rgn);
  643.                 r := rgn^^.rgnBBox;
  644.                 DisposeRgn(rgn);
  645.                 dummy := SectRect(r, windowvis, r);
  646.                 if (longInt(r.topleft) = longInt(windowvis.topleft)) & (longInt(r.botright) = longInt(windowvis.botright)) then begin
  647.                     with windowpos do begin
  648.                         MoveWindow(window, left, top + titlebar_hight, true);
  649.                         SizeWindow(window, right - left, bottom - top - titlebar_hight, true);
  650.                     end;
  651.                 end;
  652.                 if zoomed then begin
  653.                     Zoom(true, false);
  654.                 end
  655.                 else begin
  656.                     Resize;
  657.                 end;
  658.             end;
  659.             HUnlock(h);
  660.         end
  661.         else
  662.             wasvisible := true;
  663.     end;
  664.  
  665.     procedure WObject.DoClose;
  666.     begin
  667.         if close_hides_window then begin
  668.             HideWindow(window);
  669.         end
  670.         else begin
  671.             Destroy;
  672.         end;
  673.     end;
  674.  
  675.     procedure WObject.DoContent (er: eventRecord);
  676.     begin
  677.         er:=er; { UNUSED! }
  678.     end;
  679.  
  680.     procedure WObject.DoKey (modifiers: integer; ch: char; code: integer);
  681.     begin
  682.         modifiers:=modifiers; { UNUSED! }
  683.         ch:=ch; { UNUSED! }
  684.         code:=code; { UNUSED! }
  685.         SysBeep(1);
  686.     end;
  687.  
  688.     procedure WObject.DoSpecialKey (modifiers: integer; ch: char; code: integer);
  689.         var
  690.             item: integer;
  691.     begin
  692.         item := -1;
  693.         if not system7 then begin
  694.             case code of
  695.                 undoKey: 
  696.                     item := EMundo;
  697.                 cutKey: 
  698.                     item := EMcut;
  699.                 copyKey: 
  700.                     item := EMcopy;
  701.                 pasteKey: 
  702.                     item := EMpaste;
  703.                 clearKey: 
  704.                     item := EMclear;
  705.                 otherwise
  706.                     ;
  707.             end;
  708.         end;
  709.         if item <> -1 then begin
  710.             SetMenus;
  711.             if not GetIDItemEnable(M_Edit, 0) or not GetIDItemEnable(M_Edit, item) then begin
  712.                 item := -1;
  713.             end;
  714.         end;
  715.         if item = -1 then begin
  716.             DoKey(modifiers, ch, code);
  717.         end
  718.         else begin
  719.             DoFMenu(M_Edit, item);
  720.         end;
  721.     end;
  722.  
  723.     procedure WObject.DoAutoKey (modifiers: integer; ch: char; code: integer);
  724.     begin
  725.         DoKey(modifiers, ch, code);
  726.     end;
  727.  
  728.     procedure WObject.DoDrag (where: point);
  729.         var
  730.             temprect: rect;
  731.     begin
  732.         SetPort(window);
  733.         tempRect := GetGrayRgn^^.rgnBBox;
  734.         DragWindow(window, where, tempRect);
  735.     end;
  736.  
  737.     procedure WObject.DoGrow (where: point);
  738.         var
  739.             mypt: point;
  740.             oldrect: rect;
  741.             mResult: longInt;
  742.             tempRect: rect;
  743.     begin
  744.         SetPort(window);
  745.         myPt := where;
  746.         GlobalToLocal(myPt);
  747.         GetWindowPortRect(window, oldrect);
  748.         mResult := GrowWindow(window, where, growRect);
  749.         SizeWindow(window, LoWord(mResult), HiWord(mResult), TRUE);
  750.         SetRect(tempRect, 0, myPt.v - 15, myPt.h + 15, myPt.v + 15);
  751.         EraseRect(tempRect);
  752.         InvalRect(tempRect);
  753.         SetRect(tempRect, myPt.h - 15, 0, myPt.h + 15, myPt.v + 15);
  754.         EraseRect(tempRect);
  755.         InvalRect(tempRect);
  756.         zoomed := false;
  757.         Resize;
  758.     end;
  759.  
  760.     procedure WObject.Zoom (zoomout: boolean; fullscreen: boolean);
  761.         var
  762.             zoompt: Point;
  763.     begin
  764.         if fullscreen then begin
  765.             SetPt(zoompt, 30000, 30000);
  766.         end
  767.         else begin
  768.             zoompt := zoomSize;
  769.         end;
  770.         zoompt.h := Max(zoompt.h, growRect.left);
  771.         zoompt.v := Max(zoompt.v, growRect.top);
  772.         ZoomTheWindow(window, zoomout, zoompt, unzoomed);
  773.         Resize;
  774.         zoomed := zoomout;
  775.     end;
  776.  
  777.     procedure WObject.DoZoom (where: point; code: integer);
  778.     begin
  779.         SetPort(window);
  780.         if TrackBox(window, where, code) then begin
  781.             Zoom(not zoomed, last_event_had_option);
  782.         end;
  783.     end;
  784.  
  785.     procedure WObject.InitialZoom (h, v: integer);
  786.         var
  787.             old: Point;
  788.     begin
  789.         Resize;
  790.         old := zoomSize;
  791.         if h <> 0 then begin
  792.             zoomSize.h := h;
  793.         end;
  794.         if v <> 0 then begin
  795.             zoomSize.v := v;
  796.         end;
  797.         Zoom(true, false);
  798.         zoomSize := old;
  799.         zoomed := false;
  800.         GetWindowRect(window, unzoomed);
  801.     end;
  802.  
  803.     procedure WObject.DoGoAway (where: point);
  804.     begin
  805.         if TrackGoAway(window, where) then begin
  806.             DoCloseAll(last_event_had_option);
  807.         end;
  808.     end;
  809.  
  810.     procedure WObject.DoUpdate;
  811.     begin
  812.         BeginUpdate(window);
  813.         Draw;
  814.         EndUpdate(window);
  815.     end;
  816.  
  817.     procedure WObject.TextChanged;
  818.     begin
  819.     end;
  820.  
  821.     procedure WObject.DoMouseMoved (where: point);
  822.     begin
  823.         where:=where; { UNUSED! }
  824.     end;
  825.  
  826.     procedure WObject.DrawGrow;
  827.     begin
  828.         DrawGrowIcon(window);
  829.     end;
  830.  
  831.     procedure WObject.DoActivateDeactivate (activate: boolean);
  832.     begin
  833.         Assert(window <> nil);
  834.         is_active := activate and windowPeek(window)^.visible;
  835.         if is_active then begin
  836.             SelectWindow(window);
  837.         end;
  838.         if draw_grow_icon then begin
  839.             DrawGrow;
  840.         end;
  841.     end;
  842.  
  843.     procedure WObject.Resize;
  844.     begin
  845.         if draw_grow_icon then begin
  846.             DrawGrow;
  847.         end;
  848.     end;
  849.  
  850.     procedure WObject.Draw;
  851.     begin
  852.         if draw_grow_icon then begin
  853.             DrawGrow;
  854.         end;
  855.     end;
  856.  
  857.     function WObject.DoIsDialogEvent (er: eventRecord): boolean;
  858.     begin
  859.         DoIsDialogEvent := IsDialogEvent(er);
  860.     end;
  861.  
  862.     function WObject.DoDialogSelect (er: eventRecord; var dlg: dialogPtr; var item: integer): boolean;
  863.     begin
  864.         DoDialogSelect := DialogSelect(er, dlg, item);
  865.     end;
  866.  
  867.     procedure WObject.DoIdle;
  868.     begin
  869.     end;
  870.     
  871.     procedure WObject.DoIdleAlways;
  872.     begin
  873.         if timetoclose then begin
  874.             DoClose;
  875.         end;
  876.     end;
  877.  
  878.     procedure WObject.DoPopupTitle (choice: integer);
  879.     begin
  880.         choice:=choice; { UNUSED! }
  881.     end;
  882.  
  883.     function WObject.CheckPopupTitle (where: Point): boolean;
  884.         var
  885.             result: longInt;
  886.             center, width: integer;
  887.             saved: SavedWindowInfo;
  888.             title: Str255;
  889.             base: Point;
  890.     begin
  891.         CheckPopupTitle := false;
  892.         if popup_title_menu <> nil then begin
  893.             EnterWindow(window, MFT_System0, [], saved);
  894.             GlobalToLocal(where);
  895.             GetWTitle(window, title);
  896.             center := (window^.portRect.right + window^.portRect.left) div 2;
  897.             width := StringWidth(title);
  898.             base.h := center - width div 2 - 14;
  899.             base.v := -17;
  900.             if (where.v < 0) & (base.h <= where.h) & (where.h <= center + width div 2 + 5) then begin
  901.                 CheckPopupTitle := true;
  902.                 InsertMenu(popup_title_menu, -1);
  903.                 LocalToGlobal(base);
  904.                 CheckItem(popup_title_menu, 1, true);
  905.                 result := PopUpMenuSelect(popup_title_menu, base.v, base.h, 1);
  906.                 CheckItem(popup_title_menu, 1, false);
  907.                 DeleteMenu(popup_title_menu^^.menuID);
  908.                 if (HiWord(result) <> 0) and (LoWord(result) <> 1) then begin
  909.                     DoPopupTitle(LoWord(result));
  910. {DrawPopUp(dialog, item);}
  911.                 end;
  912.             end;
  913.             ExitWindow(saved);
  914.         end;
  915.     end;
  916.  
  917.     function WObject.DoMainClick (er: eventRecord; wp: windowPtr; code: integer): boolean;
  918.         var
  919.             b: boolean;
  920.             mResult: longInt;
  921.             needsselect: boolean;
  922.     begin
  923.         b := false;
  924.         needsselect := (wp <> nil) & (wp <> FrontWindow);
  925.         if needsselect & not (code in [inDrag, inContent]) then begin
  926.             SelectWindow(wp);
  927.         end;
  928.         case code of
  929.             inMenuBar:  begin
  930.                 SetMenus;
  931.                 mResult := MenuSelect(er.where);
  932.                 if mResult <> 0 then begin
  933.                     DoFMenu(HiWord(mResult), LoWord(mResult));
  934.                 end;
  935.                 if not quitNow then begin
  936.                     HiliteMenu(0);
  937.                 end;
  938.             end;
  939.             InDrag:  begin
  940.                 if needsselect | not last_event_had_command | not CheckPopupTitle(er.where) then begin
  941.                     if needsselect and not last_event_had_command then begin
  942.                         SelectWindow(wp);
  943.                     end;
  944.                     DoDrag(er.where);
  945.                 end;
  946.             end;
  947.             inGrow: 
  948.                 DoGrow(er.where);
  949.             inZoomIn, inZoomOut: 
  950.                 DoZoom(er.where, code);
  951.             inGoAway: 
  952.                 DoGoAway(er.where);
  953.             inContent:  begin
  954.                 if needsselect then begin
  955.                     SelectWindow(wp);
  956.                 end;
  957.                 DoContent(er);
  958.             end;
  959.             inSysWindow: 
  960.                 SystemClick(er, window);
  961.             otherwise
  962.                 b := true;
  963.         end;
  964.         DoMainClick := b;
  965.     end;
  966.  
  967.     function WObject.HandleSimpleEvents (er: eventRecord): boolean;
  968.         var
  969.             b: boolean;
  970.             ch: char;
  971.             mResult: longInt;
  972.             code: integer;
  973.             wp: WindowPtr;
  974.     begin
  975.         b := false;
  976.         case er.what of
  977.             MouseDown:  begin
  978.                 code := FindWindow(er.where, wp);
  979.                 if wp = nil then begin
  980.                     wp := FrontWindow;
  981.                 end;
  982.                 b := GetWObject(wp).DoMainClick(er, wp, code);
  983.             end;
  984.  
  985.             KeyDown:  begin
  986.                 ch := chr(BAND(er.message, CharCodeMask));
  987.                 mResult := 0;
  988.                 if last_event_had_command then begin
  989.                     SetMenus;
  990.                     mResult := DoMenuKey(er, ch);
  991.                 end;
  992.                 if mResult <> 0 then begin
  993.                     DoFMenu(HiWord(mResult), LoWord(mResult));
  994.                 end
  995.                 else begin
  996.                     DoSpecialKey(er.modifiers, ch, BAND(er.message, keyCodeMask) div $100);
  997.                 end;
  998.             end;
  999.  
  1000.             AutoKey: 
  1001.                 DoAutoKey(er.modifiers, chr(BAND(er.message, CharCodeMask)), BAND(er.message, keyCodeMask) div $100);
  1002.  
  1003.             UpdateEvt: 
  1004.                 GetWObject(windowPtr(er.message)).DoUpdate;
  1005.  
  1006.             ActivateEvt: 
  1007.                 GetWObject(windowPtr(er.message)).DoActivateDeactivate(odd(er.modifiers));
  1008.  
  1009.             kOSEvent: 
  1010.                 if BAND(BROTL(er.message, 8), $FF) = kSuspendResumeMessage then begin
  1011.                     DoSuspendResume(BAnd(er.message, kResumeMask) <> 0);
  1012.                 end
  1013.                 else if BAND(BROTL(er.message, 8), $FF) = kMouseMovedMessage then begin
  1014.                     DoMouseMoved(er.where);
  1015.                 end
  1016.                 else begin
  1017.                     b := true;
  1018.                 end;
  1019.  
  1020.             kHighLevelEvent: 
  1021.                 DoHighLevel(er);
  1022.  
  1023.             DiskEvt: 
  1024.                 DoDiskEvent(er.message);
  1025.  
  1026.             otherwise
  1027.                 b := true;
  1028.         end;
  1029.         HandleSimpleEvents := b;
  1030.     end;
  1031.  
  1032.     function WObject.HandleEvents (er: eventRecord): boolean;
  1033.         var
  1034.             b: boolean;
  1035.             dlg: dialogPtr;
  1036.             item: integer;
  1037.             dlgsel:boolean;
  1038.     begin
  1039.         last_event_time := er.when;
  1040.         last_event_modifers := er.modifiers;
  1041.         last_event_had_option := BAND(er.modifiers, optionKey) <> 0;
  1042.         last_event_had_command := BAND(er.modifiers, cmdKey) <> 0;
  1043.         last_event_had_shift := BAND(er.modifiers, shiftKey) <> 0;
  1044.         last_event_had_control := BAND(er.modifiers, controlKey) <> 0;
  1045.         DoIdle;
  1046.         b := true;
  1047.         if DoIsDialogEvent(er) then begin
  1048.             dlgsel:=DoDialogSelect(er, dlg, item);
  1049.             if dlgsel then begin
  1050.                 GetDObject(dlg).DoItemWhere(er, item);
  1051.                 b := false;
  1052.             end;
  1053.         end;
  1054.         if b then begin
  1055.             b := HandleSimpleEvents(er);
  1056.         end;
  1057.         HandleEvents := b;
  1058.     end;
  1059.  
  1060.     procedure DObject.CreateBehind (id: integer; behind: WindowPtr);
  1061.         var
  1062.             wp: myDialogPtr;
  1063.     begin
  1064.         disable_edit_menu := false;
  1065.         wp := myDialogPtr(NewPtr(SizeOf(myDialogRecord)));
  1066.         wp^.magic := OOMagic;
  1067.         window := GetNewDialog(id, ptr(wp), behind);
  1068.         ok_item := 0;
  1069.         cancel_item := 0;
  1070.         handle_activate_outline := false;
  1071.         handle_shift_tab := true;
  1072.         text_return := false;
  1073.         JointCreate(id);
  1074.     end;
  1075.  
  1076.     procedure DObject.Create (id: integer);
  1077.     begin
  1078.         CreateBehind(id, POINTER(-1));
  1079.     end;
  1080.  
  1081.     procedure DObject.Destroy;
  1082.     begin
  1083.         if (window <> nil) & (GetWType(window) <> WT_NotMine) then begin
  1084.             myDialogPtr(window)^.magic := BadOOMagic;
  1085.             DisposeDialog(window);
  1086.             if onlyone <> nil then begin
  1087.                 onlyone^ := nil;
  1088.             end;
  1089.             dispose(self);
  1090.         end;
  1091.     end;
  1092.  
  1093.     procedure DObject.DrawOutline;
  1094.     begin
  1095.         OutlineDefault1(window, outline_item);
  1096.     end;
  1097.  
  1098.     procedure DObject.SetOOOutline (def_item, user_item: integer);
  1099.     begin
  1100.         handle_activate_outline := true;
  1101.         ok_item := def_item;
  1102.         outline_item := user_item;
  1103.         SetUpDefaultOutline(window,ok_item, outline_item);
  1104.     end;
  1105.  
  1106.     procedure DObject.DoActivateDeactivate (activate: boolean);
  1107.     begin
  1108.         inherited DoActivateDeactivate(activate);
  1109.         if handle_activate_outline then begin
  1110.             DrawOutline;
  1111.         end;
  1112.     end;
  1113.  
  1114.     procedure DObject.DoOK (modifiers: integer; ch: char; code: integer);
  1115.     begin
  1116.         if ok_item = 0 then begin
  1117.             DoKey(modifiers, ch, code);
  1118.         end
  1119.         else begin
  1120.             if GetDCtlEnable(window, ok_item) then begin
  1121.                 FlashDItem(window, ok_Item);
  1122.                 DoItem(ok_item);
  1123.             end;
  1124.         end;
  1125.     end;
  1126.  
  1127.     procedure DObject.DoCancel (modifiers: integer; ch: char; code: integer);
  1128.     begin
  1129.         if cancel_item = 0 then begin
  1130.             DoKey(modifiers, ch, code);
  1131.         end else begin
  1132.             FlashDItem(window, cancel_Item);
  1133.             DoItem(cancel_item);
  1134.         end;
  1135.     end;
  1136.  
  1137.     procedure DObject.DoItem (item: integer);
  1138.     begin
  1139.         item:=item; { UNUSED! }
  1140.     end;
  1141.  
  1142.     procedure DObject.DoItemWhere (er: eventRecord; item: integer);
  1143.     begin
  1144.         er:=er; { UNUSED! }
  1145.         DoItem(item);
  1146.     end;
  1147.  
  1148.     function DObject.HandleEvents (er: eventRecord): boolean;
  1149.         var
  1150.             b: boolean;
  1151.             ch: char;
  1152.     begin
  1153.         b := true;
  1154.         if ((er.what = KeyDown) or (er.what = AutoKey)) then begin
  1155.             b := false;
  1156.             ch := chr(BAND(er.message, charCodeMask));
  1157.             if ((ch = chr(13)) & not text_return) | (ch = chr(3)) then begin
  1158.                 DoOK(er.modifiers, ch, BAND(er.message, keyCodeMask) div $100);
  1159.             end
  1160.             else if (ch = chr(27)) or ((ch = '.') and (BAND(er.modifiers, cmdKey) <> 0)) then begin
  1161.                 DoCancel(er.modifiers, ch, BAND(er.message, keyCodeMask) div $100);
  1162.             end
  1163.             else if (ch = tab) and (BAND(er.modifiers, shiftKey) <> 0) then begin
  1164.                 if handle_shift_tab then begin
  1165.                     ShiftTab(window);
  1166.                 end
  1167.                 else begin
  1168.                     b := true;
  1169.                 end;
  1170.             end
  1171.             else begin
  1172.                 b := true;
  1173.             end;
  1174.         end;
  1175.         if b then begin
  1176.             b := inherited HandleEvents(er);
  1177.         end;
  1178.         HandleEvents := b;
  1179.     end;
  1180.  
  1181.     procedure DObject.SetEditMenuItem (item: integer);
  1182.     begin
  1183.         if is_default_object or disable_edit_menu or (SelectedTextItem(window) <= 0) then begin
  1184.             SetIDItemEnable(M_Edit, item, false);
  1185.         end
  1186.         else begin
  1187.             TESetEditMenuItem(dialogPeek(window)^.textH, false, 250, item);
  1188.         end;
  1189.     end;
  1190.  
  1191.     function DObject.EditMenuEnabled: boolean;
  1192.     begin
  1193.         if is_default_object or disable_edit_menu or (SelectedTextItem(window) <= 0) then begin
  1194.             EditMenuEnabled := false;
  1195.         end
  1196.         else begin
  1197.             EditMenuEnabled := TEEditMenuEnabled(dialogPeek(window)^.textH, false, 250);
  1198.         end;
  1199.     end;
  1200.  
  1201.     procedure DObject.DoEditMenu (item: integer);
  1202.         var
  1203.             loe: longInt;
  1204.             oe: OSErr;
  1205.     begin
  1206.         case item of
  1207.             EMUndo: 
  1208.                 ;
  1209.             EMCut:  begin
  1210.                 DialogCut(window);
  1211.                 loe := ZeroScrap;
  1212.                 oe := TEToScrap;
  1213.                 TextChanged;
  1214.             end;
  1215.             EMCopy:  begin
  1216.                 DialogCopy(window);
  1217.                 loe := ZeroScrap;
  1218.                 oe := TEToScrap;
  1219.             end;
  1220.             EMPaste:  begin
  1221.                 oe := TEFromScrap;
  1222.                 DialogPaste(window);
  1223.                 TextChanged;
  1224.             end;
  1225.             EMClear:  begin
  1226.                 DialogDelete(window);
  1227.                 TextChanged;
  1228.             end;
  1229.             EMSelectAll:  begin
  1230.                 if (SelectedTextItem(window) > 0) then begin
  1231.                     SelectDialogItemText(window, SelectedTextItem(window), 0, maxInt);
  1232.                 end;
  1233.             end;
  1234.             otherwise
  1235.                 ;
  1236.         end;
  1237.     end;
  1238.  
  1239.     function DObject.GetAESelection (var reply: AppleEvent): OSErr;
  1240.         var
  1241.             err: OSErr;
  1242.     begin
  1243.         if not is_default_object & (SelectedTextItem(window) > 0) then begin
  1244.             err := PutTESelectionToAERecord(reply, keyDirectObject, dialogPeek(window)^.textH);
  1245.         end
  1246.         else begin
  1247.             err := errAENoUserSelection;
  1248.         end;
  1249.         GetAESelection := err;
  1250.     end;
  1251.  
  1252.     function DObject.DoIsDialogEvent (er: eventRecord): boolean;
  1253.     begin
  1254.         if ((er.what = keyDown) or (er.what = autoKey)) and last_event_had_command then begin
  1255.             DoIsDialogEvent := false; { Stop system 7 from doing the edit menu as well }
  1256.         end
  1257.         else begin
  1258.             DoIsDialogEvent := inherited DoIsDialogEvent(er);
  1259.         end;
  1260.     end;
  1261.  
  1262.     procedure DObject.CalculateRegion (var rgn: rgnHandle);
  1263.         var
  1264.             item,k:integer;
  1265.             pt:Point;
  1266.     begin
  1267.         rgn := nil;
  1268.         item:=0;
  1269.         if window<>nil then begin
  1270.             SetPort(window);
  1271.             GetMouse(pt);
  1272.             item:=FindDialogItem(window,pt)+1;
  1273.             if item>0 then begin
  1274.                 GetDItemKind(window,item,k);
  1275.                 if k<>editText then begin
  1276.                     item:=0;
  1277.                 end;
  1278.             end;
  1279.         end;
  1280.         if item>0 then begin
  1281.             CursorSetIBeam;
  1282.         end else begin
  1283.             CursorSetArrow;
  1284.         end;
  1285.     end;
  1286.  
  1287.     function HasDragLib:boolean;
  1288.     begin
  1289. {$IFC GENERATINGPOWERPC}
  1290.         HasDragLib := longInt(@InstallTrackingHandler) <> kUnresolvedCFragSymbolAddress;
  1291. {$ELSEC}
  1292.         HasDragLib := true;
  1293. {$ENDC}
  1294.     end;
  1295.  
  1296.     function InitMainLoop(var msg: integer): OSStatus;
  1297.         var
  1298.             i: integer;
  1299.             dummy: boolean;
  1300.             dummy_er: eventRecord;
  1301.             junk: OSErr;
  1302.             err: OSErr;
  1303.             HandleCloseProc:UniversalProcPtr;
  1304.             gv: longInt;
  1305.     begin
  1306.         msg := msg; { Unused }
  1307.         has_DragManager := HasDragLib & (Gestalt(gestaltDragMgrAttr, gv) = noErr) & (BTST(gv, gestaltDragMgrPresent));
  1308.         gMyDragSendProc := NewDragSendDataProc(@MyDragSend);
  1309.         for i := 1 to 5 do begin
  1310.             dummy := EventAvail(everyEvent, dummy_er);
  1311.         end;
  1312.         if has_DragManager then begin
  1313.             err := InstallTrackingHandler(NewDragTrackingHandlerProc(@MyTrackingHandler), nil, nil);
  1314.             err := InstallReceiveHandler(NewDragReceiveHandlerProc(@MyReceiveHandler), nil, nil);
  1315.         end;
  1316.         default_object.window := nil;
  1317.         default_object.window_id := bad_window_id;
  1318.         default_object.JointCreate(0);
  1319.         default_object.is_default_object := true;
  1320.         default_object.window_type := WT_NotMine;
  1321.         last_window_id := 1;
  1322.         edit_menu_always_enabled := false;
  1323.         if has_AppleEvents then begin
  1324.             HandleCloseProc:=NewAEEventHandlerProc(@HandleClose);
  1325.             junk := AEInstallEventHandler(kAECoreSuite, kAEClose,HandleCloseProc , 0, false);
  1326.             junk := AEInstallEventHandler(kAECoreSuite, kAECloseAll,HandleCloseProc , 1, false);
  1327.         end;
  1328.         InitMainLoop := noErr;
  1329.     end;
  1330.  
  1331.     procedure FinishMainLoop;
  1332.     begin
  1333.         dispose(default_object);
  1334.     end;
  1335.  
  1336.     procedure ConfigureMainLoop (dobj: DObject);
  1337.     begin
  1338.         default_object := dobj;
  1339.     end;
  1340.     
  1341.     procedure StartupMainLoop;
  1342.     begin
  1343.         StartupCleverAlerts;
  1344.         StartupCursors;
  1345.         StartupDialogs;
  1346.         StartupFMenus;
  1347.         SetStartup(InitMainLoop, nil, 0, FinishMainLoop);
  1348.     end;
  1349.     
  1350. end.
  1351.     procedure CallIdleAlways;
  1352.         var
  1353.             fw,next: WindowPtr;
  1354.     begin
  1355.         fw:=FrontWindow;
  1356.         while fw<>nil do begin
  1357.             next:=WindowPtr(WindowPeek(fw)^.nextWindow);
  1358.             GetWObject(fw).DoIdleAlways;
  1359.             fw:=next;
  1360.         end;
  1361.     end;
  1362.     
  1363.