'===========================================================================
' Subject: MULTIFUNCTIONAL MENUING SYSTEM     Date: 02-09-98 (23:18)       
'  Author: Sami Kyostila                      Code: QB, PDS                
'  Origin: hiteck@utanet.fi                 Packet: MENU.ABC
'===========================================================================
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'             Q M E N U  v1.0 - 1998 Sami Ky”stil„ (hiteck@utanet.fi)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'
' Here's a pretty good menu system for QB 4.5
'
'   What makes this system different from many other menuing programs out there
' is that this program doesn't use precious memory for storing the menu items
' but a disk swap file. First you might think that is very slow, but see for
' your self, it's way fast enough. Secondly, the items can be added at
' run-time (See SUB Init.Menu).
'
'   You can navigate the menu system with the keyboard (Press ALT to activate
' menu bar) or the mouse. This demo functions in text mode, but with a few
' minor adaptions you could make a graphical menu system. All you need to
' do is change the SUBs PokeChar and PeekChar to your own font routines, and
' replace the PCOPY's with some other screen saving system.
'
'   To use the menu, be sure to call the SUB Main as often as possible.
' To read the pressed menu item, use the following variables:
' 
'   + Menuselected.Menu - The number of the selected menu
'   + Menuselected.Item - The number of the selected item (Separator lines
'                         count too!)
'
'   To find out info about the pressed menu item, use the SUB Get.MenuItemInfo
'
'
' You may use this code freely, as long as you give me some credit for it.
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ



DECLARE SUB Create.MenuItem (Num%, Caption$, Style AS STRING, Selected AS STRING, Active AS STRING)
DECLARE SUB Create.Menu (Num%, Caption$)
DECLARE SUB Set.MenuTopic (Num%, Topic$)
DECLARE SUB Main ()
DECLARE SUB Set.MenuItem (MenuNum%, Num%, Caption$, Active AS STRING, Style AS STRING, Selected AS STRING)
DECLARE FUNCTION Get.MenuItem$ (MenuNum%, Num%)
DECLARE SUB Get.MenuItemInfo (MenuNum%, Num%, Style AS STRING, Selected AS STRING, HelpText AS STRING)
DECLARE SUB Draw.Menu ()
DECLARE SUB Init.Menu ()
DECLARE FUNCTION Exist% (file$)
DECLARE SUB MStatus (x%, y%, B1%, B2%)
DECLARE SUB UpdateMouse ()
DECLARE SUB PPrint (x%, y%, Text$, FCol%, BCol%)
DECLARE SUB PokeChar (x%, y%, Char$, FCol%, BCol%)
DECLARE FUNCTION PeekChar$ (x%, y%)
DECLARE SUB Draw.Border (x%, y%, x2%, y2%, FCol%, BCol%)
DECLARE FUNCTION Get.MenuTopic$ (Num%)
DECLARE FUNCTION PopupMenu% (x%, y%, Num%, Click%)
DECLARE SUB MHide ()
DECLARE SUB MShow ()
DECLARE FUNCTION MInit! ()
DEFINT A-Z

TYPE RegType
		 ax    AS INTEGER
		 bx    AS INTEGER
		 cx    AS INTEGER
		 dx    AS INTEGER
		 bp    AS INTEGER
		 si    AS INTEGER
		 di    AS INTEGER
		 flags AS INTEGER
END TYPE

TYPE MenuItemType
	Caption AS STRING * 40
	Active AS STRING * 1
	Style AS STRING * 1
	Selected AS STRING * 1
END TYPE

TYPE MenuType
	Topics AS INTEGER
	BarSize AS INTEGER
	MenuFCol AS INTEGER
	MenuBCol AS INTEGER
	MenuDisabled AS INTEGER
END TYPE

TYPE MenuSelectedType
	Menu AS INTEGER
	Item AS INTEGER
END TYPE

DIM SHARED Regs AS RegType
CONST False = 0, True = NOT False

DIM SHARED MenuItems(1 TO 40) AS INTEGER
DIM SHARED MenuItem AS MenuItemType
DIM SHARED QMenu AS MenuType
DIM SHARED MenuSelected AS MenuSelectedType

IF Exist("Menuswap.tmp") = True THEN KILL "menuswap.tmp"
IF Exist("Itemswap.tmp") = True THEN KILL "itemswap.tmp"

