REM ************************************************************************
REM * THIS CODE IS IN NO WAY COPYRIGHT BY INOVATRONICS, INC.  IN FACT, YOU *
REM * CAN DO ANYTHING WITH IT THAT YOU WANT TO DO.  JUST REMEMBER,         *
REM * INOVATRONICS, INC. WILL BEAR ABSOLUTELY NO RESPONSIBILITY FOR THE    *
REM * USE, MISUSE, INABILITY TO USE OR INABLITY TO UNDERSTAND ANY OR ALL   *
REM * PARTS OF THIS CODE.  ENJOY IT IN GOOD HEALTH.                        *
REM ************************************************************************
REM ************************************************************************
REM * THE PURPOSE OF THE CODE IS TO LET YOU SEE WHAT YOUR PowerWindows2    *
REM * GENERATED SOURCE CODE WILL LOOK LIKE IN A PROGRAM.  IT DEFAULTS TO   *
REM * TERMINATING WHEN THE CLOSE GADGET IS HIT, BUT IF YOU LOOK BELOW      *
REM * YOU'LL SEE HOW TO MAKE IT TERMINATE ON ANY EVENT AT ALL.             *
REM * PLEASE NOTE: IT IS DESIGNED FOR ONLY 1 WINDOW.  IT WILL LOAD A SCREEN*
REM * AND A PALETTE IF THEY ARE PRESENT, BUT ONLY WINDOW NUMBER 1 AND ITS  *
REM * PROGENY.                                                             *
REM ************************************************************************

DECLARE FUNCTION AllocRemember&() LIBRARY
DECLARE FUNCTION ClearMenuStrip&() LIBRARY
DECLARE FUNCTION CloseScreen&() LIBRARY
DECLARE FUNCTION CloseWindow&() LIBRARY
DECLARE FUNCTION DragGadget&() LIBRARY
DECLARE FUNCTION DrawBorder&() LIBRARY
DECLARE FUNCTION DrawImage&() LIBRARY
REM Next line is an InovaTools1 function
REM DECLARE FUNCTION DrawKnobs&() LIBRARY
DECLARE FUNCTION FreeRemember&() LIBRARY
DECLARE FUNCTION GetMsg&() LIBRARY
DECLARE FUNCTION ItemAddress&() LIBRARY
REM Next line is an InovaTools1 function
REM DECLARE FUNCTION KnobGadgets&() LIBRARY
DECLARE FUNCTION LoadRGB4&() LIBRARY
DECLARE FUNCTION OpenScreen&() LIBRARY
DECLARE FUNCTION OpenWindow&() LIBRARY
REM Next line is an InovaTools1 function
REM DECLARE FUNCTION PopUpMenu&() LIBRARY
DECLARE FUNCTION PrintIText&() LIBRARY
DECLARE FUNCTION ReplyMsg&() LIBRARY
DECLARE FUNCTION SetMenuStrip&() LIBRARY
DECLARE FUNCTION WaitPort&() LIBRARY

LIBRARY "intuition.library"
LIBRARY "graphics.library"
LIBRARY "exec.library"
REM Next line is an InovaTools1 function
REM LIBRARY "inovatools1.library"

REM  This is the start of the example program itself.
REM  Allocate all the structures
        CALL example

REM  Proceed only if allocation succeeded
        IF PW2EnoughMemory=1 THEN
REM  Open the screen if there
                IF NewScreenStructure&<>0 THEN
                        LET AScreen& = OpenScreen&(NewScreenStructure&)
                        IF AScreen&=0 THEN 
                                PRINT "Could not open Screen" : STOP
                        ELSE
                                LET nothing = LoadRGB4&(AScreen&+44,ScreenPalette&,PaletteColorCount&)
                                POKEL NewWindowStructure1&+30,AScreen&
                        END IF
                END IF

