I was rummaging through my programming folders today, and found this that I was working on last summer...
Kinda cool, huh?
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?