'===========================================================================
' Subject: bitmap shifter routine.            Date: 06-15-01 (19:34)       
'  Author: Vincent Voois                      Code: QB,  PDS               
'  Origin: vvacme@worldonline.nl            Packet: XBASIC.ABC
'===========================================================================
'
' ####################
' #####  PROLOG  #####
' ####################
'
PROGRAM	"apicshift"
VERSION	"1.0000"
'
'	This small program demonstrates how you can use mouse coordinates
' to shuffle with images on a label - grid.
'
' I was just fiddling around to have some usefull code for my own
' application, i think others might have use of this basics too.
'
' The routine has been slightly optimized as it did not run very quick
' on my P133 notebook. I also noticed the drag kept on going even if the
' mouseup message was already due. I added a skipper in the MouseDrag routine
' to bail out as soon as the mouse-button state becomes zero.
'
'	May 6th 2000
' Vincent Voois
'
' ******  Comment libraries in/out as needed  *****
'
'	IMPORT	"xma"   ' Math library     : SIN/ASIN/SINH/ASINH/LOG/EXP/SQRT...
'	IMPORT	"xcm"   ' Complex library  : complex number library  (trig, etc)
	IMPORT	"xst"   ' Standard library : required by most programs
	IMPORT	"xgr"   ' GraphicsDesigner : required by GuiDesigner programs
	IMPORT	"xui"   ' GuiDesigner      : required by GuiDesigner programs
'
INTERNAL FUNCTION  Entry         ()
INTERNAL FUNCTION  InitGui       ()
INTERNAL FUNCTION  InitProgram   ()
INTERNAL FUNCTION  CreateWindows ()
INTERNAL FUNCTION  InitWindows   ()
INTERNAL FUNCTION  Pictureshifter (grid, message, v0, v1, v2, v3, r0, ANY)
INTERNAL FUNCTION  PictureshifterCode (grid, message, v0, v1, v2, v3, kid, ANY)

UBYTE #image[]
XLONG #pwidth, #pheight, #gwidth, #gheight, #GenGrid
'
'
' ######################
' #####  Entry ()  #####
' ######################
'
FUNCTION  Entry ()
	SHARED  terminateProgram
	STATIC	entry
'
	IF entry THEN RETURN					' enter once
	entry =  $$TRUE								' enter occured
'
	InitGui ()										' initialize messages
	InitProgram ()								' initialize this program
	CreateWindows ()							' create main window and others
	InitWindows ()								' initialize windows and grids
'	PRINT #GenGrid, #pwidth, #pheight, #gwidth, #gheight
'
	IF LIBRARY(0) THEN RETURN			' main program executes message loop
'
	DO														' the message loop
		XgrProcessMessages (1)			' process one message
	LOOP UNTIL terminateProgram		' and repeat until program is terminated
END FUNCTION
'
'
' ########################
' #####  InitGui ()  #####
' ########################
'
' InitGui() initializes cursor, icon, message, and display variables.
' Programs can reference these variables, but must never change them.
'
FUNCTION  InitGui ()
'
' need to set program name so grid properties
' can be set from the grid property database.
'
	program$ = PROGRAM$(0)
	XstSetProgramName (@program$)