REM  Open the window
                LET AWindow& = OpenWindow&(NewWindowStructure1&)
                IF AWindow&=0 THEN
                        PRINT "Could not open Window" : STOP
                END IF
REM  Attach the Menu if present
                IF MenuList1&<>0 THEN
                        LET success = SetMenuStrip&(AWindow&,MenuList1&)
                END IF

REM  Draw the various goodies if they are there
REM  Get the RastPort address
                LET rp& = PEEKL(AWindow&+50)
                IF BorderList1&<>0 THEN
                        LET nothing = DrawBorder&(rp&,BorderList1&,0,0)
                END IF
                IF ImageList1&<>0 THEN
                        LET nothing = DrawImage&(rp&,ImageList1&,0,0)
                END IF
                IF ITextList1&<>0 THEN
                        LET nothing = PrintIText&(rp&,IntuiTextList1&,0,0)
                END IF

REM Next lines are InovaTools1 related
REM                IF KnobList1&<>0 THEN
REM                        LET nothing = DrawKnobs&(AWindow&,KnobList1&)
REM                END IF

REM  Now start the input-event loop
REM  Get the UserPort address
                LET up& = PEEKL(AWindow&+86)
                LET class& = 0
REM  Loop until CLOSEWINDOW is generated or simulated
                WHILE class&<>512
REM  Wait for an IDCMP message
                        LET nothing = WaitPort&(up&)
                        LET message& = GetMsg&(up&)
REM  Get the CLASS, CODE and ADDRESS fields from the message
                        LET class& = PEEKL(message&+20)
                        LET menunum& = PEEKW(message&+24)
                        LET address& = PEEKL(message&+28)
REM  Reply the message before too much time elapses
                        LET nothing = ReplyMsg&(message&)

REM Next lines are InovaTools1 related
REM  This handles the Knobs
REM                        IF KnobList1&<>0 THEN
REM  The next statement tests for the LEFT MOUSE BUTTON DOWN
REM                                IF class&=8 AND menunum&=104 THEN
REM                                        knobhit& = KnobGadgets&(AWindow&,KnobList1&)
REM                                END IF
REM                        END IF

REM  Comment or remove the next 2 IF sections if no event-handler is used
                        IF class&=256 THEN
                                LET address& = ItemAddress&(MenuList1&,menunum&)
                                CALL HandleEvent(address&)
                        END IF
                        IF class&=32 OR class&=64 THEN
                                CALL HandleEvent(address&)
                        END IF
                WEND

REM  Do all deinitialization
                IF MenuList1&<>0 THEN
                        LET nothing = ClearMenuStrip&(AWindow&)
                END IF
                LET nothing = CloseWindow&(AWindow&)
REM  Close the screen if open
                IF AScreen&<>0 THEN
                        LET nothing = CloseScreen&(AScreen&)
                END IF
REM  Free all allocated memory
                LET nothing = FreeRemember&(PW2RememberPtr&,-1)
        END IF

        LIBRARY CLOSE
        END

REM *******************  EVENT HANDLER SUPPORT ROUTINES  *******************
REM  This is the only event handler routine required by the example files
SUB quit(object&) STATIC
        SHARED class&
REM  Simulate a CLOSEWINDOW event to terminate loop
        LET class& = 512
END SUB

REM  The InovaTools1 functions follow
REM SUB HandleDragGadget(gadget&) STATIC
REM        SHARED AWindow&
REM        draginfo& = PEEKL(gadget&+34)
REM        nothing = DragGadget&(AWindow&,draginfo&)
REM END SUB
REM SUB HandlePopUpGadget(gadget&) STATIC
REM        SHARED AWindow&
REM        popup& = PEEKL(gadget&+34)
REM        menunum& = PopUpMenu&(AWindow&,popup&)
REM END SUB

REM *******************  STRUCTURE ALLOCATION ROUTINES  ********************
REM All functions needed by PW2 are define here.
REM Eliminate what you don't need for your program.

