Code archives/BlitzPlus Gui/Gadget Tabber

This code has been declared by its author to be Public Domain code.

Download source code

Gadget Tabber by Mr Brine2004
See the code!

thanx to Soja for info on getfocus()
; (c)oded by Mr Brine
;
; Press tab/shift tab to iterate through the os objects
;
;
; User Libs
; =========
; 
; .lib "user32.dll"
;
; GetFocus():"GetFocus"
;


test()


Function Test()

	; create some test data

	win = CreateWindow("tab test", 100, 100, 300, 300, 0)
	
	tf = CreateTextField(0, 0, 100, 22, win)
	ta = CreateTextArea(0, 30, 100, 70, win)
	lb = CreateListBox(0, 110, 100, 100, win)
	AddGadgetItem lb, "1", True
	AddGadgetItem lb, "2"
	AddGadgetItem lb, "3"
	AddGadgetItem lb, "4"
	bt = CreateButton("button", 110,  0, 100, 22, win)
	cb = CreateButton("check", 110, 30, 100, 22, win, 2)
	rd = CreateButton("radio", 110, 60, 100, 22, win, 3)
	tv = CreateTreeView(110, 90, 100, 100, win)
	
	t = AddTreeViewNode("1", TreeViewRoot(tv))
	AddTreeViewNode("1-1", t)
	AddTreeViewNode("1-2", t)	
	AddTreeViewNode("1-3", t)	
			
	; add gadgets to tab list
			
	tablist = Tab_Add(0, tf)
	tablist = Tab_Add(tablist, ta)
	tablist = Tab_Add(tablist, lb)			
	tablist = Tab_Add(tablist, bt)
	tablist = Tab_Add(tablist, cb)
	tablist = Tab_Add(tablist, rd)
	tablist = Tab_Add(tablist, tv)
				
	; set up hot key events to scan for 'tab' & 'shift-tab'			
	; the event id's for the hotkeys can be any value	

	HotKeyEvent 15, 0, $8888
	HotKeyEvent 15, 1, $8889
	
	Repeat
	
		WaitEvent()
		
		Select EventID()
		
			Case $8888

				HotKeyEvent 15, 0, $8888	; resinitialise hot key events
				HotKeyEvent 15, 1, $8889
				
				Tab_Process(tablist, 1)		; goto next os object in tab list
				
			Case $8889

				HotKeyEvent 15, 0, $8888	; resinitialise hot key events
				HotKeyEvent 15, 1, $8889
	
				Tab_Process(tablist, -1)	; goto prev os object in tab list
					
			Case $803
			
				Exit
				
		End Select 
	
	Forever

	FreeBank tablist
	FreeGadget win

End Function 




; ----------------------------------------------------------------------------------------------------


; tablist	= tab list (pass 0 if no tablist yet defined)
; oh 		= os object to assign to tablist
;
; returns a pointer to tablist 
;
Function Tab_Add(tablist, oh)
	
	If(oh <> 0)
	
		If(tablist = 0)
		
			tablist = CreateBank(4) 
		
		Else 	
		
			ResizeBank tablist, BankSize(tablist) + 4
			
		
		End If 
		
		PokeInt tablist, BankSize(tablist) - 4, oh
	
	End If 
	
	Return tablist

End Function 




; tablist	- tablist to work from
; dir		- direction tabber to go
;
Function Tab_Process(tablist, dir)

	If(tablist = 0) Return 
	If(BankSize(tablist) = 0) Return 

	Local	lo = 0
	
	While lo < BankSize(tablist)

		If(QueryObject(PeekInt(tablist, lo), 1) = GetFocus()) Exit
		lo = lo + 4
		
	Wend 
	
	If(lo => BankSize(tablist))
	
		lo = 0							; current focus not in tab list
	
	Else
	
		lo = lo + dir * 4				; current focus is in tab list
		
	End If 
	
	While lo < 0
	
		lo = lo + BankSize(tablist)
		
	Wend  
	
	lo = lo Mod BankSize(tablist)

	ActivateGadget PeekInt(tablist, lo)

End Function

Comments

gman2004
works well but i cannot get it to tab past a combobox. the TAB and SHIFT-TAB events dont seem to generate when performed on this gadget. has anyone worked around this problem?


Gabriel2005
It doesn't work in TextAreas either, because it reads the tab and puts that in the TextArea. Heck, the example itself demonstrates this. It's not the author's fault, of course, it just goes to show that BlitzPlus is so horribly inadequate that even workarounds are mostly pointless and half-working is about as good as you can get.


Code Archives Forum