Code archives/Miscellaneous/Type Explorer

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

Download source code

Type Explorer by Zakk2009
This is a short program that makes use of reflection to let you browse through BlitzMax's internal types and view their methods and fields (doesn't tell you what they do though :S).
'type explorer.bmx
'=============================
SuperStrict
Import maxgui.drivers
'===========GADGETS===========
Global window:TGadget = CreateWindow("Type Explorer", 100, 100, 870, 600, , WINDOW_TITLEBAR|WINDOW_CENTER)

Local type_label:TGadget = CreateLabel("Types:", 13, 6, 35, 16, window)
Global type_listbox:TGadget = CreateListBox(13, 25, 200, 540, window)

Local field_label:TGadget = CreateLabel("Fields:", 226, 6, 50, 16, window)
Global field_listbox:TGadget = CreateListBox(226, 25, 200, 540, window)

Local method_label:TGadget = CreateLabel("Methods:", 439, 6, 50, 16, window)
Global method_listbox:TGadget = CreateListBox(439, 25, 200, 540, window)

Local super_label:TGadget = CreateLabel("Super Type:", 652, 6, 120, 16, window)
Global super_listbox:TGadget = CreateListBox(652, 25, 200, 25, window)

Local derives_label:TGadget = CreateLabel("Derived Types:", 652, 56, 120, 16, window)
Global derives_listbox:TGadget = CreateListBox(652, 75, 200, 490, window)

Global quick_scroll:TGadget = CreateTextField(53, 3, 160, 20, window)
'=============================



'============TYPES============
Type TType
	'=============================
	Global list:TList = New TList
	Global map:TMap = New TMap
	'=============================
	Field id:TTypeId
	Field index:Int
	Field name:String
	Field fields:TList
	Field methods:TList
	Field super_type:TType
	Field derived_types:TList
	'=============================
	Function Create:TType(id:TTypeId)
		Local new_type:TType = New TType
		new_type.id = id
		new_type.name = id.Name()
		new_type.GenerateKeys()
		new_type.ListFields()
		new_type.ListMethods()
		Return new_type
	End Function
	'=============================
	Method GenerateKeys()
		Local length:Int = Len(name), key:String, n:Int
		For n=1 To length
			key = Upper( Left(name, n) )
			If Not map.Contains(key)
				map.Insert(key, Self)
			EndIf
		Next
	End Method
	'=============================
	Method ListFields()
		Local fld:TField
		For fld = EachIn id.EnumFields() 
			fields.AddLast(fld)
		Next
	End Method
	'=============================
	Method ListMethods()
		Local meth:TMethod
		For meth = EachIn id.EnumMethods()
			methods.AddLast(meth)
		Next
	End Method
	'=============================
	Method FindSuper()
		Local super_typeid:TTypeId = id.SuperType()
		If super_typeid <> Null
			Local key:String = Upper( super_typeid.Name() )
			super_type = TType( map.ValueForKey(key) )
		EndIf
	End Method
	'=============================
	Method ListDerives()
		Local derived_typeids:TList = id.DerivedTypes(), type_id:TTypeId, derived_type:TType
		For type_id = EachIn derived_typeids
			Local key:String = Upper( type_id.Name() )
			derived_type = TType( map.ValueForKey(key) )
			derived_types.AddLast(derived_type)
		Next
	End Method
	'=============================
	Method New()
		list.AddLast(Self)
		fields = New TList
		methods = New TList
		derived_types = New TList
	End Method
	'=============================
	Method PopulateLists()
		PopulateFieldList(field_listbox)
		PopulateMethodList(method_listbox)
		PopulateSuperList(super_listbox)
		PopulateDerivesList(derives_listbox)
	End Method
	'=============================
	Method PopulateFieldList(listbox:TGadget)
		listbox.Clear()
		Local fld:TField
		For fld = EachIn fields
			Local key:String = Upper( fld.TypeId().Name() )
			Local a_type:TType = TType( map.ValueForKey(key) )
			AddGadgetItem(listbox, fld.Name()+" :"+fld.TypeId().Name(), , , , a_type)
		Next
	End Method
	'=============================
	Method PopulateMethodList(listbox:TGadget)
		listbox.Clear()
		Local meth:TMethod
		For meth = EachIn methods
			Local key:String = Upper( meth.TypeId().Name() )
			Local a_type:TType = TType( map.ValueForKey(key) )
			AddGadgetItem(listbox, meth.Name()+" :"+meth.TypeId().Name(), , , , a_type)
		Next
	End Method
	'=============================
	Method PopulateSuperList(listbox:TGadget)
		listbox.Clear()
		If super_type <> Null
			AddGadgetItem(listbox, super_type.name, , , , super_type)
		EndIf
	End Method
	'=============================
	Method PopulateDerivesList(listbox:TGadget)
		listbox.Clear()
		Local derived_type:TType
		For derived_type = EachIn derived_types
			AddGadgetItem(listbox, derived_type.name, , , , derived_type)
		Next
	End Method
	'=============================
End Type
'=============================





'=======INITIALIZATION========
Initialize()
PopulateTypeList()
'=============================

'==========MAIN LOOP==========
Repeat
	WaitEvent()
	Local event:TEvent = CurrentEvent
	Select event.id
		Case EVENT_GADGETACTION
			Select event.source
				Case type_listbox
					Local a_type:TType = TType(event.extra)
					a_type.PopulateLists()
					SetGadgetText(quick_scroll, a_type.name)
				Case super_listbox, derives_listbox, field_listbox, method_listbox
					Local a_type:TType = TType(event.extra)
					a_type.PopulateLists()
					SetGadgetText(quick_scroll, a_type.name)
					ScrollToType( a_type.name )
				Case quick_scroll
					ScrollToType( GadgetText(quick_scroll) )
				Default
			End Select
		Case EVENT_WINDOWCLOSE
			End
		Default
	End Select
Forever
'=============================





'==========FUNCTIONS==========
Function ScrollToType(name:String)
	name = Upper(name)
	Local a_type:TType = TType( TType.map.ValueForKey(name) )
	If a_type <> Null
		SelectGadgetItem(type_listbox, CountGadgetItems(type_listbox)-1)
		SelectGadgetItem(type_listbox, a_type.index)
		a_type.PopulateLists()
		Return
	EndIf
	field_listbox.Clear()
	method_listbox.Clear()
End Function
'=============================

'=======INIT FUNCTIONS========
Function Initialize()
	Local type_id:TTypeId
	Local new_type:TType
	For type_id = EachIn TTypeId.EnumTypes()
		If type_id.Name() <> "TType"
			new_type = TType.Create(type_id)
		EndIf
	Next
	For new_type = EachIn TType.list
		new_type.FindSuper()
		new_type.ListDerives()
	Next
End Function
'=============================
Function PopulateTypeList()
	Local a_type:TType
	For a_type = EachIn TType.list
		a_type.index = CountGadgetItems(type_listbox)
		AddGadgetItem(type_listbox, a_type.name, , , , a_type)
	Next
End Function
'=============================

Comments

None.

Code Archives Forum