SUB MakeBoolInfoStructure(TheBoolInfo&,Flags%,Mask%) STATIC
        SHARED PW2RememberPtr&
        LET TheBoolInfo& = AllocRemember&(PW2RememberPtr&,10&,1+65536&)
        IF TheBoolInfo&<>0 THEN
                POKEW TheBoolInfo&,Flags%
                POKEL TheBoolInfo&+2&,Mask%
        END IF
END SUB

SUB MakeBorderStructure(TheBorder&,LeftEdge%,TopEdge%,FrontPen%,BackPen%,DrawMode%,Count%,XY&,NextBorder&) STATIC
        SHARED PW2RememberPtr&
        LET TheBorder& = AllocRemember&(PW2RememberPtr&,16&,1+65536&)
        IF TheBorder&<>0 THEN
                POKEW TheBorder&,LeftEdge%
                POKEW TheBorder&+2&,TopEdge%
                POKE TheBorder&+4&,FrontPen%
                POKE TheBorder&+5&,BackPen%
                POKE TheBorder&+6&,DrawMode%
                POKE TheBorder&+7&,Count%
                POKEL TheBorder&+8&,XY&
                POKEL TheBorder&+12&,NextBorder&
        END IF
END SUB

REM Delete this allocation function if not using InovaTools1
SUB MakeDragInfoStructure(TheDragInfo&,LeftEdge%,TopEdge%,RightEdge%,BottomEdge%,Flags%,UpdateRoutine&) STATIC
        SHARED PW2RememberPtr&
        LET TheDragInfo& = AllocRemember&(PW2RememberPtr&,26&,1+65536&)
        IF TheDragInfo&<>0 THEN
                POKEW TheDragInfo&+4&,LeftEdge%
                POKEW TheDragInfo&+6&,TopEdge%
                POKEW TheDragInfo&+8&,RightEdge%
                POKEW TheDragInfo&+10&,BottomEdge%
                POKEW TheDragInfo&+12&,Flags%
                POKEL TheDragInfo&+18&,UpdateRoutine&
        END IF
END SUB

SUB MakeGadgetStructure(TheGadget&,NextGadget&,LeftEdge%,TopEdge%,ggWidth%,Height%,Flags%,Activation%,GadgetType%,GadgetRender&,SelectRender&,GadgetText&,MutualExclude&,SpecialInfo&,GadgetID%,UserData&) STATIC
        SHARED PW2RememberPtr&
        LET TheGadget& = AllocRemember&(PW2RememberPtr&,44&,1+65536&)
        IF TheGadget&<>0 THEN
                POKEL TheGadget&,NextGadget&
                POKEW TheGadget&+4&,LeftEdge%
                POKEW TheGadget&+6&,TopEdge%
                POKEW TheGadget&+8&,ggWidth%
                POKEW TheGadget&+10&,Height%
                POKEW TheGadget&+12&,Flags%
                POKEW TheGadget&+14&,Activation%
                POKEW TheGadget&+16&,GadgetType%
                POKEL TheGadget&+18&,GadgetRender&
                POKEL TheGadget&+22&,SelectRender&
                POKEL TheGadget&+26&,GadgetText&
                POKEL TheGadget&+30&,MutualExclude&
                POKEL TheGadget&+34&,SpecialInfo&
                POKEW TheGadget&+38&,GadgetID%
                POKEL TheGadget&+40&,UserData&
        END IF
END SUB

SUB MakeImageStructure(TheImage&,LeftEdge%,TopEdge%,igWidth%,Height%,Depth%,ImageData&,PlanePick%,PlaneOnOff%,NextImage&) STATIC
        SHARED PW2RememberPtr&
        LET TheImage& = AllocRemember&(PW2RememberPtr&,20&,1+65536&)
        IF TheImage&<>0 THEN
                POKEW TheImage&,LeftEdge%
                POKEW TheImage&+2&,TopEdge%
                POKEW TheImage&+4&,igWidth%
                POKEW TheImage&+6&,Height%
                POKEW TheImage&+8&,Depth%
                POKEL TheImage&+10&,ImageData&
                POKE TheImage&+14&,PlanePick%
                POKE TheImage&+15&,PlaneOnOff%
                POKEL TheImage&+16&,NextImage&
        END IF