'
' ***************************************
' *****  Register Standard Cursors  *****
' ***************************************
'
	XgrRegisterCursor (@"default",      @#cursorDefault)
	XgrRegisterCursor (@"arrow",        @#cursorArrow)
	XgrRegisterCursor (@"n",            @#cursorN)
	XgrRegisterCursor (@"s",            @#cursorS)
	XgrRegisterCursor (@"e",            @#cursorE)
	XgrRegisterCursor (@"w",            @#cursorW)
	XgrRegisterCursor (@"ns",           @#cursorArrowsNS)
	XgrRegisterCursor (@"ns",           @#cursorArrowsSN)
	XgrRegisterCursor (@"ew",           @#cursorArrowsEW)
	XgrRegisterCursor (@"ew",           @#cursorArrowsWE)
	XgrRegisterCursor (@"nwse",         @#cursorArrowsNWSE)
	XgrRegisterCursor (@"nesw",         @#cursorArrowsNESW)
	XgrRegisterCursor (@"all",          @#cursorArrowsAll)
	XgrRegisterCursor (@"plus",         @#cursorPlus)
	XgrRegisterCursor (@"wait",         @#cursorWait)
	XgrRegisterCursor (@"insert",       @#cursorInsert)
	XgrRegisterCursor (@"crosshair",    @#cursorCrosshair)
	XgrRegisterCursor (@"hourglass",    @#cursorHourglass)
	XgrRegisterCursor (@"hand",         @#cursorHand)
	XgrRegisterCursor (@"help",         @#cursorHelp)
'
	#defaultCursor = #cursorDefault
'
'
' ********************************************
' *****  Register Standard Window Icons  *****
' ********************************************
'
	XgrRegisterIcon (@"hand",					@#iconHand)
	XgrRegisterIcon (@"asterisk",			@#iconAsterisk)
	XgrRegisterIcon (@"question",			@#iconQuestion)
	XgrRegisterIcon (@"exclamation",	@#iconExclamation)
	XgrRegisterIcon (@"application",	@#iconApplication)
'
	XgrRegisterIcon (@"hand",					@#iconStop)						' alias
	XgrRegisterIcon (@"asterisk",			@#iconInformation)		' alias
	XgrRegisterIcon (@"application",  @#iconBlank)					' alias
'
	XgrRegisterIcon (@"window",				@#iconWindow)					' custom
'
'
' ******************************
' *****  Register Messages *****  Create message numbers for message names
' ******************************
'
	XgrRegisterMessage (@"Blowback",										@#Blowback)
	XgrRegisterMessage (@"Callback",										@#Callback)
	XgrRegisterMessage (@"Cancel",											@#Cancel)
	XgrRegisterMessage (@"Change",											@#Change)
	XgrRegisterMessage (@"CloseWindow",									@#CloseWindow)
	XgrRegisterMessage (@"ContextChange",								@#ContextChange)
	XgrRegisterMessage (@"Create",											@#Create)
	XgrRegisterMessage (@"CreateValueArray",						@#CreateValueArray)
	XgrRegisterMessage (@"CreateWindow",								@#CreateWindow)
	XgrRegisterMessage (@"CursorH",											@#CursorH)
	XgrRegisterMessage (@"CursorV",											@#CursorV)
	XgrRegisterMessage (@"Deselected",									@#Deselected)
	XgrRegisterMessage (@"Destroy",											@#Destroy)
	XgrRegisterMessage (@"Destroyed",										@#Destroyed)
	XgrRegisterMessage (@"DestroyWindow",								@#DestroyWindow)
	XgrRegisterMessage (@"Disable",											@#Disable)
	XgrRegisterMessage (@"Disabled",										@#Disabled)
	XgrRegisterMessage (@"Displayed",										@#Displayed)
	XgrRegisterMessage (@"DisplayWindow",								@#DisplayWindow)
	XgrRegisterMessage (@"Enable",											@#Enable)
	XgrRegisterMessage (@"Enabled",											@#Enabled)
	XgrRegisterMessage (@"Enter",												@#Enter)
	XgrRegisterMessage (@"ExitMessageLoop",							@#ExitMessageLoop)
	XgrRegisterMessage (@"Find",												@#Find)
	XgrRegisterMessage (@"FindForward",									@#FindForward)
	XgrRegisterMessage (@"FindReverse",									@#FindReverse)
	XgrRegisterMessage (@"Forward",											@#Forward)
	XgrRegisterMessage (@"GetAlign",										@#GetAlign)
	XgrRegisterMessage (@"GetBorder",										@#GetBorder)
	XgrRegisterMessage (@"GetBorderOffset",							@#GetBorderOffset)
	XgrRegisterMessage (@"GetCallback",									@#GetCallback)
	XgrRegisterMessage (@"GetCallbackArgs",							@#GetCallbackArgs)
	XgrRegisterMessage (@"GetCan",											@#GetCan)
	XgrRegisterMessage (@"GetCharacterMapArray",				@#GetCharacterMapArray)
	XgrRegisterMessage (@"GetCharacterMapEntry",				@#GetCharacterMapEntry)
	XgrRegisterMessage (@"GetClipGrid",									@#GetClipGrid)
	XgrRegisterMessage (@"GetColor",										@#GetColor)
	XgrRegisterMessage (@"GetColorExtra",								@#GetColorExtra)
	XgrRegisterMessage (@"GetCursor",										@#GetCursor)
	XgrRegisterMessage (@"GetCursorXY",									@#GetCursorXY)
	XgrRegisterMessage (@"GetDisplay",									@#GetDisplay)
	XgrRegisterMessage (@"GetEnclosedGrids",						@#GetEnclosedGrids)
	XgrRegisterMessage (@"GetEnclosingGrid",						@#GetEnclosingGrid)
	XgrRegisterMessage (@"GetFocusColor",								@#GetFocusColor)
	XgrRegisterMessage (@"GetFocusColorExtra",					@#GetFocusColorExtra)
	XgrRegisterMessage (@"GetFont",											@#GetFont)
	XgrRegisterMessage (@"GetFontMetrics",							@#GetFontMetrics)
	XgrRegisterMessage (@"GetFontNumber",								@#GetFontNumber)
	XgrRegisterMessage (@"GetGridFunction",							@#GetGridFunction)
	XgrRegisterMessage (@"GetGridFunctionName",					@#GetGridFunctionName)
	XgrRegisterMessage (@"GetGridName",									@#GetGridName)
	XgrRegisterMessage (@"GetGridNumber",								@#GetGridNumber)
	XgrRegisterMessage (@"GetGridProperties",						@#GetGridProperties)
	XgrRegisterMessage (@"GetGridType",									@#GetGridType)
	XgrRegisterMessage (@"GetGridTypeName",							@#GetGridTypeName)
	XgrRegisterMessage (@"GetGroup",										@#GetGroup)
	XgrRegisterMessage (@"GetHelp",											@#GetHelp)
	XgrRegisterMessage (@"GetHelpFile",									@#GetHelpFile)
	XgrRegisterMessage (@"GetHelpString",								@#GetHelpString)
	XgrRegisterMessage (@"GetHelpStrings",							@#GetHelpStrings)
	XgrRegisterMessage (@"GetHintString",								@#GetHintString)
	XgrRegisterMessage (@"GetImage",										@#GetImage)
	XgrRegisterMessage (@"GetImageCoords",							@#GetImageCoords)
	XgrRegisterMessage (@"GetIndent",										@#GetIndent)
	XgrRegisterMessage (@"GetInfo",											@#GetInfo)
	XgrRegisterMessage (@"GetJustify",									@#GetJustify)
	XgrRegisterMessage (@"GetKeyboardFocus",						@#GetKeyboardFocus)
	XgrRegisterMessage (@"GetKeyboardFocusGrid",				@#GetKeyboardFocusGrid)
	XgrRegisterMessage (@"GetKidArray",									@#GetKidArray)
	XgrRegisterMessage (@"GetKidNumber",								@#GetKidNumber)
	XgrRegisterMessage (@"GetKids",											@#GetKids)
	XgrRegisterMessage (@"GetKind",											@#GetKind)
	XgrRegisterMessage (@"GetMaxMinSize",								@#GetMaxMinSize)
	XgrRegisterMessage (@"GetMessageFunc",							@#GetMessageFunc)
	XgrRegisterMessage (@"GetMessageFuncArray",					@#GetMessageFuncArray)
	XgrRegisterMessage (@"GetMessageSub",								@#GetMessageSub)
	XgrRegisterMessage (@"GetMessageSubArray",					@#GetMessageSubArray)
	XgrRegisterMessage (@"GetModalInfo",								@#GetModalInfo)
	XgrRegisterMessage (@"GetModalWindow",							@#GetModalWindow)
	XgrRegisterMessage (@"GetParent",										@#GetParent)
	XgrRegisterMessage (@"GetPosition",									@#GetPosition)
	XgrRegisterMessage (@"GetProtoInfo",								@#GetProtoInfo)
	XgrRegisterMessage (@"GetRedrawFlags",							@#GetRedrawFlags)
	XgrRegisterMessage (@"GetSize",											@#GetSize)
	XgrRegisterMessage (@"GetSmallestSize",							@#GetSmallestSize)
	XgrRegisterMessage (@"GetState",										@#GetState)
	XgrRegisterMessage (@"GetStyle",										@#GetStyle)
	XgrRegisterMessage (@"GetTabArray",									@#GetTabArray)
	XgrRegisterMessage (@"GetTabWidth",									@#GetTabWidth)
	XgrRegisterMessage (@"GetTextArray",								@#GetTextArray)
	XgrRegisterMessage (@"GetTextArrayBounds",					@#GetTextArrayBounds)
	XgrRegisterMessage (@"GetTextArrayLine",						@#GetTextArrayLine)
	XgrRegisterMessage (@"GetTextArrayLines",						@#GetTextArrayLines)
	XgrRegisterMessage (@"GetTextCursor",								@#GetTextCursor)
	XgrRegisterMessage (@"GetTextFilename",							@#GetTextFilename)
	XgrRegisterMessage (@"GetTextPosition",							@#GetTextPosition)
	XgrRegisterMessage (@"GetTextSelection",						@#GetTextSelection)
	XgrRegisterMessage (@"GetTextSpacing",							@#GetTextSpacing)
	XgrRegisterMessage (@"GetTextString",								@#GetTextString)
	XgrRegisterMessage (@"GetTextStrings",							@#GetTextStrings)
	XgrRegisterMessage (@"GetTexture",									@#GetTexture)
	XgrRegisterMessage (@"GetTimer",										@#GetTimer)
	XgrRegisterMessage (@"GetValue",										@#GetValue)
	XgrRegisterMessage (@"GetValueArray",								@#GetValueArray)
	XgrRegisterMessage (@"GetValues",										@#GetValues)
	XgrRegisterMessage (@"GetWindow",										@#GetWindow)
	XgrRegisterMessage (@"GetWindowFunction",						@#GetWindowFunction)
	XgrRegisterMessage (@"GetWindowGrid",								@#GetWindowGrid)
	XgrRegisterMessage (@"GetWindowIcon",								@#GetWindowIcon)
	XgrRegisterMessage (@"GetWindowSize",								@#GetWindowSize)
	XgrRegisterMessage (@"GetWindowTitle",							@#GetWindowTitle)
	XgrRegisterMessage (@"GotKeyboardFocus",						@#GotKeyboardFocus)
	XgrRegisterMessage (@"GrabArray",										@#GrabArray)
	XgrRegisterMessage (@"GrabTextArray",								@#GrabTextArray)
	XgrRegisterMessage (@"GrabTextString",							@#GrabTextString)
	XgrRegisterMessage (@"GrabValueArray",							@#GrabValueArray)
	XgrRegisterMessage (@"Help",												@#Help)
	XgrRegisterMessage (@"Hidden",											@#Hidden)
	XgrRegisterMessage (@"HideTextCursor",							@#HideTextCursor)
	XgrRegisterMessage (@"HideWindow",									@#HideWindow)
	XgrRegisterMessage (@"Initialize",									@#Initialize)
	XgrRegisterMessage (@"Initialized",									@#Initialized)
	XgrRegisterMessage (@"Inline",											@#Inline)
	XgrRegisterMessage (@"InquireText",									@#InquireText)
	XgrRegisterMessage (@"KeyboardFocusBackward",				@#KeyboardFocusBackward)
	XgrRegisterMessage (@"KeyboardFocusForward",				@#KeyboardFocusForward)
	XgrRegisterMessage (@"KeyDown",											@#KeyDown)
	XgrRegisterMessage (@"KeyUp",												@#KeyUp)
	XgrRegisterMessage (@"LostKeyboardFocus",						@#LostKeyboardFocus)
	XgrRegisterMessage (@"LostTextSelection",						@#LostTextSelection)
	XgrRegisterMessage (@"Maximized",										@#Maximized)
	XgrRegisterMessage (@"MaximizeWindow",							@#MaximizeWindow)
	XgrRegisterMessage (@"Maximum",											@#Maximum)
	XgrRegisterMessage (@"Minimized",										@#Minimized)
	XgrRegisterMessage (@"MinimizeWindow",							@#MinimizeWindow)
	XgrRegisterMessage (@"Minimum",											@#Minimum)
	XgrRegisterMessage (@"MonitorContext",							@#MonitorContext)
	XgrRegisterMessage (@"MonitorHelp",									@#MonitorHelp)
	XgrRegisterMessage (@"MonitorKeyboard",							@#MonitorKeyboard)
	XgrRegisterMessage (@"MonitorMouse",								@#MonitorMouse)
	XgrRegisterMessage (@"MouseDown",										@#MouseDown)
	XgrRegisterMessage (@"MouseDrag",										@#MouseDrag)
	XgrRegisterMessage (@"MouseEnter",									@#MouseEnter)
	XgrRegisterMessage (@"MouseExit",										@#MouseExit)
	XgrRegisterMessage (@"MouseMove",										@#MouseMove)
	XgrRegisterMessage (@"MouseUp",											@#MouseUp)
	XgrRegisterMessage (@"MouseWheel",									@#MouseWheel)
	XgrRegisterMessage (@"MuchLess",										@#MuchLess)
	XgrRegisterMessage (@"MuchMore",										@#MuchMore)
	XgrRegisterMessage (@"Notify",											@#Notify)
	XgrRegisterMessage (@"OneLess",											@#OneLess)
	XgrRegisterMessage (@"OneMore",											@#OneMore)
	XgrRegisterMessage (@"PokeArray",										@#PokeArray)
	XgrRegisterMessage (@"PokeTextArray",								@#PokeTextArray)
	XgrRegisterMessage (@"PokeTextString",							@#PokeTextString)
	XgrRegisterMessage (@"PokeValueArray",							@#PokeValueArray)
	XgrRegisterMessage (@"Print",												@#Print)
	XgrRegisterMessage (@"Redraw",											@#Redraw)
	XgrRegisterMessage (@"RedrawGrid",									@#RedrawGrid)
	XgrRegisterMessage (@"RedrawLines",									@#RedrawLines)
	XgrRegisterMessage (@"Redrawn",											@#Redrawn)
	XgrRegisterMessage (@"RedrawText",									@#RedrawText)
	XgrRegisterMessage (@"RedrawWindow",								@#RedrawWindow)
	XgrRegisterMessage (@"Replace",											@#Replace)
	XgrRegisterMessage (@"ReplaceForward",							@#ReplaceForward)
	XgrRegisterMessage (@"ReplaceReverse",							@#ReplaceReverse)
	XgrRegisterMessage (@"Reset",												@#Reset)
	XgrRegisterMessage (@"Resize",											@#Resize)
	XgrRegisterMessage (@"Resized",											@#Resized)
	XgrRegisterMessage (@"ResizeNot",										@#ResizeNot)
	XgrRegisterMessage (@"ResizeWindow",								@#ResizeWindow)
	XgrRegisterMessage (@"ResizeWindowToGrid",					@#ResizeWindowToGrid)
	XgrRegisterMessage (@"Resized",											@#Resized)
	XgrRegisterMessage (@"Reverse",											@#Reverse)
	XgrRegisterMessage (@"ScrollH",											@#ScrollH)
	XgrRegisterMessage (@"ScrollV",											@#ScrollV)
	XgrRegisterMessage (@"Select",											@#Select)
	XgrRegisterMessage (@"Selected",										@#Selected)
	XgrRegisterMessage (@"Selection",										@#Selection)
	XgrRegisterMessage (@"SelectWindow",								@#SelectWindow)
	XgrRegisterMessage (@"SetAlign",										@#SetAlign)
	XgrRegisterMessage (@"SetBorder",										@#SetBorder)
	XgrRegisterMessage (@"SetBorderOffset",							@#SetBorderOffset)
	XgrRegisterMessage (@"SetCallback",									@#SetCallback)
	XgrRegisterMessage (@"SetCan",											@#SetCan)
	XgrRegisterMessage (@"SetCharacterMapArray",				@#SetCharacterMapArray)
	XgrRegisterMessage (@"SetCharacterMapEntry",				@#SetCharacterMapEntry)
	XgrRegisterMessage (@"SetClipGrid",									@#SetClipGrid)
	XgrRegisterMessage (@"SetColor",										@#SetColor)
	XgrRegisterMessage (@"SetColorAll",									@#SetColorAll)
	XgrRegisterMessage (@"SetColorExtra",								@#SetColorExtra)
	XgrRegisterMessage (@"SetColorExtraAll",						@#SetColorExtraAll)
	XgrRegisterMessage (@"SetCursor",										@#SetCursor)
	XgrRegisterMessage (@"SetCursorXY",									@#SetCursorXY)
	XgrRegisterMessage (@"SetDisplay",									@#SetDisplay)
	XgrRegisterMessage (@"SetFocusColor",								@#SetFocusColor)
	XgrRegisterMessage (@"SetFocusColorExtra",					@#SetFocusColorExtra)
	XgrRegisterMessage (@"SetFont",											@#SetFont)
	XgrRegisterMessage (@"SetFontNumber",								@#SetFontNumber)
	XgrRegisterMessage (@"SetGridFunction",							@#SetGridFunction)
	XgrRegisterMessage (@"SetGridFunctionName",					@#SetGridFunctionName)
	XgrRegisterMessage (@"SetGridName",									@#SetGridName)
	XgrRegisterMessage (@"SetGridProperties",						@#SetGridProperties)
	XgrRegisterMessage (@"SetGridType",									@#SetGridType)
	XgrRegisterMessage (@"SetGridTypeName",							@#SetGridTypeName)
	XgrRegisterMessage (@"SetGroup",										@#SetGroup)
	XgrRegisterMessage (@"SetHelp",											@#SetHelp)
	XgrRegisterMessage (@"SetHelpFile",									@#SetHelpFile)
	XgrRegisterMessage (@"SetHelpString",								@#SetHelpString)
	XgrRegisterMessage (@"SetHelpStrings",							@#SetHelpStrings)
	XgrRegisterMessage (@"SetHintString",								@#SetHintString)
	XgrRegisterMessage (@"SetImage",										@#SetImage)
	XgrRegisterMessage (@"SetImageCoords",							@#SetImageCoords)
	XgrRegisterMessage (@"SetIndent",										@#SetIndent)
	XgrRegisterMessage (@"SetInfo",											@#SetInfo)
	XgrRegisterMessage (@"SetJustify",									@#SetJustify)
	XgrRegisterMessage (@"SetKeyboardFocus",						@#SetKeyboardFocus)
	XgrRegisterMessage (@"SetKeyboardFocusGrid",				@#SetKeyboardFocusGrid)
	XgrRegisterMessage (@"SetKidArray",									@#SetKidArray)
	XgrRegisterMessage (@"SetMaxMinSize",								@#SetMaxMinSize)
	XgrRegisterMessage (@"SetMessageFunc",							@#SetMessageFunc)
	XgrRegisterMessage (@"SetMessageFuncArray",					@#SetMessageFuncArray)
	XgrRegisterMessage (@"SetMessageSub",								@#SetMessageSub)
	XgrRegisterMessage (@"SetMessageSubArray",					@#SetMessageSubArray)
	XgrRegisterMessage (@"SetModalWindow",							@#SetModalWindow)
	XgrRegisterMessage (@"SetParent",										@#SetParent)
	XgrRegisterMessage (@"SetPosition",									@#SetPosition)
	XgrRegisterMessage (@"SetRedrawFlags",							@#SetRedrawFlags)
	XgrRegisterMessage (@"SetSize",											@#SetSize)
	XgrRegisterMessage (@"SetState",										@#SetState)
	XgrRegisterMessage (@"SetStyle",										@#SetStyle)
	XgrRegisterMessage (@"SetTabArray",									@#SetTabArray)
	XgrRegisterMessage (@"SetTabWidth",									@#SetTabWidth)
	XgrRegisterMessage (@"SetTextArray",								@#SetTextArray)
	XgrRegisterMessage (@"SetTextArrayLine",						@#SetTextArrayLine)
	XgrRegisterMessage (@"SetTextArrayLines",						@#SetTextArrayLines)
	XgrRegisterMessage (@"SetTextCursor",								@#SetTextCursor)
	XgrRegisterMessage (@"SetTextFilename",							@#SetTextFilename)
	XgrRegisterMessage (@"SetTextSelection",						@#SetTextSelection)
	XgrRegisterMessage (@"SetTextSpacing",							@#SetTextSpacing)
	XgrRegisterMessage (@"SetTextString",								@#SetTextString)
	XgrRegisterMessage (@"SetTextStrings",							@#SetTextStrings)
	XgrRegisterMessage (@"SetTexture",									@#SetTexture)
	XgrRegisterMessage (@"SetTimer",										@#SetTimer)
	XgrRegisterMessage (@"SetValue",										@#SetValue)
	XgrRegisterMessage (@"SetValues",										@#SetValues)
	XgrRegisterMessage (@"SetValueArray",								@#SetValueArray)
	XgrRegisterMessage (@"SetWindowFunction",						@#SetWindowFunction)
	XgrRegisterMessage (@"SetWindowIcon",								@#SetWindowIcon)
	XgrRegisterMessage (@"SetWindowTitle",							@#SetWindowTitle)
	XgrRegisterMessage (@"ShowTextCursor",							@#ShowTextCursor)
	XgrRegisterMessage (@"ShowWindow",									@#ShowWindow)
	XgrRegisterMessage (@"SomeLess",										@#SomeLess)
	XgrRegisterMessage (@"SomeMore",										@#SomeMore)
	XgrRegisterMessage (@"StartTimer",									@#StartTimer)
	XgrRegisterMessage (@"SystemMessage",								@#SystemMessage)
	XgrRegisterMessage (@"TextDelete",									@#TextDelete)
	XgrRegisterMessage (@"TextEvent",										@#TextEvent)
	XgrRegisterMessage (@"TextInsert",									@#TextInsert)
	XgrRegisterMessage (@"TextModified",								@#TextModified)
	XgrRegisterMessage (@"TextReplace",									@#TextReplace)
	XgrRegisterMessage (@"TimeOut",											@#TimeOut)
	XgrRegisterMessage (@"Update",											@#Update)
	XgrRegisterMessage (@"WindowClose",									@#WindowClose)
	XgrRegisterMessage (@"WindowCreate",								@#WindowCreate)
	XgrRegisterMessage (@"WindowDeselected",						@#WindowDeselected)
	XgrRegisterMessage (@"WindowDestroy",								@#WindowDestroy)
	XgrRegisterMessage (@"WindowDestroyed",							@#WindowDestroyed)
	XgrRegisterMessage (@"WindowDisplay",								@#WindowDisplay)
	XgrRegisterMessage (@"WindowDisplayed",							@#WindowDisplayed)
	XgrRegisterMessage (@"WindowGetDisplay",						@#WindowGetDisplay)
	XgrRegisterMessage (@"WindowGetFunction",						@#WindowGetFunction)
	XgrRegisterMessage (@"WindowGetIcon",								@#WindowGetIcon)
	XgrRegisterMessage (@"WindowGetKeyboardFocusGrid",	@#WindowGetKeyboardFocusGrid)
	XgrRegisterMessage (@"WindowGetSelectedWindow",			@#WindowGetSelectedWindow)
	XgrRegisterMessage (@"WindowGetSize",								@#WindowGetSize)
	XgrRegisterMessage (@"WindowGetTitle",							@#WindowGetTitle)
	XgrRegisterMessage (@"WindowHelp",									@#WindowHelp)
	XgrRegisterMessage (@"WindowHide",									@#WindowHide)
	XgrRegisterMessage (@"WindowHidden",								@#WindowHidden)
	XgrRegisterMessage (@"WindowKeyDown",								@#WindowKeyDown)
	XgrRegisterMessage (@"WindowKeyUp",									@#WindowKeyUp)
	XgrRegisterMessage (@"WindowMaximize",							@#WindowMaximize)
	XgrRegisterMessage (@"WindowMaximized",							@#WindowMaximized)
	XgrRegisterMessage (@"WindowMinimize",							@#WindowMinimize)
	XgrRegisterMessage (@"WindowMinimized",							@#WindowMinimized)
	XgrRegisterMessage (@"WindowMonitorContext",				@#WindowMonitorContext)
	XgrRegisterMessage (@"WindowMonitorHelp",						@#WindowMonitorHelp)
	XgrRegisterMessage (@"WindowMonitorKeyboard",				@#WindowMonitorKeyboard)
	XgrRegisterMessage (@"WindowMonitorMouse",					@#WindowMonitorMouse)
	XgrRegisterMessage (@"WindowMouseDown",							@#WindowMouseDown)
	XgrRegisterMessage (@"WindowMouseDrag",							@#WindowMouseDrag)
	XgrRegisterMessage (@"WindowMouseEnter",						@#WindowMouseEnter)
	XgrRegisterMessage (@"WindowMouseExit",							@#WindowMouseExit)
	XgrRegisterMessage (@"WindowMouseMove",							@#WindowMouseMove)
	XgrRegisterMessage (@"WindowMouseUp",								@#WindowMouseUp)
	XgrRegisterMessage (@"WindowMouseWheel",						@#WindowMouseWheel)
	XgrRegisterMessage (@"WindowRedraw",								@#WindowRedraw)
	XgrRegisterMessage (@"WindowRegister",							@#WindowRegister)
	XgrRegisterMessage (@"WindowResize",								@#WindowResize)
	XgrRegisterMessage (@"WindowResized",								@#WindowResized)
	XgrRegisterMessage (@"WindowResizeToGrid",					@#WindowResizeToGrid)
	XgrRegisterMessage (@"WindowSelect",								@#WindowSelect)
	XgrRegisterMessage (@"WindowSelected",							@#WindowSelected)
	XgrRegisterMessage (@"WindowSetFunction",						@#WindowSetFunction)
	XgrRegisterMessage (@"WindowSetIcon",								@#WindowSetIcon)
	XgrRegisterMessage (@"WindowSetKeyboardFocusGrid",	@#WindowSetKeyboardFocusGrid)
	XgrRegisterMessage (@"WindowSetTitle",							@#WindowSetTitle)
	XgrRegisterMessage (@"WindowShow",									@#WindowShow)
	XgrRegisterMessage (@"WindowSystemMessage",					@#WindowSystemMessage)
	XgrRegisterMessage (@"LastMessage",									@#LastMessage)
'
	XgrGetDisplaySize ("", @#displayWidth, @#displayHeight, @#windowBorderWidth, @#windowTitleHeight)
END FUNCTION
'
'
' ############################
' #####  InitProgram ()  #####
' ############################
'
'
'	Insert your own picture location here.
'
'
FUNCTION  InitProgram ()
	'Set global picture spot and size
	#Picture$ = "map20.BMP"
	XgrLoadImage(#Picture$, @#image[])
	XgrGetImageArrayInfo(@#image[], @bbp, @#pwidth, @#pheight)

END FUNCTION
'
'
' ##############################
' #####  CreateWindows ()  #####
' ##############################
'
' GuiDesigner puts code in CreateWindows() to create, initialize, display
' every window you design graphically.  Don't modify this function unless
' absolutely necessary - GuiDesigner needs to read and update it at times.
'
' CreateWindows() usually should not be executed when compiled as library.
' Start CreateWindows() with "IF LIBRARY(0) THEN RETURN" to assure this.
'
FUNCTION  CreateWindows ()
'
	IF LIBRARY(0) THEN RETURN
'
	Pictureshifter (@Pictureshifter, #CreateWindow, 0, 0, 0, 0, 0, 0)
	XuiSendMessage ( Pictureshifter, #SetCallback, Pictureshifter, &PictureshifterCode(), -1, -1, -1, 0)
	XuiSendMessage ( Pictureshifter, #Initialize, 0, 0, 0, 0, 0, 0)
	XuiSendMessage ( Pictureshifter, #SetGridProperties, -1, 0, 0, 0, 0, 0)
	XuiSendMessage ( Pictureshifter, #SetImage, 0, 0, 0, 0, 1, @#Picture$)
	XuiSendMessage ( Pictureshifter, #SetImageCoords, 0, 0, #pwidth, #pheight, 1, Picture$)
	XuiSendMessage ( Pictureshifter, #DisplayWindow, 0, 0, 0, 0, 0, 0)

	'Set Global image grid to run.
	#GenGrid = Pictureshifter
END FUNCTION
'
'
' ############################
' #####  InitWindows ()  #####
' ############################
'
' Add code to this function to initialize anything your program needs
' to initialize after CreateWindows() creates your programs windows.
' For initialization before CreateWindows(), add code to InitProgram().
'
' Do not delete this function, leave it empty if not needed.
'
FUNCTION  InitWindows ()
	UBYTE gridimage[]
	XgrSetCEO(&PictureshifterCode())

	'Display null spot coordinates
	lbx$ = "0"
	lby$ = "0"
	XuiSendMessage (#GenGrid, #SetTextString, 0, 0, 0, 0, 2, lbx$)
	XuiSendMessage (#GenGrid, #SetTextString, 0, 0, 0, 0, 5, lby$)
	XuiSendMessage (#GenGrid, #RedrawGrid, 5, 5, 58, 14, 2, 0)
	XuiSendMessage (#GenGrid, #RedrawGrid, 5, 5, 58, 14, 5, 0)

	'Get the frame size properties of the image's parent grid
	XuiSendMessage (#GenGrid, #GetGridNumber, @mgrid, 0, 0, 0, 1, 0)
	XgrGetImage (mgrid,@gridimage[])
	XgrGetImageArrayInfo(@gridimage[], @bbp, @#gwidth, @#gheight)

END FUNCTION
'
'
'	###############################
'	#####  Pictureshifter ()  #####
'	###############################
'
'	"Anatomy of Grid Functions" in the GuiDesigner Programmer Guide
'	describes the operation and modification of grid functions in detail.
'
'	WindowFromFunction and/or WindowToFunction may not work, or may not generate the desired results if you:
'		* Modify the kid constant definition improperly.
'		* Modify the code in the Create subroutine improperly.
'		* Imbed blank or comment lines in the Create subroutine.
'		* Remove the GOSUB Resize line in the Create subroutine (comment out is okay).
'		* Imbed special purpose code in the Create subroutine before the GOSUB Resize line.
'		* Delete any of the four lines that assign values to designX, designY, designWidth, designHeight.
'
FUNCTION  Pictureshifter (grid, message, v0, v1, v2, v3, r0, (r1, r1$, r1[], r1$[]))
	STATIC  designX,  designY,  designWidth,  designHeight
	STATIC  SUBADDR  sub[]
	STATIC  upperMessage
	STATIC  Pictureshifter
'
	$Pictureshifter  =   0  ' kid   0 grid type = Pictureshifter
	$LBPictureArea   =   1  ' kid   1 grid type = XuiLabel
	$LBX             =   2  ' kid   2 grid type = XuiLabel
	$LBX2            =   3  ' kid   3 grid type = XuiLabel
	$LBXdif          =   4  ' kid   4 grid type = XuiLabel
	$LBY             =   5  ' kid   5 grid type = XuiLabel
	$LBY2            =   6  ' kid   6 grid type = XuiLabel
	$LBYdif          =   7  ' kid   7 grid type = XuiLabel
	$XuiLabel726     =   8  ' kid   8 grid type = XuiLabel
	$XuiLabel727     =   9  ' kid   9 grid type = XuiLabel
	$XuiLabel728     =  10  ' kid  10 grid type = XuiLabel
	$XuiLabel729     =  11  ' kid  11 grid type = XuiLabel
	$XuiLabel730     =  12  ' kid  12 grid type = XuiLabel
	$XuiLabel731     =  13  ' kid  13 grid type = XuiLabel
	$UpperKid        =  13  ' kid maximum
'
'
	IFZ sub[] THEN GOSUB Initialize
'	XuiReportMessage (grid, message, v0, v1, v2, v3, r0, r1)
	IF XuiProcessMessage (grid, message, @v0, @v1, @v2, @v3, @r0, @r1, Pictureshifter) THEN RETURN
	IF (message <= upperMessage) THEN GOSUB @sub[message]
	RETURN
'
'
' *****  Callback  *****  message = Callback : r1 = original message
'
SUB Callback
	message = r1
	callback = message
	IF (message <= upperMessage) THEN GOSUB @sub[message]
END SUB
'
'
' *****  Create  *****  v0123 = xywh : r0 = window : r1 = parent
'
SUB Create
	IF (v0 <= 0) THEN v0 = 0
	IF (v1 <= 0) THEN v1 = 0
	IF (v2 <= 0) THEN v2 = designWidth
	IF (v3 <= 0) THEN v3 = designHeight
	XuiCreateGrid  (@grid, Pictureshifter, @v0, @v1, @v2, @v3, r0, r1, &Pictureshifter())
	XuiSendMessage ( grid, #SetGridName, 0, 0, 0, 0, 0, @"Pictureshifter")
	XuiLabel       (@g, #Create, 0, 0, 372, 220, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $LBPictureArea, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"LBPictureArea")
	XuiSendMessage ( g, #SetBorder, $$BorderLower1, $$BorderLower1, $$BorderNone, 0, 0, 0)
	XuiLabel       (@g, #Create, 48, 228, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $LBX, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"LBX")
	XuiLabel       (@g, #Create, 48, 248, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $LBX2, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"LBX2")
	XuiLabel       (@g, #Create, 48, 268, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $LBXdif, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"LBXdif")
	XuiLabel       (@g, #Create, 192, 228, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $LBY, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"LBY")
	XuiLabel       (@g, #Create, 192, 248, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $LBY2, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"LBY2")
	XuiLabel       (@g, #Create, 192, 268, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $LBYdif, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"LBYdif")
	XuiLabel       (@g, #Create, 120, 228, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $XuiLabel726, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"XuiLabel726")
	XuiSendMessage ( g, #SetBorder, $$BorderNone, $$BorderNone, $$BorderNone, 0, 0, 0)
	XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Y")
	XuiLabel       (@g, #Create, 120, 268, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $XuiLabel727, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"XuiLabel727")
	XuiSendMessage ( g, #SetBorder, $$BorderNone, $$BorderNone, $$BorderNone, 0, 0, 0)
	XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Ydif")
	XuiLabel       (@g, #Create, 120, 248, 72, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $XuiLabel728, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"XuiLabel728")
	XuiSendMessage ( g, #SetBorder, $$BorderNone, $$BorderNone, $$BorderNone, 0, 0, 0)
	XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Y2")
	XuiLabel       (@g, #Create, 0, 228, 48, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $XuiLabel729, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"XuiLabel729")
	XuiSendMessage ( g, #SetBorder, $$BorderNone, $$BorderNone, $$BorderNone, 0, 0, 0)
	XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"X")
	XuiLabel       (@g, #Create, 0, 248, 48, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $XuiLabel730, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"XuiLabel730")
	XuiSendMessage ( g, #SetBorder, $$BorderNone, $$BorderNone, $$BorderNone, 0, 0, 0)
	XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"X2")
	XuiLabel       (@g, #Create, 0, 268, 48, 20, r0, grid)
	XuiSendMessage ( g, #SetCallback, grid, &Pictureshifter(), -1, -1, $XuiLabel731, grid)
	XuiSendMessage ( g, #SetGridName, 0, 0, 0, 0, 0, @"XuiLabel731")
	XuiSendMessage ( g, #SetBorder, $$BorderNone, $$BorderNone, $$BorderNone, 0, 0, 0)
	XuiSendMessage ( g, #SetTextString, 0, 0, 0, 0, 0, @"Xdif")
	GOSUB Resize
END SUB
'
'
' *****  CreateWindow  *****  v0123 = xywh : r0 = windowType : r1$ = display$
'
SUB CreateWindow
	IF (v0 == 0) THEN v0 = designX
	IF (v1 == 0) THEN v1 = designY
	IF (v2 <= 0) THEN v2 = designWidth
	IF (v3 <= 0) THEN v3 = designHeight
	XuiWindow (@window, #WindowCreate, v0, v1, v2, v3, r0, @r1$)
	v0 = 0 : v1 = 0 : r0 = window : ATTACH r1$ TO display$
	GOSUB Create
	r1 = 0 : ATTACH display$ TO r1$
	XuiWindow (window, #WindowRegister, grid, -1, v2, v3, @r0, @"Pictureshifter")
END SUB
'
'
' *****  GetSmallestSize  *****  see "Anatomy of Grid Functions"
'
SUB GetSmallestSize
END SUB
'
'
' *****  Redrawn  *****  see "Anatomy of Grid Functions"
'
SUB Redrawn
	XuiCallback (grid, #Redrawn, v0, v1, v2, v3, r0, r1)
END SUB
'
'
' *****  Resize  *****  see "Anatomy of Grid Functions"
'
SUB Resize
END SUB
'
'
' *****  Selection  *****  see "Anatomy of Grid Functions"
'
SUB Selection
END SUB
'
'
' *****  Initialize  *****  see "Anatomy of Grid Functions"
'
SUB Initialize
	XuiGetDefaultMessageFuncArray (@func[])
	XgrMessageNameToNumber (@"LastMessage", @upperMessage)
'
	func[#Callback]           = &XuiCallback ()               ' disable to handle Callback messages internally
' func[#GetSmallestSize]    = 0                             ' enable to add internal GetSmallestSize routine
' func[#Resize]             = 0                             ' enable to add internal Resize routine
'
	DIM sub[upperMessage]
'	sub[#Callback]            = SUBADDRESS (Callback)         ' enable to handle Callback messages internally
	sub[#Create]              = SUBADDRESS (Create)           ' must be subroutine in this function
	sub[#CreateWindow]        = SUBADDRESS (CreateWindow)     ' must be subroutine in this function
'	sub[#GetSmallestSize]     = SUBADDRESS (GetSmallestSize)  ' enable to add internal GetSmallestSize routine
	sub[#Redrawn]             = SUBADDRESS (Redrawn)          ' generate #Redrawn callback if appropriate
'	sub[#Resize]              = SUBADDRESS (Resize)           ' enable to add internal Resize routine
	sub[#Selection]           = SUBADDRESS (Selection)        ' routes Selection callbacks to subroutine
'
	IF sub[0] THEN PRINT "Pictureshifter() : Initialize : error ::: (undefined message)"
	IF func[0] THEN PRINT "Pictureshifter() : Initialize : error ::: (undefined message)"
	XuiRegisterGridType (@Pictureshifter, "Pictureshifter", &Pictureshifter(), @func[], @sub[])
'
' Don't remove the following 4 lines, or WindowFromFunction/WindowToFunction will not work
'
	designX = 388
	designY = 146
	designWidth = 372
	designHeight = 304
'
	gridType = Pictureshifter
	XuiSetGridTypeProperty (gridType, @"x",                designX)
	XuiSetGridTypeProperty (gridType, @"y",                designY)
	XuiSetGridTypeProperty (gridType, @"width",            designWidth)
	XuiSetGridTypeProperty (gridType, @"height",           designHeight)
	XuiSetGridTypeProperty (gridType, @"maxWidth",         designWidth)
	XuiSetGridTypeProperty (gridType, @"maxHeight",        designHeight)
	XuiSetGridTypeProperty (gridType, @"minWidth",         designWidth)
	XuiSetGridTypeProperty (gridType, @"minHeight",        designHeight)
	XuiSetGridTypeProperty (gridType, @"can",              $$Callback)
	IFZ message THEN RETURN
END SUB
END FUNCTION
'
'
' ###################################
' #####  PictureshifterCode ()  #####
' ###################################
'
'
'	This small program demonstrates how you can use mouse coordinates
' to shuffle with images on a label - grid.
'
' I was just fiddling around to have some usefull code for my own
' application, i think others might have use of this basics too.
'
'	May 6th 2000
' Vincent Voois
'
FUNCTION  PictureshifterCode (grid, message, v0, v1, v2, v3, kid, r1)
'
	$Pictureshifter  =   0  ' kid   0 grid type = Pictureshifter
	$LBPictureArea   =   1  ' kid   1 grid type = XuiLabel
	$LBX             =   2  ' kid   2 grid type = XuiLabel
	$LBX2            =   3  ' kid   3 grid type = XuiLabel
	$LBXdif          =   4  ' kid   4 grid type = XuiLabel
	$LBY             =   5  ' kid   5 grid type = XuiLabel
	$LBY2            =   6  ' kid   6 grid type = XuiLabel
	$LBYdif          =   7  ' kid   7 grid type = XuiLabel
	$XuiLabel726     =   8  ' kid   8 grid type = XuiLabel
	$XuiLabel727     =   9  ' kid   9 grid type = XuiLabel
	$XuiLabel728     =  10  ' kid  10 grid type = XuiLabel
	$XuiLabel729     =  11  ' kid  11 grid type = XuiLabel
	$XuiLabel730     =  12  ' kid  12 grid type = XuiLabel
	$XuiLabel731     =  13  ' kid  13 grid type = XuiLabel
	$UpperKid        =  13  ' kid maximum
	UBYTE gridimage[]
	STATIC GraphicGrid, I, oldCursor
'
'	XuiReportMessage (grid, message, v0, v1, v2, v3, kid, r1)
	IF (message = #Callback) THEN message = r1
	GOSUB Initialize
'
	SELECT CASE message
		CASE #CloseWindow	:	QUIT(0)
		CASE #WindowMouseDown	:	GOSUB MouseDown
		CASE #WindowMouseDrag	:	GOSUB MouseDrag
		CASE #WindowMouseEnter	:	GOSUB MouseEnterEvent
		CASE #WindowMouseExit	:	GOSUB MouseExitEvent
		CASE #WindowMouseUp	:	#DragReady = $$FALSE
		CASE #WindowMouseMove :	GOSUB MouseMove
	END SELECT
	RETURN

SUB Initialize

' XuiGetGridNumber() gets the grid number for kid $LBPictureArea as follows:

	XuiSendMessage (grid, #GetGridNumber, @GraphicGrid, 0, 0, 0, $LBPictureArea, 0)

END SUB
' ***** MouseEnterEvent *****
SUB MouseEnterEvent
'check if mouse is inside labelArea grid
	XgrGetMouseInfo ( @window, @mgrid, @xWin, @yWin, @state, @time )
	XuiSendMessage (#GenGrid, #GetGridNumber, @kidgrid, 0, 0, 0, 1, 0)
	XuiSendMessage (#GenGrid, #GetGridNumber, @maingridpart, 0, 0, 0, 3, 0)


'Change cursor to "Crosshair" style if the translated gridnumber matches the current
'mouse-focussed gridnumber
	SELECT CASE mgrid
		CASE kidgrid
			#InArea = $$TRUE

'		XuiSendMessage (mgrid, #GetCursor, @oldCursor, 0, 0, 0, 0, 0)

'Don't change it while Dragmode is still on!
			IF #DragReady == $$FALSE THEN
				XuiSendMessage (mgrid, #SetCursor, #cursorCrosshair, 0, 0, 0, 0, 0)
			END IF
		CASE #GenGrid, maingridpart
			#DragWindowArea = $$TRUE
			IF #DragReady == $$FALSE THEN
				XuiSendMessage (mgrid, #SetCursor, 9, 0, 0, 0, 0, 0)
			END IF

	END SELECT

END SUB
' ***** MouseExitEvent *****
SUB MouseExitEvent

'check if mouse is inside labelArea grid
	XgrGetMouseInfo ( @window, @mgrid, @xWin, @yWin, @state, @time )

'Get kid grid number of the focus-grid
	XuiSendMessage( #GenGrid, #GetGridNumber, @kidgrid, 0, 0, 0, 1, 0)

'Change cursor back to default

  IF mgrid <> kidgrid THEN
			#InArea = $$FALSE

'Don't change it while Dragmode is still on!
		IF (#DragReady == $$FALSE) THEN
			XuiSendMessage (kidgrid, #SetCursor, #cursorDefault, 0, 0, 0, 0, 0)
		END IF

	END IF

	XuiSendMessage (#GenGrid, #GetGridNumber, @maingridpart, 0, 0, 0, 3, 0)

  IF (mgrid <> maingridpart) AND (mgrid <> #GenGrid) THEN
			#DragWindowArea = $$FALSE

'Don't change it while Dragmode is still on!
		IF (#DragReady == $$FALSE) THEN
			XuiSendMessage (kidgrid, #SetCursor, #cursorDefault, 0, 0, 0, 0, 0)
		END IF

	END IF

END SUB
SUB MouseDown
	'If mousepointer is in the label grid
	SELECT CASE $$TRUE
		CASE #InArea
			XgrGetMouseInfo ( @window, @mgrid, @xWin, @yWin, @state, @time )

			'Get the image location and area cover
			XuiSendMessage (mgrid, #GetImage, @img,0,@xind,@yind,0,0)
			XuiSendMessage (mgrid, #GetImageCoords, @iv0,@iv1,@iv2,@iv3,0,0)

			'If the mousepointer is within the image area, enable dragmode
			IF (xWin >= (iv0+xind)) AND (xWin <= (iv2+xind)) AND (yWin >= (iv1+yind)) AND (yWin <= (iv3+yind)) AND (#DragReady == $$FALSE) THEN
				XgrGetMouseInfo ( @window, @mgrid, @xPin, @yPin, @state, @time )
				XuiSendMessage (mgrid, #GetImage, @img,0,@xind,@yind,0,0)

				'Determine the distance between mousepointer and image offset
				#xpPin = xPin - xind
				#ypPin = yPin - yind

				#DragReady = $$TRUE
			ELSE
				#DragReady = $$FALSE
			END IF

		CASE #DragWindowArea
			IF #DragReady == $$FALSE THEN
				'	Spike the current cursor position
				XgrGetMouseInfo ( @window, @mgrid, @#xPin, @#yPin, @state, @time )

				#DragReady = $$TRUE
			END IF


	END SELECT

END SUB
SUB MouseDrag
	'If the mousepointer is in the coordinate area where the image is or the window frame area
	'then drag it.

	IF (#DragReady == $$TRUE) THEN
		SELECT CASE $$TRUE

			CASE #InArea
				XgrGetMouseInfo ( @window, @mgrid, @xWin, @yWin, @state, @time )

				'Mouse button is not being pushed anymore, you can stop dragging the picture.
				IFZ state THEN
					#DragReady = $$FALSE

					EXIT SUB
				ENDIF

				'Get offset coordinates of the current image position
				XuiSendMessage (mgrid, #GetImage, @img,0,@xind,@yind,0,0)

				'Determine relative offsets and display them in the boxes
				lbx$ = STRING(xind - (#gwidth / 2) + (#pwidth / 2))
				lby$ = STRING(yind - (#gheight / 2) + (#pheight/ 2))
				#ltx = XLONG(lbx$)
				#lty = XLONG(lby$)
				XuiSendMessage (#GenGrid, #SetTextString, 0, 0, 0, 0, $LBX2, lbx$)
				XuiSendMessage (#GenGrid, #SetTextString, 0, 0, 0, 0, $LBY2, lby$)

				'As long as the mousepointer is within the grid-frame, drag the image
				IF (xWin >= 0) AND (xWin <= #gwidth) AND (yWin >= 0) AND (yWin <= #gheight) THEN
					'Keep the distance between mousepointer and image offset steady
					Xpdif = xWin - #xpPin
					Ypdif = yWin - #ypPin
					XDif$ = STRING(Xpdif)
					YDif$ = STRING(Ypdif)

					'Move the image to the relative new coordinates within the target grid


					'Move the image to the new coordinates within the window
					XuiSendMessage (#GenGrid, #SetImage, 0, 0, Xpdif, Ypdif, 1, @#Picture$)
					XuiSendMessage (#GenGrid, #SetImageCoords, 0, 0, #pwidth, #pheight, 1,0)
					XuiSendMessage (#GenGrid, #SetTextString, 0, 0, 0, 0, $LBXdif, XDif$)
					XuiSendMessage (#GenGrid, #SetTextString, 0, 0, 0, 0, $LBYdif, YDif$)
					XuiSendMessage (#GenGrid, #RedrawGrid, 1, 1, 370, 218, 1, 0)
					XuiSendMessage (#GenGrid, #RedrawGrid, 3, 3, 58, 14, $LBX2, 0)
					XuiSendMessage (#GenGrid, #RedrawGrid, 3, 3, 58, 14, $LBY2, 0)
					XuiSendMessage (#GenGrid, #RedrawGrid, 3, 3, 58, 14, $LBXdif, 0)
					XuiSendMessage (#GenGrid, #RedrawGrid, 3, 3, 58, 14, $LBYdif, 0)
				END IF

			CASE #DragWindowArea
				XgrGetMouseInfo ( @window, @mgrid, @xWin, @yWin, @state, @time )
				'Mouse button is not being pushed anymore, you can stop dragging the window.
				IFZ state THEN
					#DragReady = $$FALSE

					EXIT SUB
				ENDIF

				'As long as
				'Get current position
				XgrGetWindowPositionAndSize ( window, @xaDisp, @yaDisp, @width, @height )
				Xdif = xaDisp + (xWin - #xPin)
				Ydif = yaDisp + (yWin - #yPin)
				'Set new position
				XgrSetWindowPositionAndSize ( window, Xdif, Ydif, -1, -1 )


		END SELECT

	END IF
END SUB
SUB MouseMove
	'This routine changes the mousepointer shape depending browsing across what area
	'In this case, it gets the sizes of the picture and location and as soon as the pointer is
	'within the picture area, the mousepointer changes.

	IF #InArea == $$TRUE THEN
		XgrGetMouseInfo ( @window, @mgrid, @xWin, @yWin, @state, @time )
		'Get the image location and area cover
		XuiSendMessage (mgrid, #GetImage, @img,0,@xind,@yind,0,0)
		XuiSendMessage (mgrid, #GetImageCoords, @iv0,@iv1,@iv2,@iv3,0,0)

		'If the mousepointer is within the image area, enable dragmode
		IF (xWin >= (iv0+xind)) AND (xWin <= (iv2+xind)) AND (yWin >= (iv1+yind)) AND (yWin <= (iv3+yind)) THEN
			XuiSendMessage (mgrid, #GetCursor, @mcursor, 0, 0, 0, 0, 0)

			IF mcursor <> 9 THEN
				'Both lines below seem to be a double up, but it's required to have the
				'cursor really changed!
				XgrSetCursor (9, @oldy)
				XuiSendMessage (mgrid, #SetCursor, 9, 0, 0, 0, 0, 0)
			END IF

		ELSE
			XuiSendMessage (mgrid, #GetCursor, @mcursor, 0, 0, 0, 0, 0)

			IF mcursor <> #cursorCrosshair THEN
				'Both lines below seem to be a double up, but it's required to have the
				'cursor really changed!
				XgrSetCursor (#cursorCrosshair, @oldy)
				XuiSendMessage (mgrid, #SetCursor, #cursorCrosshair, 0, 0, 0, 0, 0)
			END IF

		END IF

	END IF

END SUB


END FUNCTION
END PROGRAM

