mirror of
https://github.com/elliotnunn/supermario.git
synced 2025-02-26 02:29:04 +00:00
425 lines
14 KiB
OpenEdge ABL
425 lines
14 KiB
OpenEdge ABL
|
{
|
|||
|
File: Balloonptch28.p
|
|||
|
|
|||
|
Contains: Pascal routines called from Balloonptch28.p
|
|||
|
|
|||
|
Written by: Randy Carr
|
|||
|
|
|||
|
Copyright: © 1989-1992 by Apple Computer, Inc., all rights reserved.
|
|||
|
|
|||
|
Change History (most recent first):
|
|||
|
|
|||
|
<47> 3/23/92 JSM OSEvents.p is obsolete, use Events.p.
|
|||
|
<46> 11/1/91 KSM Added gestaltHelpMgrExtensions set up and conditionalized it for
|
|||
|
theFuture. Decided not to change the gestaltHelpMgrPresent set
|
|||
|
up to BSET with gestalt constant since it shipped as (result:=1)
|
|||
|
and will always be that way.
|
|||
|
<45> 2/20/91 RLC ksm,#81872 - Fix bug that wasn't restoring port after 'About
|
|||
|
Balloon Help' dialog is dismissed.
|
|||
|
<44> 1/23/91 RLC <rnv> Remove calls to TextFont(), TextSize(), and ShowWindow()
|
|||
|
the copyright notice was removed from About… dialog as per John
|
|||
|
Sullivan. We aren't doing any special checking for contents
|
|||
|
checking inside the alert either.
|
|||
|
<43> 12/3/90 RLC <ksm>Update for new Dmgr FrontWindowModal calls.
|
|||
|
<42> 10/23/90 RLC <ngk> Eliminate unused globals when allocating our globals ptr.
|
|||
|
Toss code that used to be called from _InitWindows patch.
|
|||
|
Change code that handles the About Help… dialog to call
|
|||
|
the new dialog mgr set default item stuff.
|
|||
|
<41> 9/23/90 RLC Toss patch to InitWindows that was reallocating the layerptr
|
|||
|
each time InitWindows was called. Change to have the
|
|||
|
HMSetBalloons(true) allocate the layer and the window only when
|
|||
|
balloon help comes on.
|
|||
|
<40> 9/22/90 gbm Change InitWindows patch to stop putting help layer in the
|
|||
|
system heap.
|
|||
|
<39> 9/19/90 ngk <ksm> Now explicitly call standard filter proc in
|
|||
|
ptchHMShowHelpAboutDialog
|
|||
|
<38> 9/13/90 RLC Change HMGlobals to be a ptr instead of a handle, as it gets
|
|||
|
allocated at init time (early) and preallocation of a master
|
|||
|
ptr; Update all references to the hmGlobalHandle to hmGlobalPtr.
|
|||
|
<37> 8/31/90 RLC Update file to use newest naming conventions in equates and put
|
|||
|
in support for patch to OSEventAvail to call HMBalloonBulk for
|
|||
|
sleeping applications in foreground.
|
|||
|
<36> 8/20/90 RLC Fix bug that ‘Bonehead Ed’ said was the correct way to test
|
|||
|
ColorQD is present. This makes balloons hang off of the edge.
|
|||
|
<35> 8/16/90 RLC Change private interfaces to always return OsErr.
|
|||
|
<35> 8/6/90 RLC Shorten the about box code.
|
|||
|
<34> 7/30/90 RLC Update to support changes to about dialog.
|
|||
|
<33> 7/24/90 RLC Conditionally remove the “Feedback” balloon and update calls to
|
|||
|
HMShowBalloon to match real interface.
|
|||
|
<32> 7/13/90 RLC Shorten some global initialization, don't call SysEnvirons
|
|||
|
anymore, assume presence of LayerMgr.
|
|||
|
<31> 7/3/90 RLC Fix “Balloons On” Balloon.
|
|||
|
<30> 7/2/90 RLC Conditionally remove help icon tracking code.
|
|||
|
<29> 6/22/90 RLC Remove some false/NIL/ or 0 assignments that is done from
|
|||
|
NewHandleClear now.
|
|||
|
<28> 6/14/90 RLC Add routines to support “Balloons On” balloon and include
|
|||
|
BalloonDefs.p
|
|||
|
<27> 6/8/90 KSM Update for new IsFrontWindowModal.
|
|||
|
<26> 6/7/90 VL Remove InstallPatch code. Move installation code for Gestalt
|
|||
|
function to Balloonpack28.a.
|
|||
|
<25> 6/5/90 RLC Fix some front window bugs.
|
|||
|
<24> 6/1/90 RLC Add call to ScriptMgr in InitLayers code to retrieve the help
|
|||
|
font & size.
|
|||
|
<23> 5/30/90 RLC Remove some patch references and update global record.
|
|||
|
<22> 5/4/90 RLC Patches CONST changes.
|
|||
|
<21> 5/3/90 RLC Update hmGlobalRecord to support lastModalDialog window.
|
|||
|
<20> 4/18/90 RLC Call DaveC's cool centering code for About… dialog.
|
|||
|
<19> 4/10/90 KSM Toss some stupid patches and add to InitWindows patch.
|
|||
|
<18> 4/2/90 RLC Rearrange some parts to allow for cutback in future.
|
|||
|
<17> 3/28/90 RLC Fix append items to help menu for twitches.
|
|||
|
<16> 3/23/90 RLC Add first time Balloon.
|
|||
|
<15> 3/21/90 RLC Add delay back in.
|
|||
|
<14> 3/20/90 RLC Fix Help menu update problem by calling ptchHMUpdateHelpMenu at
|
|||
|
ptch init time.
|
|||
|
<13> 3/15/90 RLC Update HMGlobalRecord again, fix NewGestalt call.
|
|||
|
<12> 3/7/90 RLC Fix hmgProcess globals.
|
|||
|
<11> 2/23/90 RLC Toss a bunch of globals from HMGlobalRecord.
|
|||
|
<10> 2/12/90 RLC Add code to support HMSetDialogResID & HMSetMenuResID.
|
|||
|
<9> 2/7/90 RLC Initialize hmgTix := Tickcount;
|
|||
|
<8> 2/5/90 RLC Add Delay items to About Dialog…
|
|||
|
<7> 2/5/90 RLC Remove dead code, optimize, change Using dialog again.
|
|||
|
<6> 1/31/90 RLC Optimize ptchHMBootInitHelpMgr & add HMPutDSPatch
|
|||
|
<5> 1/29/90 RLC Fix Using Help… Modal dialog code.
|
|||
|
<4> 1/26/90 RLC Update global record for hmgOurBalloon word.
|
|||
|
<3> 1/22/90 RLC Fix debug options and remove obsolete routines.
|
|||
|
<2> 1/10/90 RLC Add hmgTix to HMGlobalRecord.
|
|||
|
<1.4> 11/30/89 RLC Fixed dialog tracker and updated HMGlobalsRecord to match
|
|||
|
BalloonPack.p
|
|||
|
<1.3> 11/15/89 RLC Remove _Debugger calls for real builds.
|
|||
|
<1.2> 11/13/89 RLC Changed _IsDialogEvent patch call to HMTrackHelpIcon to check
|
|||
|
for _FrontWindow=DialogKind.
|
|||
|
<1.1> 11/7/89 RLC Updated tracking routine for Help icon.
|
|||
|
<1.0> 11/2/89 RLC Created Today.
|
|||
|
}
|
|||
|
|
|||
|
{$ifc UNDEFINED HelpMgrTesting}
|
|||
|
{$setc HelpMgrTesting = false}
|
|||
|
{$endc}
|
|||
|
|
|||
|
{$setc HelpIncludeHelpIcon = false}
|
|||
|
|
|||
|
{$ifc HelpMgrTesting}
|
|||
|
{$D+}
|
|||
|
{$INIT+}
|
|||
|
{$elsec}
|
|||
|
{$D-}
|
|||
|
{$INIT-}
|
|||
|
{$endc}
|
|||
|
|
|||
|
UNIT Balloonptch28;
|
|||
|
|
|||
|
INTERFACE
|
|||
|
|
|||
|
USES
|
|||
|
Types, QuickDraw, ToolUtils, Fonts, Events, Controls,
|
|||
|
Windows, Dialogs, Files, Menus, Desk, Traps, OSUtils, Script,
|
|||
|
Resources, Memory, Packages, FixMath, Errors, Layers, Processes, Balloons, GestaltEqu, MenuMgrPriv, DialogsPriv;
|
|||
|
|
|||
|
CONST
|
|||
|
UnImplementedTrap = $9F;
|
|||
|
|
|||
|
{Using Help Dialog consts}
|
|||
|
UsingHelpOK = 1;
|
|||
|
UsingHelpPict1 = 2;
|
|||
|
UsingHelpPict2 = 3;
|
|||
|
|
|||
|
MBarHeight = $BAA;
|
|||
|
|
|||
|
|
|||
|
{$I BalloonDefs.p}
|
|||
|
|
|||
|
FUNCTION ptchHMPascalGetBalloons: BOOLEAN;
|
|||
|
FUNCTION ptchHMGestaltIsThereHelp(selector: OSType; VAR result: LongInt): OsErr;
|
|||
|
FUNCTION ptchHMBootInitHelpManager : OsErr;
|
|||
|
|
|||
|
PROCEDURE ptchHMToggleWhatIs; { maintenance routine for _SystemMenu patch }
|
|||
|
|
|||
|
{$ifc HelpIncludeHelpIcon}
|
|||
|
PROCEDURE ptchTrackHelpIcon; { tracks the help icon in modal dialogs and alerts }
|
|||
|
{$endc}
|
|||
|
|
|||
|
PROCEDURE ptchHMShowHelpAboutDialog;
|
|||
|
PROCEDURE ptchHMCallTrackerInContext;
|
|||
|
|
|||
|
|
|||
|
IMPLEMENTATION
|
|||
|
|
|||
|
|
|||
|
PROCEDURE ptchHMUpdateHelpMenu; EXTERNAL;
|
|||
|
FUNCTION ptchHMGetHelpGlobal: HMGlobalPtr; EXTERNAL;
|
|||
|
PROCEDURE ptchHMSetHelpGlobal(gp: HMGlobalPtr); EXTERNAL;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
FUNCTION HMBalloonBulk: OsErr;
|
|||
|
INLINE $303C,$00FC,_Pack14;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
{$ifc HelpMgrTesting}
|
|||
|
PROCEDURE Assert(b: BOOLEAN; s: STR255);
|
|||
|
BEGIN
|
|||
|
if b then DebugStr(s);
|
|||
|
END;
|
|||
|
{$endc}
|
|||
|
|
|||
|
|
|||
|
FUNCTION IsThisAModalDialog: BOOLEAN;
|
|||
|
VAR class: INTEGER;
|
|||
|
result: OSErr;
|
|||
|
BEGIN
|
|||
|
result := GetFrontWindowModalClass(class);
|
|||
|
|
|||
|
IF result <> noErr THEN
|
|||
|
IsThisAModalDialog := FALSE
|
|||
|
ELSE
|
|||
|
IsThisAModalDialog := (class = dBoxProc);
|
|||
|
END;
|
|||
|
|
|||
|
|
|||
|
FUNCTION ptchHMPascalGetBalloons: BOOLEAN; {we need this for PACK call: FUNCTION HMGetBalloons: BOOLEAN;}
|
|||
|
BEGIN
|
|||
|
ptchHMPascalGetBalloons := ptchHMGetHelpGlobal^.hmgWhatIs;
|
|||
|
END;
|
|||
|
|
|||
|
FUNCTION ptchHMGestaltIsThereHelp(selector: OSType; VAR result: LongInt): OsErr;
|
|||
|
BEGIN
|
|||
|
ptchHMGestaltIsThereHelp := noErr;
|
|||
|
result := 1; {<47> Show that the Help Mgr is present }
|
|||
|
{ Additional feature flags below }
|
|||
|
{$IFC theFuture}
|
|||
|
BSET(result,gestaltHelpMgrExtensions); {<47> Conditionalized OUT until extensions rolled in }
|
|||
|
{$ENDC}
|
|||
|
END;
|
|||
|
|
|||
|
FUNCTION ptchHMBootInitHelpManager : OsErr; { *** eventually we'll want to put this past cut off point }
|
|||
|
VAR gp : Ptr;
|
|||
|
mh : MenuHandle;
|
|||
|
theUniverse : SysEnvRec;
|
|||
|
r : Rect;
|
|||
|
BEGIN
|
|||
|
ptchHMBootInitHelpManager := noErr;
|
|||
|
|
|||
|
if ptchHMGetHelpGlobal <> NIL then exit(ptchHMBootInitHelpManager); { help manager is already initialized }
|
|||
|
|
|||
|
gp := NewPtrSysClear(Sizeof(HMGlobalRecord)); {always make it clear, saves code this way!}
|
|||
|
if gp<>NIL then
|
|||
|
with HMGlobalPtr(gp)^ do
|
|||
|
begin
|
|||
|
hmgHasColorQD := IntegerPtr($28E)^ <= $3FFF;
|
|||
|
|
|||
|
hmgItemNum := -1;
|
|||
|
hmgMenuID := -1;
|
|||
|
|
|||
|
hmgDialogQueue := HHMHelpQueueRecord(NewHandleSysClear(Sizeof(INTEGER))); { just room for count }
|
|||
|
hmgMenuQueue := HHMHelpQueueRecord(NewHandleSysClear(Sizeof(INTEGER))); { just room for count }
|
|||
|
|
|||
|
hmgDelay := 5;
|
|||
|
hmgTix := Tickcount; { initialize delay count }
|
|||
|
|
|||
|
end else
|
|||
|
ptchHMBootInitHelpManager := MemError;
|
|||
|
|
|||
|
ptchHMSetHelpGlobal(HMGlobalPtr(gp));
|
|||
|
END;
|
|||
|
|
|||
|
|
|||
|
PROCEDURE ptchHMToggleWhatIs;
|
|||
|
BEGIN
|
|||
|
if HMSetBalloons(not ptchHMGetHelpGlobal^.hmgWhatIs)=noErr then
|
|||
|
ptchHMUpdateHelpMenu;
|
|||
|
END;
|
|||
|
|
|||
|
|
|||
|
PROCEDURE ptchHMCallTrackerInContext;
|
|||
|
VAR frontPSN : ProcessSerialNumber;
|
|||
|
info : ProcessInfoRec;
|
|||
|
BEGIN
|
|||
|
if GetFrontProcess(frontPSN)=noErr then
|
|||
|
if WakeUpProcess(frontPSN)=noErr then
|
|||
|
if HMBalloonBulk=noErr then; { this call is also reentrant protected }
|
|||
|
|
|||
|
ptchHMGetHelpGlobal^.hmgOSEventReentrantCount := 0;
|
|||
|
END;
|
|||
|
|
|||
|
|
|||
|
{$ifc HelpIncludeHelpIcon}
|
|||
|
|
|||
|
PROCEDURE ptchTrackHelpIcon;
|
|||
|
{ This code pops up a duplicate pull-down Help menu when the mouse goes down over the
|
|||
|
Help icon. As of A12, we're no longer including this source. Maybe someday, when
|
|||
|
I get my way.
|
|||
|
}
|
|||
|
VAR pt : Point;
|
|||
|
d : DialogPtr;
|
|||
|
theID : INTEGER;
|
|||
|
theType : ResType;
|
|||
|
name : STR255;
|
|||
|
offset : Point;
|
|||
|
iconRect : Rect;
|
|||
|
hDITL : hItemList;
|
|||
|
pItem : pDITLItem;
|
|||
|
hItems : hItemList;
|
|||
|
USB : SByteArray;
|
|||
|
err : OsErr;
|
|||
|
value : INTEGER;
|
|||
|
dataSize,i : INTEGER;
|
|||
|
numItems : INTEGER;
|
|||
|
trackRect : Rect;
|
|||
|
h : Handle;
|
|||
|
originalState : BOOLEAN;
|
|||
|
foundHelpIcon : BOOLEAN;
|
|||
|
aResult : LongInt;
|
|||
|
aMenu : MenuHandle;
|
|||
|
oldPort : GrafPtr;
|
|||
|
ibits : BitMap;
|
|||
|
|
|||
|
BEGIN
|
|||
|
d := FrontWindow;
|
|||
|
|
|||
|
if d=NIL then exit(ptchTrackHelpIcon);
|
|||
|
|
|||
|
{ quik check to see if the front window is truely a dialog…
|
|||
|
This was a BAD bug in D19 build!! }
|
|||
|
if WindowPeek(d)^.windowKind<>DialogKind then exit(ptchTrackHelpIcon);
|
|||
|
|
|||
|
GetPort(oldPort);
|
|||
|
SetPort(d);
|
|||
|
|
|||
|
foundHelpIcon := false;
|
|||
|
|
|||
|
hItems := hItemList(DialogPeek(d)^.items);
|
|||
|
|
|||
|
numItems := hItems^^.dlgMaxIndex + 1;
|
|||
|
pItem := @hItems^^.DITLItems;
|
|||
|
for i := 1 to numItems do
|
|||
|
begin
|
|||
|
USB.Int := 0;
|
|||
|
USB.SBArray[1] := pItem^.itmData[0];
|
|||
|
|
|||
|
with pItem^ do
|
|||
|
if BAnd(itmType,$7F) = iconItem then
|
|||
|
if (IntegerPtr(@itmdata[1])^ = kHMHelpIconOff) |
|
|||
|
(IntegerPtr(@itmdata[1])^ = kHMHelpIconOn) then
|
|||
|
begin
|
|||
|
foundHelpIcon := true;
|
|||
|
trackRect := itmRect;
|
|||
|
leave;
|
|||
|
end;
|
|||
|
|
|||
|
dataSize := BAnd(USB.Int + 1, $FFFE);
|
|||
|
pItem := pDITLItem(ptr(ord4(@pItem^) + datasize + sizeof(DITLItem)));
|
|||
|
end;
|
|||
|
|
|||
|
|
|||
|
if foundHelpIcon then { there is our Help Icon in the DITL handle }
|
|||
|
begin
|
|||
|
(*originalState := ptchHMPascalGetBalloons;
|
|||
|
we don't need this code unless we need to change the icon's appearance *)
|
|||
|
|
|||
|
if button then { the button is down so check to see if it is in our Icon }
|
|||
|
begin
|
|||
|
HLock(Handle(hItems));
|
|||
|
GetMouse(pt);
|
|||
|
|
|||
|
if PtInRect(pt,trackRect) then
|
|||
|
begin
|
|||
|
with iconRect do
|
|||
|
begin
|
|||
|
topLeft := trackRect.topLeft;
|
|||
|
right := left+20;
|
|||
|
bottom := top+20;
|
|||
|
end;
|
|||
|
|
|||
|
aMenu := GetMHandle(kHMHelpMenuID);
|
|||
|
|
|||
|
ptchHMUpdateHelpMenu;
|
|||
|
|
|||
|
InsertMenu(aMenu,-1); {insert it in the hierportion of menulist}
|
|||
|
|
|||
|
InvertRect(iconRect);
|
|||
|
|
|||
|
with d^.portBits.bounds do
|
|||
|
aResult := PopUpMenuSelect(aMenu,
|
|||
|
trackRect.top-top+21,
|
|||
|
trackRect.left-left+1,0);
|
|||
|
|
|||
|
case LoWrd(aResult) of
|
|||
|
kHMUsingHelpItem: ptchHMShowHelpAboutDialog;
|
|||
|
kHMWhatIsItem: ptchHMToggleWhatIs;
|
|||
|
{ ### otherwise handle a user menu item }
|
|||
|
end;
|
|||
|
|
|||
|
InvertRect(iconRect);
|
|||
|
|
|||
|
ptchHMUpdateHelpMenu;
|
|||
|
|
|||
|
DeleteMenu(kHMHelpMenuID); {this is OK as hier portion is chked 1st}
|
|||
|
end;
|
|||
|
|
|||
|
HUnlock(Handle(hItems));
|
|||
|
end;
|
|||
|
|
|||
|
(* we don't need this code unless we change the help icon's appearance
|
|||
|
if originalState<>ptchHMPascalGetBalloons then
|
|||
|
begin
|
|||
|
value := kHMHelpIconOff - ord(ptchHMPascalGetBalloons);
|
|||
|
|
|||
|
h := GetIcon(value);
|
|||
|
|
|||
|
if h<>NIL then
|
|||
|
begin
|
|||
|
SByteArray(pItem^.itmData[2]).Int := value; { force the itemnum to be this }
|
|||
|
|
|||
|
pItem^.itmHndl := h; { & force the icon handle too}
|
|||
|
|
|||
|
PlotIcon(trackRect,h);
|
|||
|
iconRect := trackRect;
|
|||
|
|
|||
|
iconRect.top := trackRect.bottom - 13;
|
|||
|
InvalRect(iconRect);
|
|||
|
|
|||
|
iconRect.top := trackRect.top;
|
|||
|
iconRect.left := trackRect.right - 13;
|
|||
|
InvalRect(iconRect);
|
|||
|
{Used to just use: PlotIcon(trackRect,h);
|
|||
|
but this wipes the entire 32X32 bit rectangle}
|
|||
|
end;
|
|||
|
|
|||
|
if HMRemoveBalloon=noErr then; {calls _Pack14!! - make sure no balloons are up }
|
|||
|
end;
|
|||
|
*)
|
|||
|
end;
|
|||
|
|
|||
|
SetPort(oldPort);
|
|||
|
END;
|
|||
|
|
|||
|
{$endc} { end of HelpIncludeHelpIcon conditional }
|
|||
|
|
|||
|
|
|||
|
PROCEDURE ptchHMShowHelpAboutDialog;
|
|||
|
VAR d : DialogPtr;
|
|||
|
savePort : GrafPtr;
|
|||
|
itemhit : INTEGER;
|
|||
|
BEGIN
|
|||
|
GetPort(savePort); { <45> }
|
|||
|
d := GetNewDialog(kHMHelpID,NIL,Pointer(-1));
|
|||
|
if d<>NIL then
|
|||
|
begin
|
|||
|
if SetDialogDefaultItem(d,1)=0 then ;
|
|||
|
SetPort(d);
|
|||
|
ptchHMGetHelpGlobal^.hmgOurDialog := true;
|
|||
|
REPEAT
|
|||
|
ModalDialog(NIL,itemhit);
|
|||
|
UNTIL itemhit = UsingHelpOK;
|
|||
|
DisposDialog(d);
|
|||
|
ptchHMGetHelpGlobal^.hmgOurDialog := false;
|
|||
|
end;
|
|||
|
SetPort(savePort); { <45> always restore the original port as we'll end up with the wmgrport if we don't }
|
|||
|
END;
|
|||
|
|
|||
|
|
|||
|
END.
|