OPEN "Menuswap.tmp" FOR BINARY AS #250
OPEN "Itemswap.tmp" FOR BINARY AS #251

IF NOT MInit THEN PRINT " þ Mouse not found, using keyboard...": DO: LOOP UNTIL INKEY$ <> ""
SCREEN 0: WIDTH 80, 50

COLOR 7, 1: CLS

Draw.Border 1, 2, 80, 50, 7, 1
COLOR 1, 7
LOCATE 2, 20: PRINT " Welcome to QMENU v1.0 by Sami Ky”stil„! "

COLOR 7, 1
LOCATE , 2: PRINT ""
LOCATE , 2: PRINT "DECLARE SUB Create.MenuItem (Num%, Caption$, Style AS STRING, Selected AS STRI"
LOCATE , 2: PRINT "DECLARE SUB Create.Menu (Num%, Caption$)"
LOCATE , 2: PRINT "DECLARE SUB Set.MenuTopic (Num%, Topic$)"
LOCATE , 2: PRINT "DECLARE SUB Main ()"
LOCATE , 2: PRINT "DECLARE SUB Set.MenuItem (MenuNum%, Num%, Caption$, Active AS STRING, Style AS"
LOCATE , 2: PRINT "DECLARE FUNCTION Get.MenuItem$ (MenuNum%, Num%)"
LOCATE , 2: PRINT "DECLARE SUB Get.MenuItemInfo (MenuNum%, Num%, Style AS STRING, Selected AS STR"
LOCATE , 2: PRINT "DECLARE SUB Draw.Menu ()"
LOCATE , 2: PRINT "DECLARE SUB Init.Menu ()"
LOCATE , 2: PRINT "DECLARE FUNCTION Exist% (File$)"
LOCATE , 2: PRINT "DECLARE SUB MStatus (x%, y%, B1%, B2%)"
LOCATE , 2: PRINT "DECLARE SUB UpdateMouse ()"
LOCATE , 2: PRINT "DECLARE SUB PPrint (x%, y%, Text$, FCol%, BCol%)"
LOCATE , 2: PRINT "DECLARE SUB PokeChar (x%, y%, Char$, FCol%, BCol%)"
LOCATE , 2: PRINT "DECLARE FUNCTION PeekChar$ (x%, y%)"
LOCATE , 2: PRINT "DECLARE SUB Draw.Border (x%, y%, x2%, y2%, FCol%, BCol%)"
LOCATE , 2: PRINT "DECLARE FUNCTION Get.MenuTopic$ (Num%)"
LOCATE , 2: PRINT "DECLARE FUNCTION PopupMenu% (x%, y%, Num%, Click%)"
LOCATE , 2: PRINT "DECLARE SUB MHide ()"
LOCATE , 2: PRINT "DECLARE SUB MShow ()"
LOCATE , 2: PRINT "DECLARE FUNCTION MInit! ()"
LOCATE , 2: PRINT "DEFINT A-Z"
LOCATE , 2: PRINT ""
LOCATE , 2: PRINT "TYPE RegType"
LOCATE , 2: PRINT "     ax    AS INTEGER"
LOCATE , 2: PRINT "     bx    AS INTEGER"
LOCATE , 2: PRINT "     cx    AS INTEGER"
LOCATE , 2: PRINT "     dx    AS INTEGER"
LOCATE , 2: PRINT "     bp    AS INTEGER"
LOCATE , 2: PRINT "     si    AS INTEGER"
LOCATE , 2: PRINT "     di    AS INTEGER"
LOCATE , 2: PRINT "     flags AS INTEGER"
LOCATE , 2: PRINT "END TYPE"
LOCATE , 2: PRINT ""
LOCATE , 2: PRINT "TYPE MenuItemType"
LOCATE , 2: PRINT "  Caption AS STRING * 40"
LOCATE , 2: PRINT "  HelpText AS STRING * 80"
LOCATE , 2: PRINT "  Style AS STRING * 1"
LOCATE , 2: PRINT "  Selected AS STRING * 1"
LOCATE , 2: PRINT "END TYPE"

MShow
Init.Menu

