implementation module menuCrossCall_12


import	StdInt, StdMisc, StdTuple
from	StdIOCommon	import :: Modifiers
import	clCrossCall_12
from	clCCall_12	import winMakeCString, winReleaseCString, :: CSTR, toModifiers
from	ostypes		import :: HWND


::	HITEM	:==  Int
::	HMENU	:==  Int


winCreatePopupMenuHandle :: !*OSToolbox -> (!HMENU,!*OSToolbox)		// PA: check if this can be a C call
winCreatePopupMenuHandle tb
	# (rcci,tb)	= issueCleanRequest2 (errorCallback2 "winCreatePopupMenuHandle") (Rq0Cci CcRqCREATEPOPMENU) tb
	  menu		= case rcci.ccMsg of
					CcRETURN1	-> rcci.p1
					CcWASQUIT	-> 0
					otherwise	-> abort "[winCreatePopupMenuHandle] expected CcRETURN1 value."
	= (menu,tb)

winTrackPopupMenu :: !HMENU !HWND !*OSToolbox -> (!Int,!Modifiers,!*OSToolbox)
winTrackPopupMenu menu framePtr tb
	# (rcci,tb)			= issueCleanRequest2 (errorCallback2 "winTrackPopupMenu") (Rq2Cci CcRqTRACKPOPMENU menu framePtr) tb
	  (menuItemID,mods)	= case rcci.ccMsg of
							CcRETURN2	-> (rcci.p1,rcci.p2)
							CcWASQUIT	-> (0, 0)
							otherwise	-> abort "[winTrackPopupMenu] expected CcRETURN2 value."
	= (menuItemID,toModifiers mods,tb)

winInsertMenu :: !String !Bool !HMENU !HMENU !Int !*OSToolbox -> *OSToolbox
winInsertMenu text state submenu menu pos tb
	# (textptr,tb)	= winMakeCString text tb
	# (_,tb)		= issueCleanRequest2 (errorCallback2 "winInsertMenu") (Rq5Cci CcRqINSERTMENU (toInt state) menu textptr submenu pos) tb
	= winReleaseCString textptr tb

winInsertMenuItem :: !String !Bool !Bool !HMENU !Int !*OSToolbox -> (!HITEM,!*OSToolbox)
winInsertMenuItem text ablestate markstate menu pos tb
	# (textptr,tb)	= winMakeCString text tb
	  insertCci		= Rq5Cci CcRqINSERTMENUITEM (toInt ablestate) menu textptr (toInt markstate) pos
	# (rcci,tb)		= issueCleanRequest2 (errorCallback2 "winInsertMenuItem") insertCci tb
	  hitem			= case rcci.ccMsg of
						CcRETURN1	-> rcci.p1
						CcWASQUIT	-> 0
						other		-> abort "[winInsertMenuItem] expected CcRETURN1 value."
	# tb			= winReleaseCString textptr tb
	= (hitem,tb)

winInsertSeparator :: !HMENU !Int !*OSToolbox -> *OSToolbox
winInsertSeparator menu pos tb
	= snd (issueCleanRequest2 (errorCallback2 "winInsertSeparator") (Rq2Cci CcRqINSERTSEPARATOR menu pos) tb)

winChangeMenuItemCheck :: !HMENU !HITEM !Bool !*OSToolbox -> *OSToolbox
winChangeMenuItemCheck menu hitem state tb
	= snd (issueCleanRequest2 (errorCallback2 "winChangeMenuItemCheck") (Rq3Cci CcRqCHECKMENUITEM menu hitem (toInt state)) tb)

winModifyMenu :: !String !HMENU !HMENU !*OSToolbox -> *OSToolbox
winModifyMenu text submenu menu tb
	# (textptr,tb)	= winMakeCString text tb
	# (_,tb)		= issueCleanRequest2 (errorCallback2 "winModifyMenu") (Rq3Cci CcRqMODIFYMENU submenu menu textptr) tb
	= winReleaseCString textptr tb

winModifyMenuItem :: !String !HITEM !HMENU !*OSToolbox -> *OSToolbox
winModifyMenuItem text hitem menu tb
	# (textptr,tb)	= winMakeCString text tb
	# (_,tb)		= issueCleanRequest2 (errorCallback2 "winModifyMenuItem") (Rq3Cci CcRqMODIFYMENUITEM hitem menu textptr) tb
	= winReleaseCString textptr tb

winDestroyMenu :: !HMENU !*OSToolbox -> *OSToolbox
winDestroyMenu menu tb
	= snd (issueCleanRequest2 (errorCallback2 "winDestroyMenu") (Rq1Cci CcRqDESTROYMENU menu) tb)

winDeleteMenu :: !HMENU !HITEM !*OSToolbox -> *OSToolbox
winDeleteMenu menu hitem tb
	= snd (issueCleanRequest2 (errorCallback2 "winDeleteMenu") (Rq2Cci CcRqDELETEMENU menu hitem) tb)

winRemoveMenuItem :: !HMENU !HITEM !*OSToolbox -> *OSToolbox
winRemoveMenuItem menu hitem tb
	= snd (issueCleanRequest2 (errorCallback2 "winRemoveMenuItem") (Rq2Cci CcRqREMOVEMENUITEM menu hitem) tb)

winChangeItemAbility :: !HMENU !HITEM !Bool !*OSToolbox -> *OSToolbox
winChangeItemAbility parent hitem onoff tb
	= snd (issueCleanRequest2 (errorCallback2 "winChangeItemAbility") (Rq3Cci CcRqITEMENABLE parent hitem (toInt onoff)) tb)

winChangeMenuAbility :: !HMENU !Int !Bool !*OSToolbox -> *OSToolbox
winChangeMenuAbility parent zIndex onoff tb
	= snd (issueCleanRequest2 (errorCallback2 "winChangeMenuAbility") (Rq3Cci CcRqMENUENABLE parent zIndex (toInt onoff)) tb)

winDrawMenuBar :: !HWND !HWND !*OSToolbox -> *OSToolbox
winDrawMenuBar framePtr clientPtr tb
	= snd (issueCleanRequest2 (errorCallback2 "winDrawMenuBar") (Rq2Cci CcRqDRAWMBAR framePtr clientPtr) tb)

winAddMenuShortKey :: !HWND !Int !Char !*OSToolbox -> *OSToolbox
winAddMenuShortKey framePtr cmd key tb
	= snd (issueCleanRequest2 (errorCallback2 "winAddMenuShortKey") (Rq3Cci CcRqADDMENUSHORTKEY framePtr cmd (toInt key)) tb)

winRemoveMenuShortKey :: !HWND !Int !*OSToolbox -> *OSToolbox
winRemoveMenuShortKey framePtr cmd tb
	= snd (issueCleanRequest2 (errorCallback2 "winRemoveMenuShortKey") (Rq2Cci CcRqREMOVEMENUSHORTKEY framePtr cmd) tb)
