''
'' $Id: NLMenu.bas,v 1.9 1994/05/05 14:35:59 alex Rel $
''
'' Show use of NewLook menus using Intuition, GadTools and Locale
''
'' Derived from example (c) Copyright 1992 Commodore-Amiga, Inc.
''

DEFINT A-Z
REM $NOWINDOW
'REM $INCLUDE Exec.bh
'REM $INCLUDE Locale.bh
'REM $INCLUDE Graphics.bh
'REM $INCLUDE DiskFont.bh
'REM $INCLUDE Intuition.bh
'REM $INCLUDE GadTools.bh
'REM $INCLUDE ASL.bh
'REM $INCLUDE Utility.bc

REM $INCLUDE BLib/GadToolsMenus.bas	' gadtools menu builder helper

LIBRARY OPEN "exec.library", 36
LIBRARY OPEN "graphics.library", LIBRARY_MINIMUM&
LIBRARY OPEN "diskfont.library", LIBRARY_MINIMUM&
LIBRARY OPEN "intuition.library", 36
LIBRARY OPEN "gadtools.library", LIBRARY_MINIMUM&
LIBRARY OPEN "asl.library", LIBRARY_MINIMUM&

REM $INCLUDE NLMenu_strings.bc	' localized string IDs
REM $INCLUDE NLMenu_strings.bas	' default strings
REM $INCLUDE BLib/GetCString.bas	' localization helper

DIM SHARED tl&(40)	' generic TagList; space for 20 tags
DIM SHARED mysc&	' default public screen
DIM SHARED vi&		' GadTools ViewInfo
DIM SHARED dri&		' screen DrawInfo
DIM SHARED localeInfo&(2)	' Localization info (if locale.library available)

DIM SHARED junk&

'
' liStr - function to simplify getting a localized string from the catalog
'
FUNCTION liStr$(BYVAL id&)
	liStr$ = PEEK$(GetCString&(VARPTR(localeInfo&(0)), id&))
END FUNCTION

'
' createMenuStrip - create a complete menu strip
'
FUNCTION createMenuStrip&(nmList&, BYVAL tattr&)
	SHARED scaledcheck&, scaledamigakey&, vi&
	STATIC nmEntry&, strip&

	createMenuStrip& = NULL&
	nmList& = MenuAlloc&(nmEntry&, 19)	'space for 19 items (including the MenuEnd)
	IF nmList& THEN
		IF MenuTitle(nmEntry&, liStr$(MSG_PROJECT_MENU&), 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_PROJECT_OPEN&), liStr$(MSG_PROJECT_OPEN_CK&), 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_PROJECT_SAVE&), liStr$(MSG_PROJECT_SAVE_CK&), 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, "", "", 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_PROJECT_PRINT&), "", 0, 0, NULL&) AND _
		  MenuSubItem(nmEntry&, liStr$(MSG_PROJECT_PRINT_DRAFT&), liStr$(MSG_PROJECT_PRINT_DRAFT_CK&), CHECKIT& OR CHECKED&, NOT 1&, NULL&) AND _
		  MenuSubItem(nmEntry&, liStr$(MSG_PROJECT_PRINT_NLQ&), liStr$(MSG_PROJECT_PRINT_NLQ_CK&), CHECKIT&, NOT 2&, NULL&) AND _
		  MenuSubItem(nmEntry&, liStr$(MSG_PROJECT_PRINT_LASER&), liStr$(MSG_PROJECT_PRINT_LASER_CK&), CHECKIT&, NOT 4&, NULL&) AND _
		  MenuItem(nmEntry&, "", "", 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_PROJECT_QUIT&), liStr$(MSG_PROJECT_QUIT_CK&), 0, 0, NULL&) AND _
		  _
		  MenuTitle(nmEntry&, liStr$(MSG_EDIT_MENU&), 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_EDIT_CUT&), liStr$(MSG_EDIT_CUT_CK&), 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_EDIT_COPY&), liStr$(MSG_EDIT_COPY_CK&), 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_EDIT_PASTE&), liStr$(MSG_EDIT_PASTE_CK&), 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, "", "", 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_EDIT_ERASE&), liStr$(MSG_EDIT_ERASE_CK&), 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, "", "", 0, 0, NULL&) AND _
		  MenuItem(nmEntry&, liStr$(MSG_EDIT_UNDO&), liStr$(MSG_EDIT_UNDO_CK&), 0, 0, NULL&) THEN
			IF MenuEnd(nmEntry&, strip&, nmList&, tattr&, vi&, _
			  scaledcheck&, scaledamigakey&) THEN
				createMenuStrip& = strip&
			ELSE
				MenuFree nmList&, strip&
			END IF
		ELSE
			MenuFree nmList&, strip&
		END IF
	END IF
END FUNCTION