DO
	Main
	IF MenuSelected.Menu <> 0 THEN
		COLOR 14, 1
		LOCATE 47, 3: PRINT STRING$(77, " ")
		LOCATE 47, 3
		PRINT "You selected item"; MenuSelected.Item; "("; Get.MenuItem$(MenuSelected.Menu, MenuSelected.Item); ") ";
		PRINT "from menu"; MenuSelected.Menu; "("; Get.MenuTopic$(MenuSelected.Menu); ")"
	END IF
LOOP UNTIL MenuSelected.Menu = 1 AND MenuSelected.Item = 15

MHide

CLOSE #250
CLOSE #251
IF Exist("Menuswap.tmp") = True THEN KILL "menuswap.tmp"
IF Exist("Itemswap.tmp") = True THEN KILL "itemswap.tmp"

SUB Create.Menu (Num, Caption$)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Creates a main menu number Num, with the text Caption$
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

IF Num >= QMenu.Topics THEN
	QMenu.Topics = QMenu.Topics + 1
	Num = QMenu.Topics
END IF
Set.MenuTopic Num, Caption$
Draw.Menu
END SUB

SUB Create.MenuItem (Num, Caption$, Style AS STRING, Selected AS STRING, Active AS STRING)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Adds a menuitem into the menu Num with the text Caption$
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'
'     Style - "1" or "0" - If 1, then Item can be toggled on/off
'                          else it is a normal menu item
'
'  Selected - "1" or "0" - If Style = "1", then you can choose whether the
'                          item is initially selected or not (1/0)
'
'    Active - "1" or "0" - Specifies if the menu item is active, or
'                          grayed out.
'
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Set.MenuItem Num, MenuItems(Num) + 1, Caption$, Active, Style, Selected
MenuItems(Num) = MenuItems(Num) + 1
END SUB

SUB Draw.Border (x, y, x2, y2, FCol, BCol)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Draws the menu border
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

FOR i = x + 1 TO x2 - 1
	PokeChar i, y, "Ä", FCol, BCol
	PokeChar i, y2, "Ä", FCol, BCol
NEXT
FOR i = y + 1 TO y2 - 1
	PokeChar x, i, "³", FCol, BCol
	PokeChar x2, i, "³", FCol, BCol
NEXT
PokeChar x, y, "Ú", FCol, BCol
PokeChar x2, y, "¿", FCol, BCol

PokeChar x, y2, "À", FCol, BCol
PokeChar x2, y2, "Ù", FCol, BCol

END SUB

SUB Draw.Menu
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Draws the menu bar at the top of the screen
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

MHide

IF QMenu.Topics > 0 THEN
	xx = 1
	yy = 1
	FOR i = 1 TO QMenu.Topics
		Menu$ = Get.MenuTopic$(i)
		IF xx + LEN(Menu$) + 2 < 81 THEN
			PPrint xx, yy, " " + Menu$ + " ", QMenu.MenuFCol, QMenu.MenuBCol
			xx = xx + LEN(Menu$) + 2
		ELSE
			PPrint xx, yy, STRING$(80 - xx + 1, " "), QMenu.MenuFCol, QMenu.MenuBCol
			yy = yy + 1
			xx = x
			PPrint xx, yy, " " + Menu$ + " ", QMenu.MenuFCol, QMenu.MenuBCol
			xx = xx + LEN(Menu$) + 2
		END IF
		PPrint xx, yy, STRING$(80 - xx + 1, " "), QMenu.MenuFCol, QMenu.MenuBCol
	NEXT
	QMenu.BarSize = yy
END IF
MShow
END SUB

FUNCTION Exist% (file$)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'                       Checks if a file exists
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'
'    File$ - File to check
'
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
'  Returns True if file exists, else False
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ


IF file$ = "" THEN Exist = False: EXIT FUNCTION
Checkfile = FREEFILE
OPEN file$ FOR BINARY AS #Checkfile
IF LOF(Checkfile) = 0 THEN
	Exist = False
	CLOSE #Checkfile
	KILL file$
ELSE
	Exist = True
	CLOSE #Checkfile
END IF

END FUNCTION

FUNCTION Get.MenuItem$ (MenuNum, Num)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Returns the menu item number Num caption in menu number MenuNum
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

SEEK #251, (CLNG(MenuNum - 1) * 6100) + (Num * 122)
GET #251, , MenuItem
Temp$ = MenuItem.Caption

