$OPTIMIZE ON
$TYPECHECK ON
$INCLUDE "RapidQ.inc"

'Constants
CONST GRID_WIDTH = 6
CONST GRID_HEIGHT = 7
CONST KEY_DOWN = 40
CONST KEY_UP = 38

'API Calls
DECLARE FUNCTION SetFocus LIB "User32" ALIAS "SetFocus"(hwnd AS LONG) AS LONG
DECLARE FUNCTION GetFocus LIB "User32" ALIAS "GetFocus" AS LONG

'Events
DECLARE SUB DataGridOnKeyDown(key AS WORD, shift AS INTEGER)

'Helper Functions
DECLARE SUB Initalize
DECLARE SUB MoveFocusDown(i AS INTEGER, j AS INTEGER)
DECLARE SUB MoveFocusUp(i AS INTEGER, j AS INTEGER)


DIM DataGrid(GRID_WIDTH, 7) AS QEDIT
CREATE MainForm AS QFORM
	Width = 1000
	Height = 750
END CREATE
Initalize()

MainForm.ShowModal

FUNCTION DataGridOnKeyDown(key AS WORD, shift AS INTEGER)
	DIM hwnd AS LONG
	DEFINT i, j

	IF (key = KEY_DOWN OR key = KEY_UP) THEN
    	hwnd = GetFocus()
    
    	FOR i = 0 TO GRID_WIDTH - 1
    		FOR j = 0 TO GRID_HEIGHT - 1
    			IF (DataGrid(i, j).Handle = hwnd) THEN
					IF (key = KEY_DOWN) THEN
						MoveFocusDown(i, j)
					ELSE
						MoveFocusUp(i, j)
					END IF
    				EXIT FUNCTION
    			END IF
    		NEXT j
    	NEXT i
    
    	SetFocus(DataGrid(0, 0).Handle) 'Default Case; shouldn't get here
	END IF
END FUNCTION

SUB Initalize
DEFINT i, j
    FOR i = 0 TO GRID_WIDTH - 1
    	FOR j = 0 TO GRID_HEIGHT - 1
    		DataGrid(i, j).Parent = MainForm
    		DataGrid(i, j).Text = "(" + STR$(i) + ", " + STR$(j) + ")"
    		DataGrid(i, j).Left = (MainForm.ClientWidth / GRID_WIDTH) * i + 5
    		DataGrid(i, j).Top = (MainForm.ClientHeight / GRID_HEIGHT) * j + 5
    		DataGrid(i, j).OnKeyDown = DataGridOnKeyDown
    	NEXT j
    NEXT i
END SUB

SUB MoveFocusDown(i AS INTEGER, j AS INTEGER)
	INC(j)
    IF (j = GRID_HEIGHT) THEN
		j = 0
		INC(i)
		IF (i = GRID_WIDTH) THEN
			i = 0
		END IF
	END IF

	SetFocus(DataGrid(i, j).Handle)
END SUB

SUB MoveFocusUp(i AS INTEGER, j AS INTEGER)
	DEC(j)
    IF (j = -1) THEN
		j = GRID_HEIGHT - 1
		DEC(i)
		IF (i = -1) THEN
			i = GRID_WIDTH - 1
		END IF
	END IF

	SetFocus(DataGrid(i, j).Handle)
END SUB