END SUB

SUB MakeITextStructure(TheIText&,FrontPen%,BackPen%,DrawMode%,LeftEdge%,TopEdge%,ITextFont&,IText&,NextText&) STATIC
        SHARED PW2RememberPtr&
        LET TheIText& = AllocRemember&(PW2RememberPtr&,20&,1+65536&)
        IF TheIText&<>0 THEN
                POKE TheIText&,FrontPen%
                POKE TheIText&+1&,BackPen%
                POKE TheIText&+2&,DrawMode%
                POKEW TheIText&+4&,LeftEdge%
                POKEW TheIText&+6&,TopEdge%
                POKEL TheIText&+8&,ITextFont&
                POKEL TheIText&+12&,IText&
                POKEL TheIText&+16&,NextText&
        END IF
END SUB

REM Delete this allocation function if not using InovaTools1
SUB MakeKnobStructure(TheKnob&,NextKnob&,XCenter%,YCenter%,Flags%,Value%,Range%,Angle%,Offset%,Steps%,ArrowRadius%,KnobRadius%,StartAngle%,StopAngle%,FillColor%,BorderColor%,ArrowColor%,KnobID%,UpdateRoutine&,UserData&) STATIC
        SHARED PW2RememberPtr&
        LET TheKnob& = AllocRemember&(PW2RememberPtr&,54&,1+65536&)
        IF TheKnob&<>0 THEN
                POKEL TheKnob&,NextKnob&
                POKEW TheKnob&+4&,XCenter%
                POKEW TheKnob&+6&,YCenter%
                POKEW TheKnob&+8&,Flags%
                POKEW TheKnob&+10&,Value%
                POKEW TheKnob&+12&,Range%
                POKEW TheKnob&+14&,Angle%
                POKEW TheKnob&+16&,Offset%
                POKEW TheKnob&+18&,Steps%
                POKEW TheKnob&+20&,ArrowRadius%
                POKEW TheKnob&+22&,KnobRadius%
                POKEW TheKnob&+24&,StartAngle%
                POKEW TheKnob&+26&,StopAngle%
                POKEW TheKnob&+28&,FillColor%
                POKEW TheKnob&+30&,BorderColor%
                POKEW TheKnob&+32&,ArrowColor%
                POKEW TheKnob&+34&,KnobID%
                POKEL TheKnob&+46&,UpdateRoutine&
                POKEL TheKnob&+50&,UserData&
        END IF
END SUB

SUB MakeMenuItemStructure(TheMenuItem&,NextItem&,LeftEdge%,TopEdge%,miWidth%,Height%,Flags%,MutualExclude&,ItemFill&,SelectFill&,Command%,SubItem&) STATIC
        SHARED PW2RememberPtr&
        LET TheMenuItem& = AllocRemember&(PW2RememberPtr&,34&,1+65536&)
        IF TheMenuItem&<>0 THEN
                POKEL TheMenuItem&,NextItem&
                POKEW TheMenuItem&+4&,LeftEdge%
                POKEW TheMenuItem&+6&,TopEdge%
                POKEW TheMenuItem&+8&,miWidth%
                POKEW TheMenuItem&+10&,Height%
                POKEW TheMenuItem&+12&,Flags%
                POKEL TheMenuItem&+14&,MutualExclude&
                POKEL TheMenuItem&+18&,ItemFill&
                POKEL TheMenuItem&+22&,SelectFill&
                POKE TheMenuItem&+26&,Command%
                POKEL TheMenuItem&+28&,SubItem&
                POKEW TheMenuItem&+32&,-1
        END IF