Temp2$ = ""
FOR i = 1 TO LEN(Temp$)
	IF NOT MID$(Temp$, i, 1) = CHR$(0) THEN Temp2$ = Temp2$ + MID$(Temp$, i, 1) ELSE EXIT FOR
NEXT
Get.MenuItem$ = LTRIM$(RTRIM$(Temp2$))
END FUNCTION

SUB Get.MenuItemInfo (MenuNum, Num, Style AS STRING, Selected AS STRING, Active AS STRING)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Returns info about item number Num in menu MenuNum
' See SUB Create.MenuItem for info on menu item variables.
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

SEEK #251, (CLNG(MenuNum - 1) * 6100) + (Num * 122)

GET #251, , MenuItem
Style = MenuItem.Style
Selected = MenuItem.Selected
Active = MenuItem.Active

END SUB

FUNCTION Get.MenuTopic$ (Num)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Returns the caption of a main menu item number Num
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

SEEK #250, CLNG(Num) * 16
Temp$ = SPACE$(16)
GET #250, , Temp$
Temp2$ = ""
FOR i = 1 TO LEN(Temp$)
	IF NOT MID$(Temp$, i, 1) = CHR$(0) THEN Temp2$ = Temp2$ + MID$(Temp$, i, 1) ELSE EXIT FOR
NEXT
Get.MenuTopic$ = LTRIM$(RTRIM$(Temp2$))
END FUNCTION

SUB Init.Menu
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Call this at the start of your programs, initializes the menu
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

QMenu.MenuFCol = 0
QMenu.MenuBCol = 7
QMenu.MenuDisabled = 8

Create.Menu 1, "File"
Create.Menu 2, "Edit"
Create.Menu 3, "View"
Create.Menu 4, "Search"
Create.Menu 5, "Run"
Create.Menu 6, "Debug"
Create.Menu 7, "Calls"
Create.Menu 8, "Options"
Create.Menu 9, "Help"

'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 1, "New Program", "0", "0", "1"
Create.MenuItem 1, "Open Program...", "0", "0", "1"
Create.MenuItem 1, "Merge...", "0", "0", "1"
Create.MenuItem 1, "Save", "0", "0", "1"
Create.MenuItem 1, "Save As...", "0", "0", "1"
Create.MenuItem 1, "Save All", "0", "0", "1"
Create.MenuItem 1, "-", "0", "0", "1"
Create.MenuItem 1, "Create File...", "0", "0", "1"
Create.MenuItem 1, "Load File...", "0", "0", "1"
Create.MenuItem 1, "Unload File...", "0", "0", "1"
Create.MenuItem 1, "-", "0", "0", "1"
Create.MenuItem 1, "Print", "0", "0", "1"
Create.MenuItem 1, "DOS Shell", "0", "0", "1"
Create.MenuItem 1, "-", "0", "0", "1"
Create.MenuItem 1, "Exit", "0", "0", "1"

'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 2, "Undo  Alt+Backspace", "0", "0", "0"
Create.MenuItem 2, "Cut       Shift+Del", "0", "0", "0"
Create.MenuItem 2, "Copy      Ctrl+Inst", "0", "0", "0"
Create.MenuItem 2, "Paste    Shift+Inst", "0", "0", "0"
Create.MenuItem 2, "Clear           Del", "0", "0", "0"
Create.MenuItem 2, "-", "0", "0", "1"
Create.MenuItem 2, "New SUB...", "0", "0", "1"
Create.MenuItem 2, "New FUNCTION...", "0", "0", "1"
																									
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 3, "SUBS...           F2", "0", "0", "1"
Create.MenuItem 3, "Next SUB    Shift+F2", "0", "0", "1"
Create.MenuItem 3, "Split", "0", "0", "1"
Create.MenuItem 3, "-", "0", "0", "1"
Create.MenuItem 3, "Next Statement", "0", "0", "1"
Create.MenuItem 3, "Output Screen     F4", "0", "0", "1"
Create.MenuItem 3, "-", "0", "0", "1"
Create.MenuItem 3, "Included File", "0", "0", "1"
Create.MenuItem 3, "Included Lines", "0", "0", "1"

