MaxGUI and Reflection

BlitzMax Forums/BlitzMax GUI Programming/MaxGUI and Reflection

I was rummaging through my programming folders today, and found this that I was working on last summer...

SuperStrict

Import MaxGUI.Drivers

'Create a new TGUIApplication object
Local tmpApplication:TGUIApplication = New TMyApplication.Initialize( "My Application", "SebHoll", "0.1" )
If Not tmpApplication Then RuntimeError "GUI Application Could Not Start!"

'Add a new window to the application
New TMainWindow.Initialize( tmpApplication )

'And let the application run!
Repeat;WaitSystem();Forever

' Type declarations

Type TMyApplication Extends TGUIApplication
	
EndType

Type TMainWindow Extends TGUIWindow
	
	Field wndMain:TGadget = CreateWindow(AppTitle,100,100,400,300,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
		Field btnPush:TGadget = CreateButton("Push Button",10,10,ClientWidth(wndMain)-20,30,wndMain,BUTTON_PUSH)
		
	Method ButtonClick:TEvent( pEvent:TEvent ) {GadgetClass="GADGET_BUTTON" Operator="OR"}
		Print "Button Event"
	EndMethod
	
	Method WindowEvent:TEvent( pEvent:TEvent ) {GadgetClass="GADGET_WINDOW" Operator="AND"}
		Print "Window Event"
	EndMethod
	
	Method WindowEventByName:TEvent( pEvent:TEvent ) {GadgetSource="wndMain" Operator="AND"}
		Print "wndMain event"
	EndMethod
	
EndType


' Application Framework

Type TGUIApplication Abstract
	
	Field strName$ = "Test Application"
	Field strAuthor$ = "MaxGUI Owner"
	Field strVersion$ = "1.0"
	
	Field lstWindows:TList = New TList
	
	Method Initialize:TGUIApplication( pName$, pAuthor$, pVersion$ )
		strName = pName;AppTitle = strName
		strAuthor = pAuthor
		strVersion = pVersion
		Return Self
	EndMethod
	
	Method New()
		AddHook EmitEventHook, eventHandler, Self
	EndMethod
	
	Function eventHandler:Object( pID%, pData:Object, pContext:Object )
		Local pEvent:TEvent = TEvent(pData), pApplication:TGUIApplication = TGUIApplication(pContext)
		If Not (pEvent And pApplication) Then Return pData
		For Local tmpWindow:TGUIWindow = EachIn pApplication.lstWindows
			tmpWindow.ProcessFieldsForGadgetEvents( pEvent )
		Next
	EndFunction
	
EndType

Type TGUIWindow Abstract
	
	Const strOperatorMetaName$ = "Operator"
	Const strClassMetaName$ = "GadgetClass"
	Const strSourceMetaName$ = "GadgetSource"
	
	
	Field application:TGUIApplication
	
	Method Initialize:TGUIWindow( pApplication:TGUIApplication )
		application = pApplication
		application.lstWindows.AddLast Self
		Return Self
	EndMethod
	
	Method ProcessFieldsForGadgetEvents:TEvent( pEvent:TEvent )
		Local pGadget:TGadget = TGadget(pEvent.source)
		For Local tmpField:TField = EachIn TTypeId.ForObject(Self).EnumFields()
			If tmpField.Get(Self) = pGadget Then pEvent = CallEventMethodsForGadgetName( tmpField.Name(), pEvent )
			If Not pEvent Then Return pEvent
		Next
		Return pEvent
	EndMethod
	
	Method CallEventMethodsForGadgetName:TEvent( pGadgetName$, pEvent:TEvent )
		Local pGadgetClass$ = ReverseClassLookup(GadgetClass(TGadget(pEvent.source)))
		#CallEventMethodsLoop
		For Local tmpMethod:TMethod = EachIn TTypeId.ForObject(Self).EnumMethods()
			Select tmpMethod.MetaData(strOperatorMetaName)
				Case "AND"
					Local tmpNoMatch% = 0
					If tmpMethod.MetaData(strSourceMetaName) Then tmpNoMatch:-1
					For Local tmpGadgetName$ = EachIn tmpMethod.MetaData(strSourceMetaName).Replace(" ","").Split(",")
						If pGadgetName = tmpGadgetName Then tmpNoMatch:+1;Exit
					Next
					If tmpMethod.MetaData(strClassMetaName) Then tmpNoMatch:-1
					For Local tmpGadgetClass$ = EachIn tmpMethod.MetaData(strClassMetaName).Replace(" ","").Split(",")
						If pGadgetClass = tmpGadgetClass Then tmpNoMatch:+1;Exit
					Next
					If Not tmpNoMatch Then
						tmpMethod.Invoke( Self, [pEvent] )
					EndIf
					
				Case "OR"
					For Local tmpGadgetName$ = EachIn tmpMethod.MetaData(strSourceMetaName).Replace(" ","").Split(",")
						If pGadgetName = tmpGadgetName Then 
							tmpMethod.Invoke( Self, [pEvent] );Continue CallEventMethodsLoop
						EndIf
					Next
					For Local tmpGadgetClass$ = EachIn tmpMethod.MetaData(strClassMetaName).Replace(" ","").Split(",")
						If pGadgetClass = tmpGadgetClass Then 
							tmpMethod.Invoke( Self, [pEvent] )
						EndIf
					Next
			EndSelect
		Next
		Return pEvent
	EndMethod
	
	Function ReverseClassLookup$(pGadgetClass%)
		Select pGadgetClass
			Case GADGET_DESKTOP;Return "GADGET_DESKTOP"
			Case GADGET_WINDOW;Return "GADGET_WINDOW"
			Case GADGET_BUTTON;Return "GADGET_BUTTON"
			Case GADGET_PANEL;Return "GADGET_PANEL"
			Case GADGET_TEXTFIELD;Return "GADGET_TEXTFIELD"
			Case GADGET_TEXTAREA;Return "GADGET_TEXTAREA"
			Case GADGET_COMBOBOX;Return "GADGET_COMBOBOX"
			Case GADGET_LISTBOX;Return "GADGET_LISTBOX"
			Case GADGET_TOOLBAR;Return "GADGET_TOOLBAR"
			Case GADGET_TABBER;Return "GADGET_TABBER"
			Case GADGET_TREEVIEW;Return "GADGET_TREEVIEW"
			Case GADGET_HTMLVIEW;Return "GADGET_HTMLVIEW"
			Case GADGET_LABEL;Return "GADGET_LABEL"
			Case GADGET_SLIDER;Return "GADGET_SLIDER"
			Case GADGET_PROGBAR;Return "GADGET_PROGBAR"
			Case GADGET_MENUITEM;Return "GADGET_MENUITEM"
			Case GADGET_NODE;Return "GADGET_NODE"
			Case GADGET_CANVAS;Return "GADGET_CANVAS"
			Case GADGET_TIMER;Return "GADGET_TIMER"
		EndSelect
	EndFunction
	
EndType


Kinda cool, huh?

what does it do?

Interesting.