END SUB

SUB MakeMenuStructure(TheMenu&,NextMenu&,LeftEdge%,TopEdge%,muWidth%,Height%,Flags%,MenuName&,FirstItem&) STATIC
        SHARED PW2RememberPtr&
        LET TheMenu& = AllocRemember&(PW2RememberPtr&,30&,1+65536&)
        IF TheMenu&<>0 THEN
                POKEL TheMenu&,NextMenu&
                POKEW TheMenu&+4&,LeftEdge%
                POKEW TheMenu&+6&,TopEdge%
                POKEW TheMenu&+8&,muWidth%
                POKEW TheMenu&+10&,Height%
                POKEW TheMenu&+12&,Flags%
                POKEL TheMenu&+14&,MenuName&
                POKEL TheMenu&+18&,FirstItem&
        END IF
END SUB

SUB MakeNewScreenStructure(TheNewScreen&,LeftEdge%,TopEdge%,nsWidth%,Height%,Depth%,DetailPen%,BlockPen%,ViewModes%,Type%,Font&,DefaultTitle&,Gadgets&,CustomBitMap&) STATIC
        SHARED PW2RememberPtr&
        LET TheNewScreen& = AllocRemember&(PW2RememberPtr&,32&,1+65536&)
        IF TheNewScreen&<>0 THEN
                POKEW TheNewScreen&,LeftEdge%
                POKEW TheNewScreen&+2&,TopEdge%
                POKEW TheNewScreen&+4&,nsWidth%
                POKEW TheNewScreen&+6&,Height%
                POKEW TheNewScreen&+8&,Depth%
                POKE TheNewScreen&+10&,DetailPen%
                POKE TheNewScreen&+11&,BlockPen%
                POKEW TheNewScreen&+12&,ViewModes%
                POKEW TheNewScreen&+14&,Type%
                POKEL TheNewScreen&+16&,Font&
                POKEL TheNewScreen&+20&,DefaultTitle&
                POKEL TheNewScreen&+24&,Gadgets&
                POKEL TheNewScreen&+28&,CustomBitMap&
        END IF
END SUB

SUB MakeNewWindowStructure(TheNewWindow&,LeftEdge%,TopEdge%,nwWidth%,Height%,DetailPen%,BlockPen%,IDCMPFlags&,Flags&,FirstGadget&,CheckMark&,Title&,nwScreen&,BitMap&,MinWidth%,MinHeight%,MaxWidth%,MaxHeight%,Type%) STATIC
        SHARED PW2RememberPtr&
        LET TheNewWindow& = AllocRemember&(PW2RememberPtr&,48&,1+65536&)
        IF TheNewWindow&<>0 THEN
                POKEW TheNewWindow&,LeftEdge%
                POKEW TheNewWindow&+2&,TopEdge%
                POKEW TheNewWindow&+4&,nwWidth%
                POKEW TheNewWindow&+6&,Height%
                POKE TheNewWindow&+8&,DetailPen%
                POKE TheNewWindow&+9&,BlockPen%
                POKEL TheNewWindow&+10&,IDCMPFlags&
                POKEL TheNewWindow&+14&,Flags&
                POKEL TheNewWindow&+18&,FirstGadget&
                POKEL TheNewWindow&+22&,CheckMark&
                POKEL TheNewWindow&+26&,Title&
                POKEL TheNewWindow&+30&,nwScreen&
                POKEL TheNewWindow&+34&,BitMap&
                POKEW TheNewWindow&+38&,MinWidth%
                POKEW TheNewWindow&+40&,MinHeight%
                POKEW TheNewWindow&+42&,MaxWidth%
                POKEW TheNewWindow&+44&,MaxHeight%
                POKEW TheNewWindow&+46&,Type%
        END IF
END SUB