'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 4, "Find...           ", "0", "0", "1"
Create.MenuItem 4, "Selected Text    Ctrl+\", "0", "0", "1"
Create.MenuItem 4, "Repeat Last Find     F3", "0", "0", "1"
Create.MenuItem 4, "Change...", "0", "0", "1"
Create.MenuItem 4, "Label...", "0", "0", "1"

'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 5, "Start     Shift+F5", "0", "0", "1"
Create.MenuItem 5, "Restart", "0", "0", "1"
Create.MenuItem 5, "Continue        F5", "0", "0", "1"
Create.MenuItem 5, "Modify COMMAND$...", "0", "0", "1"
Create.MenuItem 5, "-", "0", "0", "1"
Create.MenuItem 5, "Make EXE File...", "0", "0", "1"
Create.MenuItem 5, "Make Library...", "0", "0", "1"
Create.MenuItem 5, "-", "0", "0", "1"
Create.MenuItem 5, "Set Main Module...", "0", "0", "1"
																											
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 6, "Add Watch...", "0", "0", "1"
Create.MenuItem 6, "Instant Watch...  Shift+F9", "0", "0", "1"
Create.MenuItem 6, "Watchpoint...", "0", "0", "1"
Create.MenuItem 6, "Delete Watch...", "0", "0", "1"
Create.MenuItem 6, "Delete All Watch...", "0", "0", "1"
Create.MenuItem 6, "-", "0", "0", "1"
Create.MenuItem 6, "Trace On", "1", "0", "1"
Create.MenuItem 6, "History On", "1", "0", "1"
Create.MenuItem 6, "-", "0", "0", "1"
Create.MenuItem 6, "Toggle Breakpoints      F9", "0", "0", "1"
Create.MenuItem 6, "Clear All Breakpoints", "0", "0", "1"
Create.MenuItem 6, "Break On Errors", "1", "0", "1"
Create.MenuItem 6, "Set Next Statement", "0", "0", "1"

'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 7, "QMENU.BAS", "0", "0", "1"

'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 8, "Display...", "0", "0", "1"
Create.MenuItem 8, "Set Paths...", "0", "0", "1"
Create.MenuItem 8, "Right Mouse...", "0", "0", "1"
Create.MenuItem 8, "Syntax Checking", "1", "1", "1"
Create.MenuItem 8, "Full Menus", "1", "1", "1"

'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Create.MenuItem 9, "Index", "0", "0", "1"
Create.MenuItem 9, "Contents", "0", "0", "1"
Create.MenuItem 9, "Topic: QMENU            F1", "0", "0", "1"
Create.MenuItem 9, "Help On Help      Shift+F1", "0", "0", "1"

END SUB

SUB Main
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Handles the mouse and menu.
' Call this once per frame.
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

STATIC Click

MenuSelected.Menu = 0
MenuSelected.Item = 0

MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO%
Mx = HiiriX% \ 8 + 1
My = HiiriY% \ 8 + 1
Ml = HiiriV%
Mr = HiiriO%

IF Ml = 0 AND Click = -1 THEN Click = 1 ELSE IF Ml = 0 THEN Click = 0
IF Ml = -1 AND Click = 0 THEN Click = -1

DEF SEG = &H40
IF ((PEEK(&H17) AND &H8) / &H8) AND DragWin = 0 THEN
	Mx = 1
	My = 1
	Click = 1
END IF
DEF SEG