SUB main
	SHARED scaledcheck&, scaledamigakey&
	STATIC strip&, tattr&, customfont&, win&, nmList&, fo&, done
	STATIC imsg&, imsgClass&, imsgCode

	' try to open the locale library (taking care to ignore errors)
	LIBRARY VARPTR "locale.library", OpenLibrary&(SADD("locale.library" + CHR$(0)), 38)

	' no problem if it doesn't open
	localeInfo&(0) = LIBRARY("locale.library")
	IF LIBRARY("locale.library") <> NULL& THEN
		localeInfo&(1) = OpenCatalogA(NULL&, SADD("NLMenu.catalog" + CHR$(0)), NULL&)
	END IF

	mysc& = LockPubScreen&(NULL&)	'lock the default public screen
	IF mysc& THEN
		vi& = GetVisualInfoA&(mysc&, NULL&)	'get GadTools visual info for the screen
		IF vi& THEN
			dri& = GetScreenDrawInfo&(mysc&)	'and screen DrawInfo
			IF dri& THEN
				tattr& = PEEKL(mysc& + ScreenFont)	'default screen font

				customfont& = 0
				scaledcheck& = 0
				scaledamigakey& = 0
				TAGLIST VARPTR(tl&(0)), _
				  ASLFO_Screen&, mysc&, _
				  ASLFO_InitialName&, PEEKL(tattr& + ta_Name), _
				  ASLFO_InitialSize&, PEEKW(tattr& + ta_YSize), _
				  ASLFO_MaxHeight&, 32767, _
				  TAG_END&


				fo& = AllocAslRequest&(ASL_FontRequest&, VARPTR(tl&(0)))
				IF fo& THEN
					IF AslRequest&(fo&, NULL&) THEN
						tattr& = AllocMem&(TextAttr_sizeof, MEMF_CLEAR& OR MEMF_PUBLIC&)
						CopyMem fo& + fo_Attr, tattr&, TextAttr_sizeof
						POKEB tattr& + ta_Style, 0
						POKEB tattr& + ta_Flags, 0

						customfont& = OpenDiskFont&(tattr&)

						'Generate a custom checkmark whose size matches our custom font
						TAGLIST VARPTR(tl&(0)), _
						  SYSIA_DrawInfo&, dri&, _
						  SYSIA_Which&, MENUCHECK&, _
						  SYSIA_ReferenceFont&, customfont&, _
						  TAG_END&
						scaledcheck& = NewObjectA&(NULL&, SADD("sysiclass" + CHR$(0)), VARPTR(tl&(0)))

						'Generate a custom Amiga-key image whose size matches our custom font
						TAGLIST VARPTR(tl&(0)), _
						  SYSIA_DrawInfo&, dri&, _
						  SYSIA_Which&, AMIGAKEY&, _
						  SYSIA_ReferenceFont&, customfont&, _
						  TAG_END&
						scaledamigakey& = NewObjectA&(NULL&, SADD("sysiclass" + CHR$(0)), VARPTR(tl&(0)))
					ELSE
						FreeAslRequest fo&
					END IF
				END IF

				strip& = createMenuStrip&(nmList&, tattr&)

				TAGLIST VARPTR(tl&(0)), _
				  WA_Checkmark&, scaledcheck&, _
				  WA_AmigaKey&, scaledamigakey&, _
				  WA_Width&, 500, _
				  WA_InnerHeight&, 100, _
				  WA_Top&, 50, _
				  WA_Activate&, TRUE&, _
				  WA_DragBar&, TRUE&, _
				  WA_DepthGadget&, TRUE&, _
				  WA_CloseGadget&, TRUE&, _
				  WA_SizeGadget&, TRUE&, _
				  WA_SmartRefresh&, TRUE&, _
				  WA_NoCareRefresh&, TRUE&, _
				  WA_IDCMP&, IDCMP_CLOSEWINDOW& OR IDCMP_MENUPICK&, _
				  WA_MinWidth&, 50, _
				  WA_MinHeight&, 50, _
				  WA_NewLookMenus&, TRUE&, _
				  TAG_END&

				IF scaledcheck& = NULL& OR scaledamigakey& = NULL& THEN
					'if you don't have these scaled, mark their tags as ignored

					tl&(0) = TAG_IGNORE&
					tl&(2) = TAG_IGNORE&
				END IF

				win& = OpenWindowTagList&(NULL&, VARPTR(tl&(0)))
				junk& = SetMenuStrip&(win&, strip&)

				done = FALSE&
				WHILE done = FALSE&
					imsg& = WaitPort&(PEEKL(win& + UserPort))
					DO
						imsg& = GetMsg&(PEEKL(win& + UserPort))
						IF imsg& = NULL& THEN EXIT DO
						imsgClass& = PEEKL(imsg& + Class)
						imsgCode = PEEKW(imsg& + IntuiMessageCode)
						ReplyMsg imsg&
						SELECT CASE imsgClass&
							CASE IDCMP_CLOSEWINDOW&
								done = TRUE&
						END SELECT
					LOOP
				WEND

				ClearMenuStrip win&
				CloseWindow win&
				MenuFree nmList&, strip&

				IF customfont& THEN
					FreeAslRequest fo&
					FreeMem tattr&, TextAttr_sizeof
					CloseFont customfont&
					DisposeObject scaledamigakey&
					DisposeObject scaledcheck&
				END IF
			END IF
			FreeVisualInfo vi&
		END IF
		FreeScreenDrawInfo mysc&, dri&
	END IF
	UnlockPubScreen NULL&, mysc&
	IF LIBRARY("locale.library") <> NULL& THEN
		CloseCatalog localeInfo&(1)	' CloseCatalog NULL& is safe
	END IF
END SUB

main
END