SUB MakeNullTString(TheStringName&,TheString$,MinimumLength&) STATIC
        SHARED PW2RememberPtr&
        IF MinimumLength&=0& OR LEN(TheString$)>MinimumLength& THEN LET MinimumLength& = LEN(TheString$)+1
        LET TheStringName& = AllocRemember&(PW2RememberPtr&,MinimumLength&,1+65536&)
        IF TheStringName&<>0 AND LEN(TheString$)>0 THEN
                FOR T& = 1% TO LEN(TheString$)
                        POKE TheStringName&+T&-1&,ASC(MID$(TheString$,T&,1))
                NEXT T&
        END IF
END SUB

SUB MakePropInfoStructure(ThePropInfo&,Flags%,HorizPot%,VertPot%,HorizBody%,VertBody%) STATIC
        SHARED PW2RememberPtr&
        LET ThePropInfo& = AllocRemember&(PW2RememberPtr&,22&,1+65536&)
        IF ThePropInfo&<>0 THEN
                POKEW ThePropInfo&,Flags%
                POKEW ThePropInfo&+2&,HorizPot%
                POKEW ThePropInfo&+4&,VertPot%
                POKEW ThePropInfo&+6&,HorizBody%
                POKEW ThePropInfo&+8&,VertBody%
        END IF
END SUB

SUB MakeRequesterStructure(TheRequester&,LeftEdge%,TopEdge%,rqWidth%,Height%,RelLeft%,RelTop%,ReqGadget&,ReqBorder&,ReqText&,Flags%,BackFill%,ImageBMap&,RWindow&) STATIC
        SHARED PW2RememberPtr&
        LET TheRequester& = AllocRemember&(PW2RememberPtr&,112&,1+65536&)
        IF TheRequester&<>0 THEN
                POKEW TheRequester&+4&,LeftEdge%
                POKEW TheRequester&+6&,TopEdge%
                POKEW TheRequester&+8&,rqWidth%
                POKEW TheRequester&+10&,Height%
                POKEW TheRequester&+12&,RelLeft%
                POKEW TheRequester&+14&,RelTop%
                POKEL TheRequester&+16&,ReqGadget&
                POKEL TheRequester&+20&,ReqBorder&
                POKEL TheRequester&+24&,ReqText&
                POKEW TheRequester&+28&,Flags%
                POKE TheRequester&+30&,BackFill%
                POKEL TheRequester&+68&,ImageBMap&
                POKEL TheRequester&+72&,RWindow&
        END IF
END SUB

SUB MakeStringInfoStructure(TheStringInfo&,Buffer&,UndoBuffer&,BufferPos%,MaxChars%,DispPos%,LongInt&,AltKeyMap&) STATIC
        SHARED PW2RememberPtr&
        LET TheStringInfo& = AllocRemember&(PW2RememberPtr&,36&,1+65536&)
        IF TheStringInfo&<>0 THEN
                POKEL TheStringInfo&,Buffer&
                POKEL TheStringInfo&+4&,UndoBuffer&
                POKEW TheStringInfo&+8&,BufferPos%
                POKEW TheStringInfo&+10&,MaxChars%
                POKEW TheStringInfo&+12&,DispPos%
                POKEL TheStringInfo&+28&,LongInt&
                POKEL TheStringInfo&+32&,AltKeyMap&
        END IF
END SUB

SUB MakeTextAttrStructure(TheTextAttr&,taName&,Size%,Style%,Flags%) STATIC
        SHARED PW2RememberPtr&
        LET TheTextAttr& = AllocRemember&(PW2RememberPtr&,8&,1+65536&)
        IF TheTextAttr&<>0 THEN
                POKEL TheTextAttr&,taName&
                POKEW TheTextAttr&+4&,Size%
                POKE TheTextAttr&+6&,Style%
                POKE TheTextAttr&+7&,Flags%
        END IF
END SUB


REM  If you use this as a "header" file, the PW2 generated source code will
REM  show up starting here...