IF My <= QMenu.BarSize AND Click = 1 THEN
	IF QMenu.Topics > 0 THEN
		xx = 1
		yy = 1
		FOR i = 1 TO QMenu.Topics
			Menu$ = Get.MenuTopic$(i)
			IF xx + LEN(Menu$) + 2 < 81 THEN
				xx = xx + LEN(Menu$) + 2
			ELSE
				yy = yy + 1
				xx = 1
				xx = xx + LEN(Menu$) + 2
			END IF
			IF Mx >= xx - LEN(Menu$) - 2 AND Mx < xx AND My = yy THEN
				NewPopup = i
				DO
					MHide
					PPrint xx - LEN(Menu$) - 2, yy, " " + Menu$ + " ", QMenu.MenuBCol, QMenu.MenuFCol
					MShow
					NewPopup = PopupMenu(xx - LEN(Menu$) - 2, yy + 1, NewPopup, Click)
					MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO%
					Mx = HiiriX% \ 8 + 1
					My = HiiriY% \ 8 + 1
					MHide
					PPrint xx - LEN(Menu$) - 2, yy, " " + Menu$ + " ", QMenu.MenuFCol, QMenu.MenuBCol
					MShow
					IF NewPopup <> 0 OR Click = 1 THEN
						xx = 1
						yy = 1
						FOR ii = 1 TO QMenu.Topics
							Menu$ = Get.MenuTopic$(ii)
							IF xx + LEN(Menu$) + 2 < 81 THEN
								xx = xx + LEN(Menu$) + 2
							ELSE
								yy = yy + 1
								xx = 1
								xx = xx + LEN(Menu$) + 2
							END IF
							IF Click = 1 AND Mx >= xx - LEN(Menu$) - 2 AND Mx < xx AND My = yy THEN NewPopup = ii
							IF ii = NewPopup THEN EXIT FOR
						NEXT
					END IF
				LOOP UNTIL NewPopup = 0
				EXIT FOR
			END IF
		NEXT
	END IF
END IF

END SUB

DEFSNG A-Z
SUB MHide
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Hides the mouse
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

 Regs.ax% = 2
 CALL INTERRUPT(&H33, Regs, Regs)

END SUB

FUNCTION MInit
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Initializes the mouse
' Returns -1 if mouse is present, 0 if it isn't
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

 Regs.ax% = 0
 CALL INTERRUPT(&H33, Regs, Regs)

 MInit = Regs.ax%

END FUNCTION

SUB MShow
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Shows the mouse after hiding
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

 Regs.ax% = 1
 CALL INTERRUPT(&H33, Regs, Regs)
 WAIT &H3DA, 8
 WAIT &H3DA, 8, 8
END SUB

DEFINT A-Z
SUB MStatus (x, y, B1, B2)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Returns location of mouse & status of buttons
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

 Regs.ax% = 3
 CALL INTERRUPT(&H33, Regs, Regs)
 x = Regs.cx%
 y = Regs.dx%
 B1 = (Regs.bx% AND 1) <> 0
 B2 = (Regs.bx% AND 2) <> 0
END SUB

FUNCTION PeekChar$ (x, y)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Returns the character stored at x,y
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

DEF SEG = &HB800
PeekChar$ = CHR$(PEEK((y - 1) * 160 + (x - 1) * 2))
DEF SEG
END FUNCTION

SUB PokeChar (x, y, Char$, FCol, BCol)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Writes the characted Char$ at x,y in color FCol,BCol
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

DEF SEG = &HB800
POKE ((y - 1) * 160 + (x - 1) * 2), ASC(Char$)
POKE ((y - 1) * 160 + (x - 1) * 2) + 1, FCol + (BCol * 16)
DEF SEG
END SUB

FUNCTION PopupMenu (x, y, Num, Click)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Handles the menu when popped up, called by SUB Main
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

items = MenuItems(Num)
IF items > 0 THEN DIM Menu$(1 TO items)

Longest = 0
FOR i = 1 TO items
	Menu$(i) = Get.MenuItem$(Num, i)
	IF LEN(Menu$(i)) > Longest THEN Longest = LEN(Menu$(i))
NEXT

MHide
PCOPY 0, 1
SCREEN , , 0, 1

IF x + Longest > 78 THEN x = 78 - Longest - 3

IF items > 0 THEN
	Draw.Border x, y, x + Longest + 3, y + items + 1, QMenu.MenuFCol, QMenu.MenuBCol

	x2 = x + Longest + 3
	y2 = y + items + 1

	FOR i = y + 1 TO y2 + 1
		PokeChar x2 + 1, i, PeekChar$(x2 + 1, i), 8, 0
		PokeChar x2 + 2, i, PeekChar$(x2 + 2, i), 8, 0
	NEXT

	FOR i = x + 1 TO x2
		PokeChar i, y2 + 1, PeekChar$(i, y2 + 1), 8, 0
	NEXT

	FOR i = 1 TO items
		Get.MenuItemInfo Num, i, Style$, Selected$, Active$
		IF Active$ = "1" THEN
			IF Menu$(i) = "-" THEN
				PPrint x, y + i, CHR$(195) + STRING$(Longest + 2, "Ä") + CHR$(180), QMenu.MenuFCol, QMenu.MenuBCol
			ELSE
				IF Style$ = "0" THEN
					PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuFCol, QMenu.MenuBCol
				ELSE
					IF Selected$ = "1" THEN
						PPrint x + 1, y + i, CHR$(7) + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuFCol, QMenu.MenuBCol
					ELSE
						PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuFCol, QMenu.MenuBCol
					END IF
				END IF
			END IF
		ELSE
			IF Menu$(i) = "-" THEN
				PPrint x, y + i, CHR$(195) + STRING$(Longest + 2, "Ä") + CHR$(180), QMenu.MenuFCol, QMenu.MenuBCol
			ELSE
				IF Style$ = "0" THEN
					PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuDisabled, QMenu.MenuBCol
				ELSE
					IF Selected$ = "1" THEN
						PPrint x + 1, y + i, CHR$(7) + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuDisabled, QMenu.MenuBCol
					ELSE
						PPrint x + 1, y + i, " " + Get.MenuItem$(Num, i) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, i))), QMenu.MenuDisabled, QMenu.MenuBCol
					END IF
				END IF
			END IF
		END IF
	NEXT


	Selected = 1

	Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$
	IF Style$ = "0" THEN
		PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol
	ELSE
		IF Selected$ = "1" THEN
			PPrint x + 1, y + Selected, CHR$(7) + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol
		ELSE
			PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol
		END IF
	END IF

END IF
SCREEN , , 0, 0
MShow

OldSelected = 0

MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO%
Mx = HiiriX% \ 8 + 1
My = HiiriY% \ 8 + 1
Ml = HiiriV%
Mr = HiiriO%
OldMx = Mx
OldMy = My

DO
	Key$ = INKEY$
	MStatus HiiriX%, HiiriY%, HiiriV%, HiiriO%
	Mx = HiiriX% \ 8 + 1
	My = HiiriY% \ 8 + 1
	Ml = HiiriV%
	Mr = HiiriO%
	IF OldMx <> Mx OR OldMy <> My THEN MouseMove = 1 ELSE MouseMove = 0
 
	IF Ml = 0 AND Click = -1 THEN Click = 1 ELSE IF Ml = 0 THEN Click = 0
	IF Ml = -1 AND Click = 0 THEN Click = -1
				
	IF Key$ = CHR$(0) + "K" THEN
		NewMenu = Num - 1
		IF NewMenu < 1 THEN NewMenu = QMenu.Topics
		PopupMenu = NewMenu
	END IF

	IF Key$ = CHR$(0) + "M" THEN
		NewMenu = Num + 1
		IF NewMenu > QMenu.Topics THEN NewMenu = 1
		PopupMenu = NewMenu
	END IF

	OldSelected = Selected

	IF items > 0 THEN
		IF Key$ = CHR$(0) + "P" THEN
			Selected = Selected + 1
			IF Selected > items THEN Selected = 1
			IF Menu$(Selected) = "-" THEN Selected = Selected + 1
			IF Selected > items THEN Selected = 1
			Key$ = ""
		END IF

		IF Key$ = CHR$(0) + "H" THEN
			Selected = Selected - 1
			IF Selected < 1 THEN Selected = items
			IF Menu$(Selected) = "-" THEN Selected = Selected - 1
			IF Selected < 1 THEN Selected = items
			Key$ = ""
		END IF

		IF Key$ = CHR$(13) THEN
			Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$
			IF Active$ = "1" THEN
				MenuSelected.Menu = Num
				MenuSelected.Item = Selected
														
				IF Style$ = "1" THEN
					IF Selected$ = "0" THEN
						Selected$ = "1"
					ELSEIF Selected$ = "1" THEN
						Selected$ = "0"
					END IF
					Set.MenuItem Num, Selected, Get.MenuItem$(Num, Selected), Active$, Style$, Selected$
				END IF
			ELSE
				Key$ = ""
			END IF
		END IF
	END IF

	IF items > 0 AND (MouseMove = 1 OR Click = 1) THEN
		IF Mx > x AND Mx < x + Longest + 3 AND My > y AND My <= y + items THEN
			Selected = My - y
			IF Click = 1 THEN
				Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$
				IF Active$ = "1" AND Get.MenuItem$(Num, Selected) <> "-" THEN
					MenuSelected.Menu = Num
					MenuSelected.Item = Selected

					MenuSelected.Menu = Num
					MenuSelected.Item = Selected
					IF Style$ = "1" THEN
						IF Selected$ = "0" THEN
							Selected$ = "1"
						ELSEIF Selected$ = "1" THEN
							Selected$ = "0"
						END IF
						Set.MenuItem Num, Selected, Get.MenuItem$(Num, Selected), Active$, Style$, Selected$
					END IF
					EXIT DO
				ELSE
					Click = 0
				END IF
			END IF
		END IF
	END IF

		IF OldSelected <> Selected THEN
			IF Menu$(Selected) = "-" THEN
				Selected = OldSelected
			ELSE
				MHide
				Get.MenuItemInfo Num, Selected, Style$, Selected$, Active$
				IF Style$ = "0" THEN
					PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol
				ELSE
					IF Selected$ = "1" THEN
						PPrint x + 1, y + Selected, CHR$(7) + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol
					ELSE
						PPrint x + 1, y + Selected, " " + Get.MenuItem$(Num, Selected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, Selected))), QMenu.MenuBCol, QMenu.MenuFCol
					END IF
				END IF

			 
				Get.MenuItemInfo Num, OldSelected, Style$, Selected$, Active$

				IF Active$ = "1" THEN
					FCol = QMenu.MenuFCol
				ELSE
					FCol = QMenu.MenuDisabled
				END IF

				IF Style$ = "0" THEN
					PPrint x + 1, y + OldSelected, " " + Get.MenuItem$(Num, OldSelected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, OldSelected))), FCol, QMenu.MenuBCol
				ELSE
					IF Selected$ = "1" THEN
						PPrint x + 1, y + OldSelected, CHR$(7) + Get.MenuItem$(Num, OldSelected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, OldSelected))), FCol, QMenu.MenuBCol
					ELSE
						PPrint x + 1, y + OldSelected, " " + Get.MenuItem$(Num, OldSelected) + SPACE$((Longest + 1) - LEN(Get.MenuItem$(Num, OldSelected))), FCol, QMenu.MenuBCol
					END IF
				END IF
				MShow
			END IF
		END IF
 
	OldMx = Mx
	OldMy = My

LOOP UNTIL Click = 1 OR Key$ <> ""
Key$ = ""

MHide
PCOPY 1, 0
MShow
END FUNCTION

SUB PPrint (x, y, Text$, FCol, BCol)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Prints text Text$ at x,y in color FCol, BCol
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

xx = x
FOR i = 1 TO LEN(Text$)
	PokeChar xx, y, MID$(Text$, i, 1), FCol, BCol
	xx = xx + 1
NEXT

END SUB

SUB Set.MenuItem (MenuNum, Num, Caption$, Active AS STRING, Style AS STRING, Selected AS STRING)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Sets menu item Num in menu MenuNum information variables, see
' SUB Create.MenuItem for information about the menu item variables.
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

SEEK #251, (CLNG(MenuNum - 1) * 6100) + (Num * 122)
Temp$ = LEFT$(Caption$, 50)
Temp$ = Temp$ + SPACE$(50 - LEN(Temp$))
MenuItem.Caption = Caption$
MenuItem.Active = Active
MenuItem.Style = Style
MenuItem.Selected = Selected
PUT #251, , MenuItem
END SUB

SUB Set.MenuTopic (Num, Topic$)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Sets the main menu topic number Num to text Topic$
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

SEEK #250, CLNG(Num) * 16
Temp$ = LEFT$(Topic$, 16)
Temp$ = Temp$ + SPACE$(16 - LEN(Temp$))
PUT #250, , Temp$
END SUB

SUB Toggle.MenuItem (MenuNum, Num, State)
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
' Sets the menu item Num in menu number MenuNum active or disabled
'
' State:  True - Active, False - Disabled
'ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Caption$ = Get.MenuItem$(MenuNum, Num)
Get.MenuItemInfo MenuNum, Num, Style$, Selected$, Active$
IF State THEN
	Set.MenuItem MenuNum, Num, Caption$, "1", Style$, Selected$
ELSE
	Set.MenuItem MenuNum, Num, Caption$, "0", Style$, Selected$
END IF
END SUB
