From cadf174debb12e3476a4e34852fa83f333b4da75 Mon Sep 17 00:00:00 2001 From: Ian C Date: Sat, 15 Apr 2006 01:32:12 +0000 Subject: Fixed for 1.18 --- mwidget.mod/mwidget.bmx | 5572 +++++++++++++++++++++++------------------------ 1 file changed, 2786 insertions(+), 2786 deletions(-) diff --git a/mwidget.mod/mwidget.bmx b/mwidget.mod/mwidget.bmx index 738f0eb..397e874 100644 --- a/mwidget.mod/mwidget.bmx +++ b/mwidget.mod/mwidget.bmx @@ -1,2787 +1,2787 @@ -Rem -bbdoc: noddybox.mwidget -about:

Provides a simply class based interface to the MaxGUI. Note that all widgets have create type methods. For these to work correctly with -sub-classes they must be called through a new operation, e.g.

-
-Type MyApp Extends TMWindow
-    Method OnClose(e:TEvent)
-        closed=Confirm("Really quit?")
-    End Method
-End Type
-
-Local window:TMWindow=New MyApp.Create("Test",100,100,640,400)
-MWidgetMainLoop(window)
-
-

-There are two methods of getting events. One is to subclass and override the events, as with the @OnClose() above. The other is to set -function pointers in the matching event lists, @OnCloseEvent in this instance. For instance: -

-
-Function OnClose(o:TMWidget)
-    Local w:TMWindow=TMWindow(o)
-    w.closed=Confirm("Really quit?")
-End Function
-
-Local window:TMWindow=New TMWindow.Create("Test",100,100,640,400)
-window.OnCloseEvent.Add(OnClose)
-MWidgetMainLoop(window)
-
-

-When using the function callback method of capturing events, the parameters to the function are the same as the overridable method with the addition -of the managed widget which is passed in as the first argument. -

-EndRem -Module noddybox.mwidget - -ModuleInfo "Framework: Simple Managed Widget Classes" -ModuleInfo "Copyright: Public Domain" -ModuleInfo "Author: Ian Cowburn" -ModuleInfo "Version: $Revision$" - -' $Id$ - -Strict -Import brl.maxgui -Import brl.linkedlist -Import brl.event -Import brl.timer -Import brl.map -Import brl.filesystem - -Type TMWEventListBase Abstract - Field list:TList - Method New() - list=CreateList() - End Method -End Type - -Type TMWFuncVoid - Field func(w:TMWidget) - Function Create:TMWFuncVoid(func(w:TMWidget)) - Local o:TMWFuncVoid=New TMWFuncVoid - o.func=func - Return o - End Function -End Type - -Type TMWFuncInt - Field func(w:TMWidget, a:Int) - Function Create:TMWFuncInt(func(w:TMWidget, a:Int)) - Local o:TMWFuncInt=New TMWFuncInt - o.func=func - Return o - End Function -End Type - -Type TMWFuncIntInt - Field func(w:TMWidget, a:Int, b:Int) - Function Create:TMWFuncIntInt(func(w:TMWidget, a:Int, b:Int)) - Local o:TMWFuncIntInt=New TMWFuncIntInt - o.func=func - Return o - End Function -End Type - -Type TMWFuncString - Field func(w:TMWidget, a:String) - Function Create:TMWFuncString(func(w:TMWidget, a:String)) - Local o:TMWFuncString=New TMWFuncString - o.func=func - Return o - End Function -End Type - - -Type TMWFuncStringObject - Field func(w:TMWidget, a:String, b:Object) - Function Create:TMWFuncStringObject(func(w:TMWidget, a:String, b:Object)) - Local o:TMWFuncStringObject=New TMWFuncStringObject - o.func=func - Return o - End Function -End Type - - -Rem -bbdoc: Defines an event list for functions that take the parameters (w:TMWidget) -EndRem -Type TMWEventListVoid Extends TMWEventListBase Final - Rem - bbdoc: Adds a callback function. - EndRem - Method Add(func(w:TMWidget)) - list.AddLast(TMWFuncVoid.Create(func)) - End Method - - Rem - bbdoc: Clears all callback functions. - EndRem - Method Clear() - list.Clear() - End Method - - Rem - bbdoc: Removes a callback function. - EndRem - Method Remove(func(w:TMWidget)) - For Local fp:TMWFuncVoid=EachIn list - If fp.func=func - list.Remove(fp) - Return - EndIf - Next - End Method - - Method Fire(w:TMWidget) - For Local fp:TMWFuncVoid=EachIn list - fp.func(w) - Next - End Method -End Type - - -Rem -bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:Int) -EndRem -Type TMWEventListInt Extends TMWEventListBase Final - Rem - bbdoc: Adds a callback function. - EndRem - Method Add(func(w:TMWidget, a:Int)) - list.AddLast(TMWFuncInt.Create(func)) - End Method - - Rem - bbdoc: Clears all callback functions. - EndRem - Method Clear() - list.Clear() - End Method - - Rem - bbdoc: Removes a callback function. - EndRem - Method Remove(func(w:TMWidget, a:Int)) - For Local fp:TMWFuncInt=EachIn list - If fp.func=func - list.Remove(fp) - Return - EndIf - Next - End Method - - Method Fire(w:TMWidget, a:Int) - For Local fp:TMWFuncInt=EachIn list - fp.func(w,a) - Next - End Method -End Type - - -Rem -bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:String) -EndRem -Type TMWEventListString Extends TMWEventListBase Final - Rem - bbdoc: Adds a callback function. - EndRem - Method Add(func(w:TMWidget, a:String)) - list.AddLast(TMWFuncString.Create(func)) - End Method - - Rem - bbdoc: Clears all callback functions. - EndRem - Method Clear() - list.Clear() - End Method - - Rem - bbdoc: Removes a callback function. - EndRem - Method Remove(func(w:TMWidget, a:String)) - For Local fp:TMWFuncString=EachIn list - If fp.func=func - list.Remove(fp) - Return - EndIf - Next - End Method - - Method Fire(w:TMWidget, a:String) - For Local fp:TMWFuncString=EachIn list - fp.func(w,a) - Next - End Method -End Type - - -Rem -bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:Int, b:Int) -EndRem -Type TMWEventListIntInt Extends TMWEventListBase Final - Rem - bbdoc: Adds a callback function. - EndRem - Method Add(func(w:TMWidget, a:Int, b:Int)) - list.AddLast(TMWFuncIntInt.Create(func)) - End Method - - Rem - bbdoc: Clears all callback functions. - EndRem - Method Clear() - list.Clear() - End Method - - Rem - bbdoc: Removes a callback function. - EndRem - Method Remove(func(w:TMWidget, a:Int, b:Int)) - For Local fp:TMWFuncIntInt=EachIn list - If fp.func=func - list.Remove(fp) - Return - EndIf - Next - End Method - - Method Fire(w:TMWidget, a:Int, b:Int) - For Local fp:TMWFuncIntInt=EachIn list - fp.func(w,a,b) - Next - End Method -End Type - - -Rem -bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:String, b:Object) -EndRem -Type TMWEventListStringObject Extends TMWEventListBase Final - Rem - bbdoc: Adds a callback function. - EndRem - Method Add(func(w:TMWidget, a:String, b:Object)) - list.AddLast(TMWFuncStringObject.Create(func)) - End Method - - Rem - bbdoc: Clears all callback functions. - EndRem - Method Clear() - list.Clear() - End Method - - Rem - bbdoc: Removes a callback function. - EndRem - Method Remove(func(w:TMWidget, a:String, b:Object)) - For Local fp:TMWFuncStringObject=EachIn list - If fp.func=func - list.Remove(fp) - Return - EndIf - Next - End Method - - Method Fire(w:TMWidget, a:String, b:Object) - For Local fp:TMWFuncStringObject=EachIn list - fp.func(w,a,b) - Next - End Method -End Type - - -Rem -bbdoc: Defines a base managed widget type. -EndRem -Type TMWidget Abstract - - Rem - bbdoc: The underlying BlitzMAX GUI Gadget - EndRem - Field gadget:TGadget - - Rem - bbdoc: The parent of this managed widget - EndRem - Field parent:TMWidget - - Rem - bbdoc: Children of this managed widget - EndRem - Field children:TList - - Field typename:String - Field timer:TTimer - - Method Delete() - FreeGadget(gadget) - End Method - - Rem - bbdoc: Handles an event. - about: Sub-classes will generally override this to handle events directed at themselves. - If the event is unhandled then the event should be passed up to the parent type. @e holds the TEvent. - EndRem - Method Handle(e:TEvent) - Select e.id - Case EVENT_MOUSEENTER - OnMouseEnter() - OnMouseEnterEvent.Fire(Self) - Case EVENT_MOUSELEAVE - OnMouseLeave() - OnMouseLeaveEvent.Fire(Self) - Case EVENT_TIMERTICK - OnTimer() - OnTimerEvent.Fire(Self) - End Select - End Method - - Rem - bbdoc: Activate the widget (give it keyboard focus). - EndRem - Method Activate(state:Int) - ActivateGadget(gadget) - End Method - - Rem - bbdoc: Enables/disables a widget. - EndRem - Method Enabled(state:Int) - If state - EnableGadget(gadget) - Else - DisableGadget(gadget) - EndIf - End Method - - Rem - bbdoc: Is widget enabled. - returns: TRUE if enabled. - EndRem - Method IsEnabled:Int() - Return Not GadgetDisabled(gadget) - End Method - - Rem - bbdoc: Hide/show the widget. - EndRem - Method Hidden(state:Int) - If state - HideGadget(gadget) - Else - ShowGadget(gadget) - EndIf - End Method - - Rem - bbdoc: Is widget hidden. - returns: TRUE if hidden. - EndRem - Method IsHidden:Int() - Return GadgetHidden(gadget) - End Method - - Rem - bbdoc: The widget's position. - returns: The widget's X co-ordinate. - EndRem - Method X:Int() - Return GadgetX(gadget) - End Method - - Rem - bbdoc: The widget's position. - returns: The widget's Y co-ordinate. - EndRem - Method Y:Int() - Return GadgetY(gadget) - End Method - - Rem - bbdoc: The widget's size. - returns: The widget's width. - EndRem - Method Width:Int() - Return GadgetWidth(gadget) - End Method - - Rem - bbdoc: The widget's size. - returns: The widget's height. - EndRem - Method Height:Int() - Return GadgetHeight(gadget) - End Method - - Rem - bbdoc: The widget's client size. - returns: The widget's client width. - EndRem - Method Client_Width:Int() - Return ClientWidth(gadget) - End Method - - Rem - bbdoc: The widget's client size. - returns: The widget's client height. - EndRem - Method Client_Height:Int() - Return ClientHeight(gadget) - End Method - - Rem - bbdoc: Set the widget's font. - EndRem - Method Font(font:TGUIFont) - SetGadgetFont(gadget,font) - End Method - - Rem - bbdoc: Set the widgets's layout. See Max GUIs SetGadgetLayout() for details. - EndRem - Method Layout(Left:Int, Right:Int, top:Int, bottom:Int) - SetGadgetLayout(gadget,Left,Right,top,bottom) - End Method - - Rem - bbdoc: Set the widget's position and size. - EndRem - Method SetShape(x:Int, y:Int, width:Int, height:Int) - SetGadgetShape(gadget,x,y,width,height) - End Method - - Rem - bbdoc: Set the widgets's alpha. - EndRem - Method Alpha(a:Double) - SetGadgetAlpha(gadget,a) - End Method - - Rem - bbdoc: Set the widgets's text colour. - EndRem - Method TextColour(r:Int, g:Int, b:Int) - SetGadgetTextColor(gadget,r,g,b) - End Method - - Rem - bbdoc: Set the widgets's background colour. - EndRem - Method BackColour(r:Int, g:Int, b:Int) - SetGadgetColor(gadget,r,g,b) - End Method - - Rem - bbdoc: Set the widgets's text. - EndRem - Method Text(s:String) - SetGadgetText(gadget,s) - End Method - - Rem - bbdoc: Print the widget - EndRem - Method Print() - GadgetPrint(gadget) - End Method - - Rem - bbdoc: Perform a cut on the widget - EndRem - Method Cut() - GadgetCut(gadget) - End Method - - Rem - bbdoc: Perform a copy on the widget - EndRem - Method Copy() - GadgetCopy(gadget) - End Method - - Rem - bbdoc: Perform a paste on the widget - EndRem - Method Paste() - GadgetPaste(gadget) - End Method - - Rem - bbdoc: Allocates a timer for this widget. - about: Create a Blitz MAX TTimer that is fired @hertz times a second. When the timer pulses then @OnTimer() is called. - If this routine is called when a timer is already active, then the timer is re-initialised with the passed hertz. - EndRem - Method SetTimer(hertz:Double) - ClearTimer() - timer=CreateTimer(hertz,CreateEvent(EVENT_TIMERTICK,gadget)) - End Method - - Rem - bbdoc: Clears timer previously activated by @SetTimer(). - EndRem - Method ClearTimer() - If timer - StopTimer(timer) - EndIf - timer=Null - End Method - - Rem - bbdoc: Called when the widget's timer fires. - EndRem - Method OnTimer() - End Method - - Rem - bbdoc: Called when the widget's timer fires. - EndRem - Field OnTimerEvent:TMWEventListVoid - - Rem - bbdoc: Called when the widget is managed. - EndRem - Method OnManage() - End Method - - Rem - bbdoc: Called when the widget is managed. - EndRem - Field OnManageEvent:TMWEventListVoid - - Rem - bbdoc: Called when the widget is unmanaged. - EndRem - Method OnUnmanage() - End Method - - Rem - bbdoc: Called when the widget is unmanaged. - EndRem - Field OnUnmanageEvent:TMWEventListVoid - - Rem - bbdoc: Called when the mouse enters. - EndRem - Method OnMouseEnter() - End Method - - Rem - bbdoc: Called when the mouse enters. - EndRem - Field OnMouseEnterEvent:TMWEventListVoid - - Rem - bbdoc: Called when the mouse leaves. - EndRem - Method OnMouseLeave() - End Method - - Rem - bbdoc: Called when the mouse leaves. - EndRem - Field OnMouseLeaveEvent:TMWEventListVoid - - Rem - bbdoc: Fires an event at this managed widget. - about: The arguments are the same as @CreateEvent(), but no source is passed in. - EndRem - Method Emit(id:Int, data:Int=0, mods:Int=0, x:Int=0, y:Int=0,extra:Object=Null) - EmitEvent(CreateEvent(id,gadget,data,mods,x,y,extra)) - End Method - - Rem - bbdoc: Initialises the base managed widget stuff. - about: All sub-classes must call this! @gadget is the created TGadget for this instance, - and @parent is the parent managed widget (NULL for none). - EndRem - Method BaseInitialise(gadget:TGadget, parent:TMWidget) - self.children=CreateList() - self.gadget=gadget - self.parent=parent - - OnTimerEvent=New TMWEventListVoid - OnManageEvent=New TMWEventListVoid - OnUnmanageEvent=New TMWEventListVoid - OnMouseEnterEvent=New TMWEventListVoid - OnMouseLeaveEvent=New TMWEventListVoid - - If self.parent - self.parent.children.AddLast(Self) - EndIf - - Static.Register(Self) - End Method - - Rem - bbdoc: Removes the managed widget from the internal lists. - about: All child objects will also be unmanaged. - EndRem - Method Unmanage() - Static.Deregister(Self) - End Method - - Method ToString:String() - Return typename+":"+super.ToString() - End Method -End Type - - -Rem -bbdoc: Defines a managed window. -EndRem -Type TMWindow Extends TMWidget - - Rem - bbdoc: Creates a managed window. - returns: The created window. - about: @name, @x, @y, @w, @h, @group and @flags act the same as the MaxGUI arguments to @CreateWindow(), except that @group is a TMWidget. - EndRem - Method Create:TMWindow(name:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget=Null, flags:Int=15) - closed=False - - OnMoveEvent=New TMWEventListIntInt - OnResizeEvent=New TMWEventListIntInt - OnCloseEvent=New TMWEventListVoid - OnDropEvent=New TMWEventListString - - Local g:TGadget - - If group - g=CreateWindow(name,x,y,w,h,group.gadget,flags) - Else - g=CreateWindow(name,x,y,w,h,Null,flags) - EndIf - - BaseInitialise(g,group) - typename="TMWindow" - Return Self - End Method - - Rem - bbdoc: Set to TRUE when the window is closed (the user has pressed the close gadget). - EndRem - Field closed:Int - - Rem - bbdoc: Activate the window. - EndRem - Method Activate(state:Int) - ActivateWindow(gadget) - End Method - - Rem - bbdoc: Send a close event to this window. - EndRem - Method Close() - Emit(EVENT_WINDOWCLOSE) - End Method - - Rem - bbdoc: Hide to show the window. - about: Note that this sets the @closed field to the @state passed in. - EndRem - Method Hidden(state:Int) - closed=state - super.Hidden(state) - End Method - - Rem - bbdoc: Set the window's status text. - EndRem - Method StatusText(text:String) - SetStatusText(gadget,text) - End Method - - Rem - bbdoc: Set the window's minimum size. - EndRem - Method MinSize(width:Int, height:Int) - Return SetMinWindowSize(gadget,width,height) - End Method - - Rem - bbdoc: Restore a minimizwed or maximized window. - EndRem - Method Restore() - Return RestoreWindow(gadget) - End Method - - Rem - bbdoc: Maximize the window. - EndRem - Method Maximize() - Return MaximizeWindow(gadget) - End Method - - Rem - bbdoc: Is the window maximized? - returns:TRUE if the window is maximized - EndRem - Method IsMaximized() - Return WindowMaximized(gadget) - End Method - - Rem - bbdoc: Minimize the window. - EndRem - Method Minimize() - Return MinimizeWindow(gadget) - End Method - - Rem - bbdoc: Is the window minimized? - returns:TRUE if the window is minimized - EndRem - Method IsMinimized() - Return WindowMinimized(gadget) - End Method - - Rem - bbdoc: Called when the window is moved. - about:@x and @y are the new position. - EndRem - Method OnMove(x:Int, y:Int) - End Method - - Rem - bbdoc: Called when the window is moved. - EndRem - Field OnMoveEvent:TMWEventListIntInt - - Rem - bbdoc: Called when the window is resized. - about:@width and @height are the new size. - EndRem - Method OnResize(width:Int, height:Int) - End Method - - Rem - bbdoc: Called when the window is resized. - EndRem - Field OnResizeEvent:TMWEventListIntInt - - Rem - bbdoc: Called when the window's close gadget is pressed. - about: This default implementation sets @closed to TRUE and hide the window if no events are defined in @OnCloseEvent. - EndRem - Method OnClose() - If Not OnCloseEvent.list.Count() - closed=True - Hidden(True) - EndIf - End Method - - Rem - bbdoc: Called when the window's close gadget is pressed. - EndRem - Field OnCloseEvent:TMWEventListVoid - - Rem - bbdoc: Called when a file is dropped in the window. - about: @path is the dropped file. - EndRem - Method OnDrop(path:String) - End Method - - Rem - bbdoc: Called when a file is dropped in the window. - EndRem - Field OnDropEvent:TMWEventListString - - Method Handle(e:TEvent) - Select e.id - Case EVENT_WINDOWACCEPT - OnDrop(String(e.extra)) - OnDropEvent.Fire(Self,String(e.extra)) - Case EVENT_WINDOWMOVE - OnMove(e.x,e.y) - OnMoveEvent.Fire(Self,e.x,e.y) - Case EVENT_WINDOWSIZE - OnResize(e.x,e.y) - OnResizeEvent.Fire(Self,e.x,e.y) - Case EVENT_WINDOWCLOSE - OnClose() - OnCloseEvent.Fire(Self) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed button push button. -EndRem -Type TMButton Extends TMWidget - - Rem - bbdoc: Creates a managed push button. - returns: The created button. - about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. - EndRem - Method Create:TMButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) - OnPressEvent=New TMWEventListVoid - BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_PUSH),group) - typename="TMButton" - Return Self - End Method - - Rem - bbdoc: Creates a managed push button used for an OK button - returns: The created button. - about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. - EndRem - Method CreateOK:TMButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) - OnPressEvent=New TMWEventListVoid - BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_OK),group) - typename="TMButton" - Return Self - End Method - - Rem - bbdoc: Creates a managed push button used for a Cancel button - returns: The created button. - about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. - EndRem - Method CreateCancel:TMButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) - OnPressEvent=New TMWEventListVoid - BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_OK),group) - typename="TMButton" - Return Self - End Method - - Rem - bbdoc: Called when the button is pressed. - EndRem - Method OnPress() - End Method - - Rem - bbdoc: Called when the button is pressed. - EndRem - Field OnPressEvent:TMWEventListVoid - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - OnPress() - OnPressEvent.Fire(Self) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed checkbox. -EndRem -Type TMCheckbox Extends TMWidget - Rem - bbdoc: Creates a managed checkbox. - returns: The created checkbox. - about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. - EndRem - Method Create:TMCheckbox(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) - OnPressEvent=New TMWEventListInt - BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_CHECKBOX),group) - typename="TMCheckbox" - Return Self - End Method - - Rem - bbdoc: Sets the state of the check. - EndRem - Method Checked(check:Int) - SetButtonState(gadget,check) - End Method - - Rem - bbdoc: Is the checkbox checked? - returns:TRUE if the checkbox is checked. - EndRem - Method IsChecked() - Return ButtonState(gadget) - End Method - - Rem - bbdoc: Called when the checkbox is pressed. - about: @checked is the current state. - EndRem - Method OnPress(checked:Int) - End Method - - Rem - bbdoc: Called when the checkbox is pressed. - EndRem - Field OnPressEvent:TMWEventListInt - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - OnPress(e.data) - OnPressEvent.Fire(Self,e.data) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed radio button. -EndRem -Type TMRadioButton Extends TMCheckbox - Field set:TMRadioButtonSet - - Rem - bbdoc: Creates a managed radio button. - returns: The created radio button. - about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. - EndRem - Method Create:TMRadioButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) - OnPressEvent=New TMWEventListInt - BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_RADIO),group) - typename="TMRadioButton" - Return Self - End Method - - Rem - bbdoc: Called when the checkbox is pressed. - about: @checked is the current state. In this default implementation the @TMRadioButtonSet which this button belongs too will fire - its @OnSelected() member. - EndRem - Method OnPress(checked:Int) - If set - set.ButtonFired(Self) - EndIf - End Method -End Type - - -Rem -bbdoc: Defines a set of managed radio button. -EndRem -Type TMRadioButtonSet - Field but:TMRadioButton[] - - Rem - bbdoc: Creates a set of managed radio buttons. - returns: The created set. - about: The radio buttons must have been created prior to calling this. - EndRem - Method Create:TMRadioButtonSet(buttons:TMRadioButton[]) - OnSelectedEvent=New TMWEventListInt - but=buttons - For Local b:TMRadioButton=EachIn but - b.set=Self - Next - Return Self - End Method - - Rem - bbdoc: Sets the active radio button. - about: @index is the index of the button to set. - EndRem - Method Set(index:Int) - but[index].Checked(True) - End Method - - Rem - bbdoc: If using the base TMRadioButton implmentation this will be called when the buttons change. - about: @index is the selected button. - EndRem - Method OnSelected(index:Int) - End Method - - Rem - bbdoc: If using the base TMRadioButton implmentation this will be called when the buttons change. - about: The radio button that fired will be passed into the event. - EndRem - Field OnSelectedEvent:TMWEventListInt - - Rem - bbdoc: Get the active radio button. - returns: The index of the button set. -1 if no button is set. - EndRem - Method Current() - For Local f:Int=0 Until but.length - If but[f].IsChecked() - Return f - EndIf - Next - Return -1 - End Method - - Method ButtonFired(b:TMRadioButton) - For Local f:Int=0 Until but.length - If but[f]=b - OnSelected(f) - OnSelectedEvent.Fire(b,f) - Return - EndIf - Next - End Method -End Type - - -Rem -bbdoc: Defines a managed label. -EndRem -Type TMLabel Extends TMWidget - - Rem - bbdoc: Creates a managed label. - returns: The created label. - about: @label, @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateLabel(), except that @group is a TMWidget. - EndRem - Method Create:TMLabel(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) - BaseInitialise(CreateLabel(label,x,y,w,h,group.gadget,style),group) - typename="TMLabel" - Return Self - End Method -End Type - - -Rem -bbdoc: Defines a managed text field. -EndRem -Type TMTextField Extends TMWidget - Rem - bbdoc: Creates a managed text field. - returns: The created text field. - about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateTextField(), except that @group is a TMWidget. - EndRem - Method Create:TMTextField(x:Int,y:Int, w:Int, h:Int, group:TMWidget) - OnTextChangedEvent=New TMWEventListString - BaseInitialise(CreateTextField(x,y,w,h,group.gadget),group) - typename="TMTextField" - Return Self - End Method - - Rem - bbdoc: Creates a managed text field for entering passwords. - returns: The created text field. - about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateTextField(), except that @group is a TMWidget. - EndRem - Method CreateSecret:TMTextField(x:Int,y:Int, w:Int, h:Int, group:TMWidget) - BaseInitialise(CreateTextField(x,y,w,h,group.gadget,TEXTFIELD_PASSWORD),group) - typename="TMTextField" - Return Self - End Method - - Rem - bbdoc: The field's text. - returns:The text. - EndRem - Method GetText:String() - Return TextFieldText(gadget) - End Method - - Rem - bbdoc: Called when the text changes. - about: @txt is the content of the field - EndRem - Method OnTextChanged(txt:String) - End Method - - Rem - bbdoc: Called when the text changes. - EndRem - Field OnTextChangedEvent:TMWEventListString - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - Local s:String=TextFieldText(gadget) - OnTextChanged(s) - OnTextChangedEvent.Fire(Self,s) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed text area. -EndRem -Type TMTextArea Extends TMWidget - Rem - bbdoc: Creates a managed text area. - returns: The created text area. - about: @x, @y, @w, @h,, @group and @style act the same as the MaxGUI arguments to @CreateTextArea(), except that @group is a TMWidget. - EndRem - Method Create:TMTextArea(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) - OnTextChangedEvent=New TMWEventListVoid - OnSelectionEvent=New TMWEventListVoid - OnMenuEvent=New TMWEventListVoid - BaseInitialise(CreateTextArea(x,y,w,h,group.gadget,style),group) - typename="TMTextArea" - Return Self - End Method - - Rem - bbdoc: The text area's text. - returns:The text. - EndRem - Method GetText:String(pos:Int=0, length:Int=TEXTAREA_ALL, units:Int=TEXTAREA_CHARS) - Return TextAreaText(gadget,pos,length,units) - End Method - - Rem - bbdoc: Set the widget's font. - EndRem - Method Font(font:TGUIFont) - SetTextAreaFont(gadget,font) - End Method - - Rem - bbdoc: Set the widgets's text colour. - EndRem - Method TextColour(r:Int, g:Int, b:Int) - SetTextAreaColor(gadget,r,g,b,False) - End Method - - Rem - bbdoc: Set the widgets's background colour. - EndRem - Method BackColour(r:Int, g:Int, b:Int) - SetTextAreaColor(gadget,r,g,b,True) - End Method - - Rem - bbdoc: Set the widgets's text. - EndRem - Method Text(s:String) - SetText(s) - End Method - - Rem - bbdoc: Set the widgets's text (see the MaxGUI docs for argument details) - EndRem - Method SetText(s:String, pos:Int=0, length:Int=TEXTAREA_ALL, units:Int=TEXTAREA_CHARS) - SetTextAreaText(gadget,s,pos,length,units) - End Method - - Rem - bbdoc: Set the text area's tab size - EndRem - Method SetTabSize(size:Int) - SetTextAreaTabs(gadget,size) - End Method - - Rem - bbdoc: Get the character position of the specified line. - EndRem - Method GetCharPos:Int(line:Int) - Return TextAreaChar(gadget,line) - End Method - - Rem - bbdoc: Get the cursor's column. - EndRem - Method GetCursorColumn:Int() - Return TextAreaCursor(gadget,TEXTAREA_CHARS) - End Method - - Rem - bbdoc: Get the cursor's row. - EndRem - Method GetCursorRow:Int() - Return TextAreaCursor(gadget,TEXTAREA_LINES) - End Method - - Rem - bbdoc: Get the text length. - EndRem - Method GetLength:Int() - Return TextAreaLen(gadget) - End Method - - Rem - bbdoc: Get the selected texts length. - EndRem - Method GetSelectionLength:Int() - Return TextAreaSelLen(gadget,TEXTAREA_CHARS) - End Method - - Rem - bbdoc: Get the number of selected rows. - EndRem - Method GetSelectionRows:Int() - Return TextAreaSelLen(gadget,TEXTAREA_LINES) - End Method - - Rem - bbdoc: Lock the text area. - EndRem - Method Lock() - Return LockTextArea(gadget) - End Method - - Rem - bbdoc: Unlock the text area. - EndRem - Method Unlock() - Return UnlockTextArea(gadget) - End Method - - Rem - bbdoc: Set the format. See the MaxGUI docs for details. - EndRem - Method Format(r:Int, g:Int, b:Int, flags:Int, pos:Int=0, length:Int=TEXTAREA_ALL, units:Int=TEXTAREA_CHARS ) - FormatTextAreaText(gadget,r,g,b,flags,pos,length,units) - End Method - - Rem - bbdoc: Called when the text changes. - EndRem - Method OnTextChanged() - End Method - - Rem - bbdoc: Called when the text changes. - EndRem - Field OnTextChangedEvent:TMWEventListVoid - - Rem - bbdoc: Called when the selection or cursor changes. - EndRem - Method OnSelection() - End Method - - Rem - bbdoc: Called when the selection or cursor changes. - EndRem - Field OnSelectionEvent:TMWEventListVoid - - Rem - bbdoc: Called when the context menu is requested. - EndRem - Method OnMenu() - End Method - - Rem - bbdoc: Called when the context menu is requested. - EndRem - Field OnMenuEvent:TMWEventListVoid - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - OnTextChanged() - OnTextChangedEvent.Fire(Self) - Case EVENT_GADGETSELECT - OnSelection() - OnSelectionEvent.Fire(Self) - Case EVENT_GADGETMENU - OnMenu() - OnMenuEvent.Fire(Self) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed slider. -EndRem -Type TMSlider Extends TMWidget - Rem - bbdoc: Creates a managed slider. - returns: The created slider. - about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateSlider(), except that @group is a TMWidget. - EndRem - Method Create:TMSlider(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) - OnValueChangedEvent=New TMWEventListInt - BaseInitialise(CreateSlider(x,y,w,h,group.gadget,style),group) - typename="TMSlider" - Return Self - End Method - - Rem - bbdoc: Set the sliders's min/max values. - about: See the MaxGUI docs for how this affects scrollbar style sliders. - EndRem - Method SetRange(range0:Int,range1:Int) - Return SetSliderRange(gadget,range0,range1) - End Method - - Rem - bbdoc: Set the sliders's value. - EndRem - Method SetValue(value:Int) - Return SetSliderValue(gadget,value) - End Method - - Rem - bbdoc: The sliders's value. - returns:The value. - EndRem - Method GetValue:Int() - Return SliderValue(gadget) - End Method - - Rem - bbdoc: Called when the slider moves. - about: @val is the new slider value. - EndRem - Method OnValueChanged(val:Int) - End Method - - Rem - bbdoc: Called when the slider moves. - EndRem - Field OnValueChangedEvent:TMWEventListInt - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - OnValueChanged(e.data) - OnValueChangedEvent.Fire(Self,e.data) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines an entry in a list style gadget. -about: Always use @CreateListEntry() to create this object. -EndRem -Type TMListEntry - Rem - bbdoc: The text associated with a list entry. - EndRem - Field text:String - Rem - bbdoc: The flags associated with a list entry. - EndRem - Field flags:Int - Rem - bbdoc: The icon associated with a list entry. - EndRem - Field icon:Int - Rem - bbdoc: The tooltip associated with a list entry. - EndRem - Field tip:String - Rem - bbdoc: The extra object associated with a list entry. - EndRem - Field extra:Object - - Function Create:TMListEntry(text:String,flags:Int,icon:Int,tip:String,extra:Object) - Local o:TMListEntry=New TMListEntry - o.text=text - o.flags=flags - o.icon=icon - o.tip=tip - o.extra=extra - Return o - End Function -End Type - - -Rem -bbdoc: Creates a list entry. -returns: The list entry. -about: @text, @flags, @icon, @tip and @extra are the fields detailed in MaxGUI @AddGadgetItem(). -EndRem -Function CreateListEntry:TMListEntry(text:String,flags:Int=0,icon:Int=-1,tip:String="",extra:Object=Null) - Return TMListEntry.Create(text,flags,icon,tip,extra) -End Function - - -Rem -bbdoc: Defines a base for list style gadgets. -EndRem -Type TMListWidget Extends TMWidget Abstract - Rem - bbdoc: Removes all items from the list. - EndRem - Method Clear() - ClearGadgetItems(gadget) - End Method - - Rem - bbdoc: Adds an item to the list. - EndRem - Method AddItem(entry:TMListEntry) - AddGadgetItem(gadget,entry.text,entry.flags,entry.icon,entry.tip,entry.extra) - End Method - - Rem - bbdoc: Adds items to the list. - EndRem - Method AddItems(entry:TMListEntry[]) - For Local f:Int=0 Until entry.length - AddItem(entry[f]) - Next - End Method - - Rem - bbdoc: Modify an item in the list. - EndRem - Method ModifyItem(index:Int, entry:TMListEntry) - ModifyGadgetItem(gadget,index,entry.text,entry.flags,entry.icon,entry.tip,entry.extra) - End Method - - Rem - bbdoc: Set an icon strip for the list. - EndRem - Method SetIconStrip(icons:TIconStrip) - SetGadgetIconStrip(gadget,icons) - End Method - - Rem - bbdoc: Get an item from the list. - about: Note that the @tip field is not set on return - EndRem - Method GetItem:TMListEntry(index:Int) - Return CreateListEntry(GadgetItemText(gadget,index), .. - GadgetItemFlags(gadget,index), .. - GadgetItemIcon(gadget,index), .. - "", .. - GadgetItemExtra(gadget,index)) - End Method - - Rem - bbdoc: Enable or disable a particular item. - EndRem - Method ItemEnabled(index:Int, state:Int) - If state - EnableGadgetItem(gadget,index) - Else - DisableGadgetItem(gadget,index) - EndIf - End Method - - Rem - bbdoc: Set the currently selected item. - EndRem - Method SetSelectedIndex(index:Int) - SelectGadgetItem(gadget,index) - End Method - - Rem - bbdoc: Get the index of the first selected item. - EndRem - Method SelectedIndex:Int() - Return SelectedGadgetItem(gadget) - End Method - - Rem - bbdoc: Get the indexes of the selected items. - EndRem - Method SelectedIndexes:Int[]() - Return SelectedGadgetItems(gadget) - End Method - - Rem - bbdoc: Get the first selected item, NULL if nothing selected. - EndRem - Method SelectedItem:TMListEntry() - If SelectedIndex()=-1 - Return Null - EndIf - - Return GetItem(SelectedIndex()) - End Method - - Rem - bbdoc: Get the selected items, NULL if nothing selected. - EndRem - Method SelectedItems:TMListEntry[]() - If SelectedIndex()=-1 - Return Null - EndIf - - Local sel:Int[]=SelectedIndexes() - Local ret:TMListEntry[]=New TMListEntry[sel.length] - - For Local f:Int=0 Until sel.length - ret[f]=GetItem(sel[f]) - Next - Return ret - End Method - - Rem - bbdoc: Called when the selection changes. - about: @index is the selected index. This can be -1 for no selection. - EndRem - Method OnIndexChanged(index:Int) - End Method - - Rem - bbdoc: Called when the selection changes. - EndRem - Field OnIndexChangedEvent:TMWEventListInt - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - OnIndexChanged(e.data) - OnIndexChangedEvent.Fire(Self,e.data) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed combo box. -EndRem -Type TMComboBox Extends TMListWidget - Rem - bbdoc: Creates a managed combo box. - returns: The created combo box. - about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateComboBox(), except that @group is a TMWidget. - If @values is not NULL it is used to load up the initial options. - IMPORTANT: It is really not recommended to use COMBOBOX_EDITABLE as OnIndexChanged() is called when the user edits the field. - There seems to be no easy way to remedy this. - EndRem - Method Create:TMComboBox(x:Int,y:Int, w:Int, h:Int, group:TMWidget, style:Int=0, values:TMListEntry[]=Null) - OnIndexChangedEvent=New TMWEventListInt - BaseInitialise(CreateComboBox(x,y,w,h,group.gadget,style),group) - typename="TMComboBox" - If values - AddItems(values) - EndIf - Return Self - End Method -End Type - - -Rem -bbdoc: Defines a managed list box. -EndRem -Type TMListBox Extends TMListWidget - Rem - bbdoc: Creates a managed list box. - returns: The created list box. - about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateListBox(), except that @group is a TMWidget. - If @values is not NULL it is used to load up the initial options. - EndRem - Method Create:TMListBox(x:Int,y:Int, w:Int, h:Int, group:TMWidget, values:TMListEntry[]=Null) - OnIndexChangedEvent=New TMWEventListInt - BaseInitialise(CreateListBox(x,y,w,h,group.gadget),group) - typename="TMListBox" - If values - AddItems(values) - EndIf - Return Self - End Method -End Type - - -Rem -bbdoc: Defines a managed tabber. -EndRem -Type TMTabber Extends TMListWidget - Field pages:TMWidget[][] - - Rem - bbdoc: Creates a managed tabber. - returns: The created tabber. - about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateTabber(), except that @group is a TMWidget. - If @values is not NULL it is used to load up the initial options. - EndRem - Method Create:TMTabber(x:Int,y:Int, w:Int, h:Int, group:TMWidget, values:TMListEntry[]=Null) - OnIndexChangedEvent=New TMWEventListInt - BaseInitialise(CreateTabber(x,y,w,h,group.gadget),group) - typename="TMTabber" - If values - AddItems(values) - EndIf - Return Self - End Method - - Rem - bbdoc: Defines the gadgets to appear on each page of the tabber. - about: @widgets is an array of @TMWidget arrays. Each sub-array is one page. - EndRem - Method SetPages(widgets:TMWidget[][]) - pages=widgets - End Method - - Rem - bbdoc: Set the currently selected page. - about: This will hide/show the widgets defined by @DefinePages() as appropriate. - EndRem - Method SetSelectedIndex(index:Int) - SelectGadgetItem(gadget,index) - - If pages - For Local f:Int=0 Until pages.length - For Local w:TMWidget=EachIn pages[f] - w.Hidden(f<>index) - Next - Next - EndIf - End Method - - Rem - bbdoc: This default implementation will switch the widgets as defined by @DefinePages() - EndRem - Method OnIndexChanged(index:Int) - If index>-1 And pages - For Local f:Int=0 Until pages.length - For Local w:TMWidget=EachIn pages[f] - w.Hidden(f<>index) - Next - Next - EndIf - End Method - -End Type - - -Rem -bbdoc: Defines a managed HTML View. -EndRem -Type TMHTMLView Extends TMWidget - Rem - bbdoc: Creates a managed HTML View. - returns: The created HTML View. - about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateHMTLView(), except that @group is a TMWidget. - EndRem - Method Create:TMHTMLView(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) - OnPageLoadedEvent=New TMWEventListString - OnSelectURLEvent=New TMWEventListString - BaseInitialise(CreateHTMLView(x,y,w,h,group.gadget,style),group) - typename="TMHTMLView" - Return Self - End Method - - Rem - bbdoc: The current URL. - EndRem - Method CurrentURL:String() - Return HtmlViewCurrentURL(gadget) - End Method - - Rem - bbdoc: Enter the URL to goto. - EndRem - Method Go(url:String) - HtmlViewGo(gadget,url) - End Method - - Rem - bbdoc: Go back in the history. - EndRem - Method Back() - HtmlViewBack(gadget) - End Method - - Rem - bbdoc: Go forward in the history. - EndRem - Method Forward() - HtmlViewForward(gadget) - End Method - - Rem - bbdoc:Run a script. - EndRem - Method RunScript:String(script:String) - HtmlViewRun(gadget,script) - End Method - - Rem - bbdoc: If HTMLVIEW_NONAVIGATE is set in the styles, then this is called when a link is clicked. - about: @url is the selected URL. - EndRem - Method OnSelectURL(url:String) - End Method - - Rem - bbdoc: If HTMLVIEW_NONAVIGATE is set in the styles, then this is called when a link is clicked. - EndRem - Field OnSelectURLEvent:TMWEventListString - - Rem - bbdoc: Called when the page finishes loading. - about: @url is the loaded URL. - EndRem - Method OnPageLoaded(url:String) - End Method - - Rem - bbdoc: Called when the page finishes loading. - EndRem - Field OnPageLoadedEvent:TMWEventListString - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - OnSelectURL(e.extra.ToString()) - OnSelectURLEvent.Fire(Self,e.extra.ToString()) - Case EVENT_GADGETDONE - OnPageLoaded(CurrentURL()) - OnPageLoadedEvent.Fire(Self,CurrentURL()) - Default - super.Handle(e) - End Select - End Method -End Type - - -Type TMTreeNode - Field path:String - Field node:TGadget - Field tag:Object - Field icon:Int - Function Create:TMTreeNode(path:String, node:TGadget, tag:Object, icon:Int) - Local o:TMTreeNode=New TMTreeNode - o.path=path - o.node=node - o.tag=tag - o.icon=icon - Return o - End Function -End Type - -Rem -bbdoc: Defines a managed tree view. -about: The tree view works by treating its entries as if in a simple file system. -EndRem -Type TMTreeView Extends TMWidget - Field map:TMap - Field gmap:TMap - Field update:Int - - Rem - bbdoc: Creates a managed tree view. - returns: The created tree view. - about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateTreeView(), except that @group is a TMWidget. - EndRem - Method Create:TMTreeView(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) - update=False - map=New TMap - gmap=New TMap - OnSelectedEvent=New TMWEventListStringObject - OnClickedEvent=New TMWEventListStringObject - OnMenuEvent=New TMWEventListStringObject - OnExpandedEvent=New TMWEventListStringObject - OnCollapsedEvent=New TMWEventListStringObject - BaseInitialise(CreateTreeView(x,y,w,h,group.gadget,style),group) - typename="TMNodeView" - map.Insert("/",TMTreeNode.Create("/",TreeViewRoot(gadget),"/",-1)) - Return Self - End Method - - Method ResolvePath:TMTreeNode(path:String) - Return TMTreeNode(map.ValueForKey(path)) - End Method - - Method ResolveGadget:TMTreeNode(g:TGadget) - Return ResolvePath(gmap.ValueForKey(g).ToString()) - End Method - - Method Prune(path:String) - Local l:TList=CreateList() - - ' Not sure if this is overly ineffecient -- just being safe as in most languages deleting whilst iterating - ' is not recommended... - ' - For Local k:String=EachIn map.Keys() - If k=path Or k.Find(path+"/")=0 - l.AddLast(k) - EndIf - Next - - For Local k:String=EachIn l - Local n:TMTreeNode=ResolvePath(k) - map.Remove(k) - gmap.Remove(n.node) - Next - End Method - - Rem - bbdoc: Set an icon strip. - EndRem - Method SetIconStrip(icons:TIconStrip) - SetGadgetIconStrip(gadget,icons) - End Method - - Rem - bbdoc: The number of nodes in the view that are direct children on the passed node. - returns: The number of nodes. - about: @path is the path to count from. Unfortunately counting from the root (/) doesn't work, so it returns -1. - EndRem - Method CountChildren:Int(path:String) - If path="/" - Return -1 - EndIf - - Local node:TMTreeNode=ResolvePath(path) - - If node - Return CountTreeViewNodes(node.node) - Else - Return 0 - EndIf - End Method - - Rem - bbdoc: Remove nodes from the tree. - about: Attempting to remove the root node (/) will fail. - EndRem - Method Remove(path:String) - If path<>"/" - Local node:TMTreeNode=ResolvePath(path) - - If node - FreeTreeViewNode(node.node) - Prune(path) - EndIf - EndIf - End Method - - Rem - bbdoc: Don't redraw gadget when adding nodes. - EndRem - Method BeginUpdate() - update=True - End Method - - - Rem - bbdoc: Allow redraw of gadget when adding nodes. - EndRem - Method EndUpdate() - update=False - End Method - - - Rem - bbdoc: Add/modify nodes in the tree. - about: @path is the path to the node. This silently fails if the parent nodes don't exist. @tag is an Object that the entry is tagged with. - ToString() is called on this to create the text for the entry (so passing a String works fine). - @icon is the icon to use. Note that if you set an icon strip, then this seems to use the first icon (on Win32 at least) if set to -1. - EndRem - Method Set(path:String, tag:Object, icon:Int=-1) - Local parent:TMTreeNode=ResolvePath(FixedExtractDir(path)) - - If parent - Local node:TMTreeNode=ResolvePath(path) - - If node - ModifyTreeViewNode(node.node,tag.ToString(),icon) - Else - node=TMTreeNode.Create(path,AddTreeViewNode(tag.ToString(),parent.node,icon),tag,icon) - map.Insert(path,node) - gmap.Insert(node.node,path) - EndIf - - node.tag=tag - node.icon=icon - - If Not update - RedrawGadget(gadget) - EndIf - EndIf - End Method - - Rem - bbdoc: Get the tag at a node. - returns: The tag, or NULL for unknown node. - EndRem - Method GetNodeTag:Object(path:String) - Local node:TMTreeNode=ResolvePath(path) - If node - Return node.tag - Else - Return Null - EndIf - End Method - - Rem - bbdoc: Get the icon at a node. - returns: The icon, or -1 for none or unknown node. - EndRem - Method GetNodeIcon:Int(path:String) - Local node:TMTreeNode=ResolvePath(path) - If node - Return node.icon - Else - Return -1 - EndIf - End Method - - Rem - bbdoc: Expand a node on the tree. - EndRem - Method ExpandNode(path:String) - Local node:TMTreeNode=ResolvePath(path) - - If node - ExpandTreeViewNode(node.node) - EndIf - End Method - - Rem - bbdoc: Collapse a node on the tree. - EndRem - Method CollapseNode(path:String) - Local node:TMTreeNode=ResolvePath(path) - - If node - CollapseTreeViewNode(node.node) - EndIf - End Method - - Rem - bbdoc: Called when the an item is selected. - about: @path is the path to the selected item, @tag is the tag for that item. - EndRem - Method OnSelected(path:String, tag:Object) - End Method - - Rem - bbdoc: Called when the an item is selected. - EndRem - Field OnSelectedEvent:TMWEventListStringObject - - Rem - bbdoc: Called when the an item is double clicked. - about: @path is the path to the selected item, @tag is the tag for that item. - EndRem - Method OnClicked(path:String, tag:Object) - End Method - - Rem - bbdoc: Called when the an item is double clicked. - EndRem - Field OnClickedEvent:TMWEventListStringObject - - Rem - bbdoc: Called when the a context menu is requested. - about: @path is the path to the selected item, @tag is the tag for that item. - EndRem - Method OnMenu(path:String, tag:Object) - End Method - - Rem - bbdoc: Called when the an item is selected. - EndRem - Field OnMenuEvent:TMWEventListStringObject - - Rem - bbdoc: Called when a node is expanded. - about: @path is the path to the selected item, @tag is the tag for that item. - EndRem - Method OnExpanded(path:String, tag:Object) - End Method - - Rem - bbdoc: Called when a node is expanded. - EndRem - Field OnExpandedEvent:TMWEventListStringObject - - Rem - bbdoc: Called when a node is collapsed. - about: @path is the path to the selected item, @tag is the tag for that item. - EndRem - Method OnCollapsed(path:String, tag:Object) - End Method - - Rem - bbdoc: Called when a node is collapsed. - EndRem - Field OnCollapsedEvent:TMWEventListStringObject - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETSELECT - Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) - If n - OnSelected(n.path,n.tag) - OnSelectedEvent.Fire(Self,n.path,n.tag) - EndIf - Case EVENT_GADGETACTION - Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) - If n - OnClicked(n.path,n.tag) - OnClickedEvent.Fire(Self,n.path,n.tag) - EndIf - Case EVENT_GADGETOPEN - Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) - If n - OnExpanded(n.path,n.tag) - OnExpandedEvent.Fire(Self,n.path,n.tag) - EndIf - Case EVENT_GADGETCLOSE - Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) - If n - OnCollapsed(n.path,n.tag) - OnCollapsedEvent.Fire(Self,n.path,n.tag) - EndIf - Case EVENT_GADGETMENU - Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) - If n - OnMenu(n.path,n.tag) - OnMenuEvent.Fire(Self,n.path,n.tag) - EndIf - Default - super.Handle(e) - End Select - End Method -End Type - - -Type TMenuItem - Field id:Int - Field owner:TMMenu - Field path:String - Field tag:Object - Field gadget:TGadget - Field callback(menu:TMMenu, path:String, tag:Object) - Function Create:TMenuItem(owner:TMMenu, id:Int, path:String, gadget:TGadget, tag:Object, callback(menu:TMMenu, path:String, tag:Object)) - Local o:TMenuItem=New TMenuItem - o.owner=owner - o.id=id - o.path=path - o.gadget=gadget - o.tag=tag - o.callback=callback - Return o - End Function -End Type - - -Rem -bbdoc: Defines a managed menu. -about: Note that TMMenu is NOT a TMWidget. -EndRem -Type TMMenu - - Field root:TGadget - Field map:TMap - Field win:TMWindow - - Rem - bbdoc: Creates a managed menu that is associated as a window menu. - returns: The created menu. - about: @window is the window the menu is attached to. - EndRem - Method CreateWindowMenu:TMMenu(window:TMWindow) - map=New TMap - root=WindowMenu(window.gadget) - win=window - SetRoot() - Return Self - End Method - - Rem - bbdoc: Creates a managed menu that can be used as a popup menu. - returns: The created menu. - EndRem - Method CreatePopupMenu:TMMenu() - map=New TMap - root=CreateMenu("",0,Null) - win=Null - SetRoot() - Return Self - End Method - - Method Delete() - Clear() - If Not win - FreeMenu(root) - EndIf - End Method - - Rem - bbdoc: Clear all items from the menu - EndRem - Method Clear() - For Local m:TMenuItem=EachIn map - FreeMenu(m.gadget) - Static.DeregisterMenuItem(m) - Next - map.Clear() - SetRoot() - End Method - - Method SetRoot() - map.Insert("/",TMenuItem.Create(Self,0,"/",root,Null,Null)) - End Method - - Method ResolvePath:TMenuItem(path:String) - Return TMenuItem(map.ValueForKey(path)) - End Method - - Method Prune(path:String) - Local l:TList=CreateList() - - ' Not sure if this is overly ineffecient -- just being safe as in most languages deleting whilst iterating - ' is not recommended... - ' - For Local k:String=EachIn map.Keys() - If k=path Or k.Find(path+"/")=0 - l.AddLast(k) - EndIf - Next - - For Local k:String=EachIn l - Local n:TMenuItem=ResolvePath(k) - map.Remove(k) - Static.DeregisterMenuItem(n) - FreeMenu(n.gadget) - Next - End Method - - Rem - bbdoc: Add a menu option. - about: @path is the path to the menu item. This silently fails if the parent menus don't exist. @tag is an Object that the entry is tagged with. - ToString() is called on this to create the text for the menu (so passing a String works fine). If @callback is not null, then it is called when - this option is selected. - @hotkey and @modifier are as in MaxGUI's CreateMenu(). - EndRem - Method Set(path:String, tag:Object, callback(menu:TMMenu, path:String, tag:Object)=Null, hotkey:Int=0, modifier:Int=0) - If path<>"/" - Local parent:TMenuItem=ResolvePath(FixedExtractDir(path)) - - If parent - Local node:TMenuItem=ResolvePath(path) - - If node - SetMenuText(node.gadget,tag.ToString()) - Else - Local id:Int=Static.NextMenuID() - node=TMenuItem.Create(Self,id,path,CreateMenu(tag.ToString(),id,parent.gadget,hotkey,modifier),tag,callback) - map.Insert(path,node) - Static.RegisterMenuItem(node) - EndIf - - node.tag=tag - - If win - UpdateWindowMenu(win.gadget) - EndIf - EndIf - EndIf - End Method - - Rem - bbdoc: Remove menu item and its children. - about: @path is the path to the menu item. Root cannot be removed. - EndRem - Method Remove(path:String) - If path<>"/" - Prune(path) - - If win - UpdateWindowMenu(win.gadget) - EndIf - EndIf - End Method - - Rem - bbdoc: Change a menu tag (and therefore its text). - about: @path is the path to the menu item. Root cannot be changed. - EndRem - Method SetTag(path:String, tag:Object) - If path<>"/" - Local node:TMenuItem=ResolvePath(path) - - If node - SetMenuText(node.gadget,tag.ToString()) - node.tag=tag - - If win - UpdateWindowMenu(win.gadget) - EndIf - EndIf - EndIf - End Method - - Rem - bbdoc: Change a menu check. - about: @path is the path to the menu item. Root cannot be changed. - EndRem - Method Check(path:String, check:Int) - If path<>"/" - Local node:TMenuItem=ResolvePath(path) - - If node - If check - CheckMenu(node.gadget) - Else - UncheckMenu(node.gadget) - EndIf - - If win - UpdateWindowMenu(win.gadget) - EndIf - EndIf - EndIf - End Method - - Rem - about: Is a menu item checked. - EndRem - Method IsChecked:Int(path:String) - Local ret:Int=False - - If path<>"/" - Local node:TMenuItem=ResolvePath(path) - - If node - ret=MenuChecked(node.gadget) - EndIf - EndIf - - Return ret - End Method - - Rem - bbdoc: Enable/disable a menu item. - about: @path is the path to the menu item. Root cannot be changed. - EndRem - Method Enable(path:String, enab:Int) - If path<>"/" - Local node:TMenuItem=ResolvePath(path) - - If node - If enab - EnableMenu(node.gadget) - Else - DisableMenu(node.gadget) - EndIf - - If win - UpdateWindowMenu(win.gadget) - EndIf - EndIf - EndIf - End Method - - Rem - about: Is a menu item enabled. - EndRem - Method IsEnabled:Int(path:String) - Local ret:Int=False - - If path<>"/" - Local node:TMenuItem=ResolvePath(path) - - If node - ret=MenuEnabled(node.gadget) - EndIf - EndIf - - Return ret - End Method - - Rem - bbdoc: Called when the an item is selected in the menu. - EndRem - Method OnMenuItem(path:String, tag:Object) - End Method - - Rem - bbdoc: Popup the menu. - about: @win is a gadget to pass to MaxGUI. For some reason you need this, and the docs say it should be a window. - When I've tried any gadget would suffice, but don't come crying to me if it stops working for non-window gadgets. - EndRem - Method Popup(g:TMWidget) - PopupWindowMenu(g.gadget,root) - End Method - - Method ToString:String() - Return "TMMenu:"+super.ToString() - End Method -End Type - - -Rem -bbdoc: Defines a managed canvas. -EndRem -Type TMCanvas Extends TMWidget - - Rem - bbdoc: Creates a managed canvas. - returns: The created canvas. - about: @x, @y, @w, @h, @group, @style and @gfxflags act the same as the MaxGUI arguments to @CreateCanvas(), except that @group is a TMWidget. - EndRem - Method Create:TMCanvas(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0, gfxflags:Int=GRAPHICS_BACKBUFFER) - OnRedrawEvent=New TMWEventListVoid - OnButtonDownEvent=New TMWEventListInt - OnButtonUpEvent=New TMWEventListInt - OnMouseMoveEvent=New TMWEventListIntInt - OnMouseWheelEvent=New TMWEventListInt - OnKeyDownEvent=New TMWEventListInt - OnKeyUpEvent=New TMWEventListInt - OnKeyEvent=New TMWEventListInt - BaseInitialise(CreateCanvas(x,y,w,h,group.gadget,style,gfxflags),group) - typename="TMCanvas" - Return Self - End Method - - Rem - bbdoc: Set the graphics so that the canvas can be drawn onto. - EndRem - Method SetupGraphics() - SetGraphics(CanvasGraphics(gadget)) - End Method - - Rem - bbdoc: Called when the canvas should be redrawn. - EndRem - Method OnRedraw() - End Method - - Rem - bbdoc: Called when the canvas should be redrawn. - EndRem - Field OnRedrawEvent:TMWEventListVoid - - Rem - bbdoc: Called when the a mouse button is pressed. - about: @button is the pressed button. - EndRem - Method OnButtonDown(button:Int) - End Method - - Rem - bbdoc: Called when the a mouse button is pressed. - EndRem - Field OnButtonDownEvent:TMWEventListInt - - Rem - bbdoc: Called when the a mouse button is released. - about: @button is the released button. - EndRem - Method OnButtonUp(button:Int) - End Method - - Rem - bbdoc: Called when the a mouse button is released. - EndRem - Field OnButtonUpEvent:TMWEventListInt - - Rem - bbdoc: Called when the mouse moves. - about: @x and @y are the mouse co-ordinates. - EndRem - Method OnMouseMove(x:Int, y:Int) - End Method - - Rem - bbdoc: Called when the an item is selected. - EndRem - Field OnMouseMoveEvent:TMWEventListIntInt - - Rem - bbdoc: Called when the mouse wheel moves. - about: @delta is the amount the wheel moves. - EndRem - Method OnMouseWheel(delta:Int) - End Method - - Rem - bbdoc: Called when the mouse wheel moves. - EndRem - Field OnMouseWheelEvent:TMWEventListInt - - Rem - bbdoc: Called when a key is held down. - about: @code is the key code. - EndRem - Method OnKeyDown(code:Int) - End Method - - Rem - bbdoc: Called when a key is held down. - EndRem - Field OnKeyDownEvent:TMWEventListInt - - Rem - bbdoc: Called when a key is released. - about: @code is the key code. - EndRem - Method OnKeyUp(code:Int) - End Method - - Rem - bbdoc: Called when a key is released. - EndRem - Field OnKeyUpEvent:TMWEventListInt - - Rem - bbdoc: Called when a key character is generated. - about: @code is the unicode value. - EndRem - Method OnKey(code:Int) - End Method - - Rem - bbdoc: Called when a key character is generated. - EndRem - Field OnKeyEvent:TMWEventListInt - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETPAINT - OnRedraw() - OnRedrawEvent.Fire(Self) - Case EVENT_MOUSEDOWN - OnButtonDown(e.data) - OnButtonDownEvent.Fire(Self,e.data) - Case EVENT_MOUSEUP - OnButtonUp(e.data) - OnButtonUpEvent.Fire(Self,e.data) - Case EVENT_MOUSEMOVE - OnMouseMove(e.x,e.y) - OnMouseMoveEvent.Fire(Self,e.x,e.y) - Case EVENT_MOUSEWHEEL - OnMouseWheel(e.data) - OnMouseWheelEvent.Fire(Self,e.data) - Case EVENT_KEYDOWN - OnKeyDown(e.data) - OnKeyDownEvent.Fire(Self,e.data) - Case EVENT_KEYUP - OnKeyUp(e.data) - OnKeyUpEvent.Fire(Self,e.data) - Case EVENT_KEYCHAR - OnKey(e.data) - OnKeyEvent.Fire(Self,e.data) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a toolbar. -EndRem -Type TMToolbar Extends TMWidget - Rem - bbdoc: Creates a managed toolbar. - returns: The created toolbar. - about: @source, @group and @style act the same as the MaxGUI arguments to @CreateToolBar(), except that @group is a TMWidget. - If @values is not NULL it is used to load up the initial options. - IMPORTANT: It is really not recommended to use COMBOBOX_EDITABLE as OnIndexChanged() is called when the user edits the field. - There seems to be no easy way to remedy this. - EndRem - Method Create:TMToolbar(source:Object, group:TMWidget, style:Int=0) - OnSelectedEvent=New TMWEventListInt - BaseInitialise(CreateToolBar(source,0,0,0,0,group.gadget,style),group) - typename="TMToolbar" - Return Self - End Method - - Rem - bbdoc: Adds an item to the toolbar. - EndRem - Method AddItem(icon:Int, flags:Int=0, tooltip:String=Null) - AddGadgetItem(gadget,"",flags,icon,tooltip,Null) - End Method - - Rem - bbdoc: Set the tooltips. - EndRem - Method SetTooltips(tips:String[]) - SetToolBarTips(gadget,tips) - End Method - - Rem - bbdoc: Enable or disable a particular item. - EndRem - Method ItemEnabled(index:Int, state:Int) - If state - EnableGadgetItem(gadget,index) - Else - DisableGadgetItem(gadget,index) - EndIf - End Method - - Rem - bbdoc: Called when an icon is selected. - about: @index is the selected index. - EndRem - Method OnSelected(index:Int) - End Method - - Rem - bbdoc: Called when an icon is selected. - EndRem - Field OnSelectedEvent:TMWEventListInt - - Method Handle(e:TEvent) - Select e.id - Case EVENT_GADGETACTION - OnSelected(e.data) - OnSelectedEvent.Fire(Self,e.data) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed panel. -EndRem -Type TMPanel Extends TMWidget - - Rem - bbdoc: Creates a managed panel. - returns: The created panel. - about: @x, @y, @w, @h, @group, @style and @title act the same as the MaxGUI arguments to @CreatePanel(), except that @group is a TMWidget. - EndRem - Method Create:TMPanel(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0, title:String="") - OnButtonDownEvent=New TMWEventListInt - OnButtonUpEvent=New TMWEventListInt - OnMouseMoveEvent=New TMWEventListIntInt - OnMouseWheelEvent=New TMWEventListInt - OnKeyDownEvent=New TMWEventListInt - OnKeyUpEvent=New TMWEventListInt - OnKeyEvent=New TMWEventListInt - BaseInitialise(CreatePanel(x,y,w,h,group.gadget,style,title),group) - typename="TMPanel" - Return Self - End Method - - Rem - bbdoc: Called when the a mouse button is pressed. - about: @button is the pressed button. - EndRem - Method OnButtonDown(button:Int) - End Method - - Rem - bbdoc: Called when the a mouse button is pressed. - EndRem - Field OnButtonDownEvent:TMWEventListInt - - Rem - bbdoc: Called when the a mouse button is released. - about: @button is the released button. - EndRem - Method OnButtonUp(button:Int) - End Method - - Rem - bbdoc: Called when the a mouse button is released. - EndRem - Field OnButtonUpEvent:TMWEventListInt - - Rem - bbdoc: Called when the mouse moves. - about: @x and @y are the mouse co-ordinates. - EndRem - Method OnMouseMove(x:Int, y:Int) - End Method - - Rem - bbdoc: Called when the an item is selected. - EndRem - Field OnMouseMoveEvent:TMWEventListIntInt - - Rem - bbdoc: Called when the mouse wheel moves. - about: @delta is the amount the wheel moves. - EndRem - Method OnMouseWheel(delta:Int) - End Method - - Rem - bbdoc: Called when the mouse wheel moves. - EndRem - Field OnMouseWheelEvent:TMWEventListInt - - Rem - bbdoc: Called when a key is held down. - about: @code is the key code. - EndRem - Method OnKeyDown(code:Int) - End Method - - Rem - bbdoc: Called when a key is held down. - EndRem - Field OnKeyDownEvent:TMWEventListInt - - Rem - bbdoc: Called when a key is released. - about: @code is the key code. - EndRem - Method OnKeyUp(code:Int) - End Method - - Rem - bbdoc: Called when a key is released. - EndRem - Field OnKeyUpEvent:TMWEventListInt - - Rem - bbdoc: Called when a key character is generated. - about: @code is the unicode value. - EndRem - Method OnKey(code:Int) - End Method - - Rem - bbdoc: Called when a key character is generated. - EndRem - Field OnKeyEvent:TMWEventListInt - - Method Handle(e:TEvent) - Select e.id - Case EVENT_MOUSEDOWN - OnButtonDown(e.data) - OnButtonDownEvent.Fire(Self,e.data) - Case EVENT_MOUSEUP - OnButtonUp(e.data) - OnButtonUpEvent.Fire(Self,e.data) - Case EVENT_MOUSEMOVE - OnMouseMove(e.x,e.y) - OnMouseMoveEvent.Fire(Self,e.x,e.y) - Case EVENT_MOUSEWHEEL - OnMouseWheel(e.data) - OnMouseWheelEvent.Fire(Self,e.data) - Case EVENT_KEYDOWN - OnKeyDown(e.data) - OnKeyDownEvent.Fire(Self,e.data) - Case EVENT_KEYUP - OnKeyUp(e.data) - OnKeyUpEvent.Fire(Self,e.data) - Case EVENT_KEYCHAR - OnKey(e.data) - OnKeyEvent.Fire(Self,e.data) - Default - super.Handle(e) - End Select - End Method -End Type - - -Rem -bbdoc: Defines a managed progress bar. -EndRem -Type TMProgressBar Extends TMWidget - - Rem - bbdoc: Creates a managed progress bar. - returns: The created progress bar. - about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateProgBar(), except that @group is a TMWidget. - EndRem - Method Create:TMProgressBar(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) - BaseInitialise(CreateProgBar(x,y,w,h,group.gadget,style),group) - typename="TMProgressBar" - Return Self - End Method - - Rem - bbdoc: Set the value for the progress bar. - about: @value is the value (between 0 and 1). - EndRem - Method SetValue(value:Double) - UpdateProgBar(gadget,value) - End Method -End Type - - -Rem -bbdoc: Enters the event processing loop. -about: @top is the top level TMWindow For the application. The loop continues Until the @closed Field of this window is TRUE. -Your code can do it's own event loop if required -- all this function does is continually call WaitEvent and is simply provided as -a basic main loop. -EndRem -Function MWidgetMainLoop(top:TMWindow) - While Not top.closed - WaitEvent() - Wend -End Function - - -Private - -Function FixedExtractDir:String(p:String) - p=ExtractDir(p) - If p.length=0 - p="/" - EndIf - Return p -End Function - -Type Static - Global list:TList - Global menu:TList - Global menuid:Int - - Function Init() - list=CreateList() - menu=CreateList() - menuid=0 - AddHook(EmitEventHook,EventHandler) - End Function - - Function EventHandler:Object(id:Int, data:Object, context:Object) - Local e:TEvent=TEvent(data) - - DebugLog "Got event : " + e.ToString() - - If e - If e.id=EVENT_MENUACTION - For Local m:TMenuItem=EachIn menu - If m.id=e.data - DebugLog "Passing menu event to " + m.owner.ToString() - m.owner.OnMenuItem(m.path,m.tag) - If m.callback - m.callback(m.owner,m.path,m.tag) - EndIf - EndIf - Next - Else - For Local g:TMWidget=EachIn list - If g And g.gadget And g.gadget=e.source - DebugLog "Passing event to " + g.ToString() - g.Handle(e) - EndIf - Next - EndIf - EndIf - - Return e - End Function - - Function Register(w:TMWidget) - list.AddLast(w) - w.OnManage() - w.OnManageEvent.Fire(w) - End Function - - Function Deregister(w:TMWidget) - w.OnUnmanage() - w.OnUnmanageEvent.Fire(w) - list.Remove(w) - End Function - - Function RegisterMenuItem(m:TMenuItem) - menu.AddLast(m) - End Function - - Function DeregisterMenuItem(m:TMenuItem) - menu.Remove(m) - End Function - - Function NextMenuID:Int() - menuid:+1 - Return menuid - End Function -End Type - +Rem +bbdoc: noddybox.mwidget +about:

Provides a simply class based interface to the MaxGUI. Note that all widgets have create type methods. For these to work correctly with +sub-classes they must be called through a new operation, e.g.

+
+Type MyApp Extends TMWindow
+    Method OnClose(e:TEvent)
+        closed=Confirm("Really quit?")
+    End Method
+End Type
+
+Local window:TMWindow=New MyApp.Create("Test",100,100,640,400)
+MWidgetMainLoop(window)
+
+

+There are two methods of getting events. One is to subclass and override the events, as with the @OnClose() above. The other is to set +function pointers in the matching event lists, @OnCloseEvent in this instance. For instance: +

+
+Function OnClose(o:TMWidget)
+    Local w:TMWindow=TMWindow(o)
+    w.closed=Confirm("Really quit?")
+End Function
+
+Local window:TMWindow=New TMWindow.Create("Test",100,100,640,400)
+window.OnCloseEvent.Add(OnClose)
+MWidgetMainLoop(window)
+
+

+When using the function callback method of capturing events, the parameters to the function are the same as the overridable method with the addition +of the managed widget which is passed in as the first argument. +

+EndRem +Module noddybox.mwidget + +ModuleInfo "Framework: Simple Managed Widget Classes" +ModuleInfo "Copyright: Public Domain" +ModuleInfo "Author: Ian Cowburn" +ModuleInfo "Version: $Revision$" + +' $Id$ + +Strict +Import brl.maxgui +Import brl.linkedlist +Import brl.event +Import brl.timer +Import brl.map +Import brl.filesystem + +Type TMWEventListBase Abstract + Field list:TList + Method New() + list=CreateList() + End Method +End Type + +Type TMWFuncVoid + Field func(w:TMWidget) + Function Create:TMWFuncVoid(func(w:TMWidget)) + Local o:TMWFuncVoid=New TMWFuncVoid + o.func=func + Return o + End Function +End Type + +Type TMWFuncInt + Field func(w:TMWidget, a:Int) + Function Create:TMWFuncInt(func(w:TMWidget, a:Int)) + Local o:TMWFuncInt=New TMWFuncInt + o.func=func + Return o + End Function +End Type + +Type TMWFuncIntInt + Field func(w:TMWidget, a:Int, b:Int) + Function Create:TMWFuncIntInt(func(w:TMWidget, a:Int, b:Int)) + Local o:TMWFuncIntInt=New TMWFuncIntInt + o.func=func + Return o + End Function +End Type + +Type TMWFuncString + Field func(w:TMWidget, a:String) + Function Create:TMWFuncString(func(w:TMWidget, a:String)) + Local o:TMWFuncString=New TMWFuncString + o.func=func + Return o + End Function +End Type + + +Type TMWFuncStringObject + Field func(w:TMWidget, a:String, b:Object) + Function Create:TMWFuncStringObject(func(w:TMWidget, a:String, b:Object)) + Local o:TMWFuncStringObject=New TMWFuncStringObject + o.func=func + Return o + End Function +End Type + + +Rem +bbdoc: Defines an event list for functions that take the parameters (w:TMWidget) +EndRem +Type TMWEventListVoid Extends TMWEventListBase Final + Rem + bbdoc: Adds a callback function. + EndRem + Method Add(func(w:TMWidget)) + list.AddLast(TMWFuncVoid.Create(func)) + End Method + + Rem + bbdoc: Clears all callback functions. + EndRem + Method Clear() + list.Clear() + End Method + + Rem + bbdoc: Removes a callback function. + EndRem + Method Remove(func(w:TMWidget)) + For Local fp:TMWFuncVoid=EachIn list + If fp.func=func + list.Remove(fp) + Return + EndIf + Next + End Method + + Method Fire(w:TMWidget) + For Local fp:TMWFuncVoid=EachIn list + fp.func(w) + Next + End Method +End Type + + +Rem +bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:Int) +EndRem +Type TMWEventListInt Extends TMWEventListBase Final + Rem + bbdoc: Adds a callback function. + EndRem + Method Add(func(w:TMWidget, a:Int)) + list.AddLast(TMWFuncInt.Create(func)) + End Method + + Rem + bbdoc: Clears all callback functions. + EndRem + Method Clear() + list.Clear() + End Method + + Rem + bbdoc: Removes a callback function. + EndRem + Method Remove(func(w:TMWidget, a:Int)) + For Local fp:TMWFuncInt=EachIn list + If fp.func=func + list.Remove(fp) + Return + EndIf + Next + End Method + + Method Fire(w:TMWidget, a:Int) + For Local fp:TMWFuncInt=EachIn list + fp.func(w,a) + Next + End Method +End Type + + +Rem +bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:String) +EndRem +Type TMWEventListString Extends TMWEventListBase Final + Rem + bbdoc: Adds a callback function. + EndRem + Method Add(func(w:TMWidget, a:String)) + list.AddLast(TMWFuncString.Create(func)) + End Method + + Rem + bbdoc: Clears all callback functions. + EndRem + Method Clear() + list.Clear() + End Method + + Rem + bbdoc: Removes a callback function. + EndRem + Method Remove(func(w:TMWidget, a:String)) + For Local fp:TMWFuncString=EachIn list + If fp.func=func + list.Remove(fp) + Return + EndIf + Next + End Method + + Method Fire(w:TMWidget, a:String) + For Local fp:TMWFuncString=EachIn list + fp.func(w,a) + Next + End Method +End Type + + +Rem +bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:Int, b:Int) +EndRem +Type TMWEventListIntInt Extends TMWEventListBase Final + Rem + bbdoc: Adds a callback function. + EndRem + Method Add(func(w:TMWidget, a:Int, b:Int)) + list.AddLast(TMWFuncIntInt.Create(func)) + End Method + + Rem + bbdoc: Clears all callback functions. + EndRem + Method Clear() + list.Clear() + End Method + + Rem + bbdoc: Removes a callback function. + EndRem + Method Remove(func(w:TMWidget, a:Int, b:Int)) + For Local fp:TMWFuncIntInt=EachIn list + If fp.func=func + list.Remove(fp) + Return + EndIf + Next + End Method + + Method Fire(w:TMWidget, a:Int, b:Int) + For Local fp:TMWFuncIntInt=EachIn list + fp.func(w,a,b) + Next + End Method +End Type + + +Rem +bbdoc: Defines an event list for functions that take the parameters (w:TMWidget, a:String, b:Object) +EndRem +Type TMWEventListStringObject Extends TMWEventListBase Final + Rem + bbdoc: Adds a callback function. + EndRem + Method Add(func(w:TMWidget, a:String, b:Object)) + list.AddLast(TMWFuncStringObject.Create(func)) + End Method + + Rem + bbdoc: Clears all callback functions. + EndRem + Method Clear() + list.Clear() + End Method + + Rem + bbdoc: Removes a callback function. + EndRem + Method Remove(func(w:TMWidget, a:String, b:Object)) + For Local fp:TMWFuncStringObject=EachIn list + If fp.func=func + list.Remove(fp) + Return + EndIf + Next + End Method + + Method Fire(w:TMWidget, a:String, b:Object) + For Local fp:TMWFuncStringObject=EachIn list + fp.func(w,a,b) + Next + End Method +End Type + + +Rem +bbdoc: Defines a base managed widget type. +EndRem +Type TMWidget Abstract + + Rem + bbdoc: The underlying BlitzMAX GUI Gadget + EndRem + Field gadget:TGadget + + Rem + bbdoc: The parent of this managed widget + EndRem + Field parent:TMWidget + + Rem + bbdoc: Children of this managed widget + EndRem + Field children:TList + + Field typename:String + Field timer:TTimer + + Method Delete() + FreeGadget(gadget) + End Method + + Rem + bbdoc: Handles an event. + about: Sub-classes will generally override this to handle events directed at themselves. + If the event is unhandled then the event should be passed up to the parent type. @e holds the TEvent. + EndRem + Method Handle(e:TEvent) + Select e.id + Case EVENT_MOUSEENTER + OnMouseEnter() + OnMouseEnterEvent.Fire(Self) + Case EVENT_MOUSELEAVE + OnMouseLeave() + OnMouseLeaveEvent.Fire(Self) + Case EVENT_TIMERTICK + OnTimer() + OnTimerEvent.Fire(Self) + End Select + End Method + + Rem + bbdoc: Activate the widget (give it keyboard focus). + EndRem + Method Activate(state:Int) + ActivateGadget(gadget) + End Method + + Rem + bbdoc: Enables/disables a widget. + EndRem + Method Enabled(state:Int) + If state + EnableGadget(gadget) + Else + DisableGadget(gadget) + EndIf + End Method + + Rem + bbdoc: Is widget enabled. + returns: TRUE if enabled. + EndRem + Method IsEnabled:Int() + Return Not GadgetDisabled(gadget) + End Method + + Rem + bbdoc: Hide/show the widget. + EndRem + Method Hidden(state:Int) + If state + HideGadget(gadget) + Else + ShowGadget(gadget) + EndIf + End Method + + Rem + bbdoc: Is widget hidden. + returns: TRUE if hidden. + EndRem + Method IsHidden:Int() + Return GadgetHidden(gadget) + End Method + + Rem + bbdoc: The widget's position. + returns: The widget's X co-ordinate. + EndRem + Method X:Int() + Return GadgetX(gadget) + End Method + + Rem + bbdoc: The widget's position. + returns: The widget's Y co-ordinate. + EndRem + Method Y:Int() + Return GadgetY(gadget) + End Method + + Rem + bbdoc: The widget's size. + returns: The widget's width. + EndRem + Method Width:Int() + Return GadgetWidth(gadget) + End Method + + Rem + bbdoc: The widget's size. + returns: The widget's height. + EndRem + Method Height:Int() + Return GadgetHeight(gadget) + End Method + + Rem + bbdoc: The widget's client size. + returns: The widget's client width. + EndRem + Method Client_Width:Int() + Return ClientWidth(gadget) + End Method + + Rem + bbdoc: The widget's client size. + returns: The widget's client height. + EndRem + Method Client_Height:Int() + Return ClientHeight(gadget) + End Method + + Rem + bbdoc: Set the widget's font. + EndRem + Method Font(font:TGUIFont) + SetGadgetFont(gadget,font) + End Method + + Rem + bbdoc: Set the widgets's layout. See Max GUIs SetGadgetLayout() for details. + EndRem + Method Layout(Left:Int, Right:Int, top:Int, bottom:Int) + SetGadgetLayout(gadget,Left,Right,top,bottom) + End Method + + Rem + bbdoc: Set the widget's position and size. + EndRem + Method SetShape(x:Int, y:Int, width:Int, height:Int) + SetGadgetShape(gadget,x,y,width,height) + End Method + + Rem + bbdoc: Set the widgets's alpha. + EndRem + Method Alpha(a:Double) + SetGadgetAlpha(gadget,a) + End Method + + Rem + bbdoc: Set the widgets's text colour. + EndRem + Method TextColour(r:Int, g:Int, b:Int) + SetGadgetTextColor(gadget,r,g,b) + End Method + + Rem + bbdoc: Set the widgets's background colour. + EndRem + Method BackColour(r:Int, g:Int, b:Int) + SetGadgetColor(gadget,r,g,b) + End Method + + Rem + bbdoc: Set the widgets's text. + EndRem + Method Text(s:String) + SetGadgetText(gadget,s) + End Method + + Rem + bbdoc: Print the widget + EndRem + Method Print() + GadgetPrint(gadget) + End Method + + Rem + bbdoc: Perform a cut on the widget + EndRem + Method Cut() + GadgetCut(gadget) + End Method + + Rem + bbdoc: Perform a copy on the widget + EndRem + Method Copy() + GadgetCopy(gadget) + End Method + + Rem + bbdoc: Perform a paste on the widget + EndRem + Method Paste() + GadgetPaste(gadget) + End Method + + Rem + bbdoc: Allocates a timer for this widget. + about: Create a Blitz MAX TTimer that is fired @hertz times a second. When the timer pulses then @OnTimer() is called. + If this routine is called when a timer is already active, then the timer is re-initialised with the passed hertz. + EndRem + Method SetTimer(hertz:Double) + ClearTimer() + timer=CreateTimer(hertz,CreateEvent(EVENT_TIMERTICK,gadget)) + End Method + + Rem + bbdoc: Clears timer previously activated by @SetTimer(). + EndRem + Method ClearTimer() + If timer + StopTimer(timer) + EndIf + timer=Null + End Method + + Rem + bbdoc: Called when the widget's timer fires. + EndRem + Method OnTimer() + End Method + + Rem + bbdoc: Called when the widget's timer fires. + EndRem + Field OnTimerEvent:TMWEventListVoid + + Rem + bbdoc: Called when the widget is managed. + EndRem + Method OnManage() + End Method + + Rem + bbdoc: Called when the widget is managed. + EndRem + Field OnManageEvent:TMWEventListVoid + + Rem + bbdoc: Called when the widget is unmanaged. + EndRem + Method OnUnmanage() + End Method + + Rem + bbdoc: Called when the widget is unmanaged. + EndRem + Field OnUnmanageEvent:TMWEventListVoid + + Rem + bbdoc: Called when the mouse enters. + EndRem + Method OnMouseEnter() + End Method + + Rem + bbdoc: Called when the mouse enters. + EndRem + Field OnMouseEnterEvent:TMWEventListVoid + + Rem + bbdoc: Called when the mouse leaves. + EndRem + Method OnMouseLeave() + End Method + + Rem + bbdoc: Called when the mouse leaves. + EndRem + Field OnMouseLeaveEvent:TMWEventListVoid + + Rem + bbdoc: Fires an event at this managed widget. + about: The arguments are the same as @CreateEvent(), but no source is passed in. + EndRem + Method Emit(id:Int, data:Int=0, mods:Int=0, x:Int=0, y:Int=0,extra:Object=Null) + EmitEvent(CreateEvent(id,gadget,data,mods,x,y,extra)) + End Method + + Rem + bbdoc: Initialises the base managed widget stuff. + about: All sub-classes must call this! @gadget is the created TGadget for this instance, + and @parent is the parent managed widget (NULL for none). + EndRem + Method BaseInitialise(gadget:TGadget, parent:TMWidget) + self.children=CreateList() + self.gadget=gadget + self.parent=parent + + OnTimerEvent=New TMWEventListVoid + OnManageEvent=New TMWEventListVoid + OnUnmanageEvent=New TMWEventListVoid + OnMouseEnterEvent=New TMWEventListVoid + OnMouseLeaveEvent=New TMWEventListVoid + + If self.parent + self.parent.children.AddLast(Self) + EndIf + + Static.Register(Self) + End Method + + Rem + bbdoc: Removes the managed widget from the internal lists. + about: All child objects will also be unmanaged. + EndRem + Method Unmanage() + Static.Deregister(Self) + End Method + + Method ToString:String() + Return typename+":"+super.ToString() + End Method +End Type + + +Rem +bbdoc: Defines a managed window. +EndRem +Type TMWindow Extends TMWidget + + Rem + bbdoc: Creates a managed window. + returns: The created window. + about: @name, @x, @y, @w, @h, @group and @flags act the same as the MaxGUI arguments to @CreateWindow(), except that @group is a TMWidget. + EndRem + Method Create:TMWindow(name:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget=Null, flags:Int=15) + closed=False + + OnMoveEvent=New TMWEventListIntInt + OnResizeEvent=New TMWEventListIntInt + OnCloseEvent=New TMWEventListVoid + OnDropEvent=New TMWEventListString + + Local g:TGadget + + If group + g=CreateWindow(name,x,y,w,h,group.gadget,flags) + Else + g=CreateWindow(name,x,y,w,h,Null,flags) + EndIf + + BaseInitialise(g,group) + typename="TMWindow" + Return Self + End Method + + Rem + bbdoc: Set to TRUE when the window is closed (the user has pressed the close gadget). + EndRem + Field closed:Int + + Rem + bbdoc: Activate the window. + EndRem + Method Activate(state:Int) + ActivateWindow(gadget) + End Method + + Rem + bbdoc: Send a close event to this window. + EndRem + Method Close() + Emit(EVENT_WINDOWCLOSE) + End Method + + Rem + bbdoc: Hide to show the window. + about: Note that this sets the @closed field to the @state passed in. + EndRem + Method Hidden(state:Int) + closed=state + super.Hidden(state) + End Method + + Rem + bbdoc: Set the window's status text. + EndRem + Method StatusText(text:String) + SetStatusText(gadget,text) + End Method + + Rem + bbdoc: Set the window's minimum size. + EndRem + Method MinSize(width:Int, height:Int) + Return SetMinWindowSize(gadget,width,height) + End Method + + Rem + bbdoc: Restore a minimizwed or maximized window. + EndRem + Method Restore() + Return RestoreWindow(gadget) + End Method + + Rem + bbdoc: Maximize the window. + EndRem + Method Maximize() + Return MaximizeWindow(gadget) + End Method + + Rem + bbdoc: Is the window maximized? + returns:TRUE if the window is maximized + EndRem + Method IsMaximized() + Return WindowMaximized(gadget) + End Method + + Rem + bbdoc: Minimize the window. + EndRem + Method Minimize() + Return MinimizeWindow(gadget) + End Method + + Rem + bbdoc: Is the window minimized? + returns:TRUE if the window is minimized + EndRem + Method IsMinimized() + Return WindowMinimized(gadget) + End Method + + Rem + bbdoc: Called when the window is moved. + about:@x and @y are the new position. + EndRem + Method OnMove(x:Int, y:Int) + End Method + + Rem + bbdoc: Called when the window is moved. + EndRem + Field OnMoveEvent:TMWEventListIntInt + + Rem + bbdoc: Called when the window is resized. + about:@width and @height are the new size. + EndRem + Method OnResize(width:Int, height:Int) + End Method + + Rem + bbdoc: Called when the window is resized. + EndRem + Field OnResizeEvent:TMWEventListIntInt + + Rem + bbdoc: Called when the window's close gadget is pressed. + about: This default implementation sets @closed to TRUE and hide the window if no events are defined in @OnCloseEvent. + EndRem + Method OnClose() + If Not OnCloseEvent.list.Count() + closed=True + Hidden(True) + EndIf + End Method + + Rem + bbdoc: Called when the window's close gadget is pressed. + EndRem + Field OnCloseEvent:TMWEventListVoid + + Rem + bbdoc: Called when a file is dropped in the window. + about: @path is the dropped file. + EndRem + Method OnDrop(path:String) + End Method + + Rem + bbdoc: Called when a file is dropped in the window. + EndRem + Field OnDropEvent:TMWEventListString + + Method Handle(e:TEvent) + Select e.id + Case EVENT_WINDOWACCEPT + OnDrop(String(e.extra)) + OnDropEvent.Fire(Self,String(e.extra)) + Case EVENT_WINDOWMOVE + OnMove(e.x,e.y) + OnMoveEvent.Fire(Self,e.x,e.y) + Case EVENT_WINDOWSIZE + OnResize(e.x,e.y) + OnResizeEvent.Fire(Self,e.x,e.y) + Case EVENT_WINDOWCLOSE + OnClose() + OnCloseEvent.Fire(Self) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed button push button. +EndRem +Type TMButton Extends TMWidget + + Rem + bbdoc: Creates a managed push button. + returns: The created button. + about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. + EndRem + Method Create:TMButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) + OnPressEvent=New TMWEventListVoid + BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_PUSH),group) + typename="TMButton" + Return Self + End Method + + Rem + bbdoc: Creates a managed push button used for an OK button + returns: The created button. + about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. + EndRem + Method CreateOK:TMButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) + OnPressEvent=New TMWEventListVoid + BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_OK),group) + typename="TMButton" + Return Self + End Method + + Rem + bbdoc: Creates a managed push button used for a Cancel button + returns: The created button. + about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. + EndRem + Method CreateCancel:TMButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) + OnPressEvent=New TMWEventListVoid + BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_OK),group) + typename="TMButton" + Return Self + End Method + + Rem + bbdoc: Called when the button is pressed. + EndRem + Method OnPress() + End Method + + Rem + bbdoc: Called when the button is pressed. + EndRem + Field OnPressEvent:TMWEventListVoid + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + OnPress() + OnPressEvent.Fire(Self) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed checkbox. +EndRem +Type TMCheckbox Extends TMWidget + Rem + bbdoc: Creates a managed checkbox. + returns: The created checkbox. + about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. + EndRem + Method Create:TMCheckbox(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) + OnPressEvent=New TMWEventListInt + BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_CHECKBOX),group) + typename="TMCheckbox" + Return Self + End Method + + Rem + bbdoc: Sets the state of the check. + EndRem + Method Checked(check:Int) + SetButtonState(gadget,check) + End Method + + Rem + bbdoc: Is the checkbox checked? + returns:TRUE if the checkbox is checked. + EndRem + Method IsChecked() + Return ButtonState(gadget) + End Method + + Rem + bbdoc: Called when the checkbox is pressed. + about: @checked is the current state. + EndRem + Method OnPress(checked:Int) + End Method + + Rem + bbdoc: Called when the checkbox is pressed. + EndRem + Field OnPressEvent:TMWEventListInt + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + OnPress(e.data) + OnPressEvent.Fire(Self,e.data) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed radio button. +EndRem +Type TMRadioButton Extends TMCheckbox + Field set:TMRadioButtonSet + + Rem + bbdoc: Creates a managed radio button. + returns: The created radio button. + about: @label, @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateButton(), except that @group is a TMWidget. + EndRem + Method Create:TMRadioButton(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget) + OnPressEvent=New TMWEventListInt + BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_RADIO),group) + typename="TMRadioButton" + Return Self + End Method + + Rem + bbdoc: Called when the checkbox is pressed. + about: @checked is the current state. In this default implementation the @TMRadioButtonSet which this button belongs too will fire + its @OnSelected() member. + EndRem + Method OnPress(checked:Int) + If set + set.ButtonFired(Self) + EndIf + End Method +End Type + + +Rem +bbdoc: Defines a set of managed radio button. +EndRem +Type TMRadioButtonSet + Field but:TMRadioButton[] + + Rem + bbdoc: Creates a set of managed radio buttons. + returns: The created set. + about: The radio buttons must have been created prior to calling this. + EndRem + Method Create:TMRadioButtonSet(buttons:TMRadioButton[]) + OnSelectedEvent=New TMWEventListInt + but=buttons + For Local b:TMRadioButton=EachIn but + b.set=Self + Next + Return Self + End Method + + Rem + bbdoc: Sets the active radio button. + about: @index is the index of the button to set. + EndRem + Method Set(index:Int) + but[index].Checked(True) + End Method + + Rem + bbdoc: If using the base TMRadioButton implmentation this will be called when the buttons change. + about: @index is the selected button. + EndRem + Method OnSelected(index:Int) + End Method + + Rem + bbdoc: If using the base TMRadioButton implmentation this will be called when the buttons change. + about: The radio button that fired will be passed into the event. + EndRem + Field OnSelectedEvent:TMWEventListInt + + Rem + bbdoc: Get the active radio button. + returns: The index of the button set. -1 if no button is set. + EndRem + Method Current() + For Local f:Int=0 Until but.length + If but[f].IsChecked() + Return f + EndIf + Next + Return -1 + End Method + + Method ButtonFired(b:TMRadioButton) + For Local f:Int=0 Until but.length + If but[f]=b + OnSelected(f) + OnSelectedEvent.Fire(b,f) + Return + EndIf + Next + End Method +End Type + + +Rem +bbdoc: Defines a managed label. +EndRem +Type TMLabel Extends TMWidget + + Rem + bbdoc: Creates a managed label. + returns: The created label. + about: @label, @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateLabel(), except that @group is a TMWidget. + EndRem + Method Create:TMLabel(label:String, x:Int,y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) + BaseInitialise(CreateLabel(label,x,y,w,h,group.gadget,style),group) + typename="TMLabel" + Return Self + End Method +End Type + + +Rem +bbdoc: Defines a managed text field. +EndRem +Type TMTextField Extends TMWidget + Rem + bbdoc: Creates a managed text field. + returns: The created text field. + about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateTextField(), except that @group is a TMWidget. + EndRem + Method Create:TMTextField(x:Int,y:Int, w:Int, h:Int, group:TMWidget) + OnTextChangedEvent=New TMWEventListString + BaseInitialise(CreateTextField(x,y,w,h,group.gadget),group) + typename="TMTextField" + Return Self + End Method + + Rem + bbdoc: Creates a managed text field for entering passwords. + returns: The created text field. + about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateTextField(), except that @group is a TMWidget. + EndRem + Method CreateSecret:TMTextField(x:Int,y:Int, w:Int, h:Int, group:TMWidget) + BaseInitialise(CreateTextField(x,y,w,h,group.gadget,TEXTFIELD_PASSWORD),group) + typename="TMTextField" + Return Self + End Method + + Rem + bbdoc: The field's text. + returns:The text. + EndRem + Method GetText:String() + Return TextFieldText(gadget) + End Method + + Rem + bbdoc: Called when the text changes. + about: @txt is the content of the field + EndRem + Method OnTextChanged(txt:String) + End Method + + Rem + bbdoc: Called when the text changes. + EndRem + Field OnTextChangedEvent:TMWEventListString + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + Local s:String=TextFieldText(gadget) + OnTextChanged(s) + OnTextChangedEvent.Fire(Self,s) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed text area. +EndRem +Type TMTextArea Extends TMWidget + Rem + bbdoc: Creates a managed text area. + returns: The created text area. + about: @x, @y, @w, @h,, @group and @style act the same as the MaxGUI arguments to @CreateTextArea(), except that @group is a TMWidget. + EndRem + Method Create:TMTextArea(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) + OnTextChangedEvent=New TMWEventListVoid + OnSelectionEvent=New TMWEventListVoid + OnMenuEvent=New TMWEventListVoid + BaseInitialise(CreateTextArea(x,y,w,h,group.gadget,style),group) + typename="TMTextArea" + Return Self + End Method + + Rem + bbdoc: The text area's text. + returns:The text. + EndRem + Method GetText:String(pos:Int=0, length:Int=TEXTAREA_ALL, units:Int=TEXTAREA_CHARS) + Return TextAreaText(gadget,pos,length,units) + End Method + + Rem + bbdoc: Set the widget's font. + EndRem + Method Font(font:TGUIFont) + SetTextAreaFont(gadget,font) + End Method + + Rem + bbdoc: Set the widgets's text colour. + EndRem + Method TextColour(r:Int, g:Int, b:Int) + SetTextAreaColor(gadget,r,g,b,False) + End Method + + Rem + bbdoc: Set the widgets's background colour. + EndRem + Method BackColour(r:Int, g:Int, b:Int) + SetTextAreaColor(gadget,r,g,b,True) + End Method + + Rem + bbdoc: Set the widgets's text. + EndRem + Method Text(s:String) + SetText(s) + End Method + + Rem + bbdoc: Set the widgets's text (see the MaxGUI docs for argument details) + EndRem + Method SetText(s:String, pos:Int=0, length:Int=TEXTAREA_ALL, units:Int=TEXTAREA_CHARS) + SetTextAreaText(gadget,s,pos,length,units) + End Method + + Rem + bbdoc: Set the text area's tab size + EndRem + Method SetTabSize(size:Int) + SetTextAreaTabs(gadget,size) + End Method + + Rem + bbdoc: Get the character position of the specified line. + EndRem + Method GetCharPos:Int(line:Int) + Return TextAreaChar(gadget,line) + End Method + + Rem + bbdoc: Get the cursor's column. + EndRem + Method GetCursorColumn:Int() + Return TextAreaCursor(gadget,TEXTAREA_CHARS) + End Method + + Rem + bbdoc: Get the cursor's row. + EndRem + Method GetCursorRow:Int() + Return TextAreaCursor(gadget,TEXTAREA_LINES) + End Method + + Rem + bbdoc: Get the text length. + EndRem + Method GetLength:Int() + Return TextAreaLen(gadget) + End Method + + Rem + bbdoc: Get the selected texts length. + EndRem + Method GetSelectionLength:Int() + Return TextAreaSelLen(gadget,TEXTAREA_CHARS) + End Method + + Rem + bbdoc: Get the number of selected rows. + EndRem + Method GetSelectionRows:Int() + Return TextAreaSelLen(gadget,TEXTAREA_LINES) + End Method + + Rem + bbdoc: Lock the text area. + EndRem + Method Lock() + Return LockTextArea(gadget) + End Method + + Rem + bbdoc: Unlock the text area. + EndRem + Method Unlock() + Return UnlockTextArea(gadget) + End Method + + Rem + bbdoc: Set the format. See the MaxGUI docs for details. + EndRem + Method Format(r:Int, g:Int, b:Int, flags:Int, pos:Int=0, length:Int=TEXTAREA_ALL, units:Int=TEXTAREA_CHARS ) + FormatTextAreaText(gadget,r,g,b,flags,pos,length,units) + End Method + + Rem + bbdoc: Called when the text changes. + EndRem + Method OnTextChanged() + End Method + + Rem + bbdoc: Called when the text changes. + EndRem + Field OnTextChangedEvent:TMWEventListVoid + + Rem + bbdoc: Called when the selection or cursor changes. + EndRem + Method OnSelection() + End Method + + Rem + bbdoc: Called when the selection or cursor changes. + EndRem + Field OnSelectionEvent:TMWEventListVoid + + Rem + bbdoc: Called when the context menu is requested. + EndRem + Method OnMenu() + End Method + + Rem + bbdoc: Called when the context menu is requested. + EndRem + Field OnMenuEvent:TMWEventListVoid + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + OnTextChanged() + OnTextChangedEvent.Fire(Self) + Case EVENT_GADGETSELECT + OnSelection() + OnSelectionEvent.Fire(Self) + Case EVENT_GADGETMENU + OnMenu() + OnMenuEvent.Fire(Self) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed slider. +EndRem +Type TMSlider Extends TMWidget + Rem + bbdoc: Creates a managed slider. + returns: The created slider. + about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateSlider(), except that @group is a TMWidget. + EndRem + Method Create:TMSlider(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) + OnValueChangedEvent=New TMWEventListInt + BaseInitialise(CreateSlider(x,y,w,h,group.gadget,style),group) + typename="TMSlider" + Return Self + End Method + + Rem + bbdoc: Set the sliders's min/max values. + about: See the MaxGUI docs for how this affects scrollbar style sliders. + EndRem + Method SetRange(range0:Int,range1:Int) + Return SetSliderRange(gadget,range0,range1) + End Method + + Rem + bbdoc: Set the sliders's value. + EndRem + Method SetValue(value:Int) + Return SetSliderValue(gadget,value) + End Method + + Rem + bbdoc: The sliders's value. + returns:The value. + EndRem + Method GetValue:Int() + Return SliderValue(gadget) + End Method + + Rem + bbdoc: Called when the slider moves. + about: @val is the new slider value. + EndRem + Method OnValueChanged(val:Int) + End Method + + Rem + bbdoc: Called when the slider moves. + EndRem + Field OnValueChangedEvent:TMWEventListInt + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + OnValueChanged(e.data) + OnValueChangedEvent.Fire(Self,e.data) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines an entry in a list style gadget. +about: Always use @CreateListEntry() to create this object. +EndRem +Type TMListEntry + Rem + bbdoc: The text associated with a list entry. + EndRem + Field text:String + Rem + bbdoc: The flags associated with a list entry. + EndRem + Field flags:Int + Rem + bbdoc: The icon associated with a list entry. + EndRem + Field icon:Int + Rem + bbdoc: The tooltip associated with a list entry. + EndRem + Field tip:String + Rem + bbdoc: The extra object associated with a list entry. + EndRem + Field extra:Object + + Function Create:TMListEntry(text:String,flags:Int,icon:Int,tip:String,extra:Object) + Local o:TMListEntry=New TMListEntry + o.text=text + o.flags=flags + o.icon=icon + o.tip=tip + o.extra=extra + Return o + End Function +End Type + + +Rem +bbdoc: Creates a list entry. +returns: The list entry. +about: @text, @flags, @icon, @tip and @extra are the fields detailed in MaxGUI @AddGadgetItem(). +EndRem +Function CreateListEntry:TMListEntry(text:String,flags:Int=0,icon:Int=-1,tip:String="",extra:Object=Null) + Return TMListEntry.Create(text,flags,icon,tip,extra) +End Function + + +Rem +bbdoc: Defines a base for list style gadgets. +EndRem +Type TMListWidget Extends TMWidget Abstract + Rem + bbdoc: Removes all items from the list. + EndRem + Method Clear() + ClearGadgetItems(gadget) + End Method + + Rem + bbdoc: Adds an item to the list. + EndRem + Method AddItem(entry:TMListEntry) + AddGadgetItem(gadget,entry.text,entry.flags,entry.icon,entry.tip,entry.extra) + End Method + + Rem + bbdoc: Adds items to the list. + EndRem + Method AddItems(entry:TMListEntry[]) + For Local f:Int=0 Until entry.length + AddItem(entry[f]) + Next + End Method + + Rem + bbdoc: Modify an item in the list. + EndRem + Method ModifyItem(index:Int, entry:TMListEntry) + ModifyGadgetItem(gadget,index,entry.text,entry.flags,entry.icon,entry.tip,entry.extra) + End Method + + Rem + bbdoc: Set an icon strip for the list. + EndRem + Method SetIconStrip(icons:TIconStrip) + SetGadgetIconStrip(gadget,icons) + End Method + + Rem + bbdoc: Get an item from the list. + about: Note that the @tip field is not set on return + EndRem + Method GetItem:TMListEntry(index:Int) + Return CreateListEntry(GadgetItemText(gadget,index), .. + GadgetItemFlags(gadget,index), .. + GadgetItemIcon(gadget,index), .. + "", .. + GadgetItemExtra(gadget,index)) + End Method + + Rem + bbdoc: Enable or disable a particular item. + EndRem + Method ItemEnabled(index:Int, state:Int) + If state + EnableGadgetItem(gadget,index) + Else + DisableGadgetItem(gadget,index) + EndIf + End Method + + Rem + bbdoc: Set the currently selected item. + EndRem + Method SetSelectedIndex(index:Int) + SelectGadgetItem(gadget,index) + End Method + + Rem + bbdoc: Get the index of the first selected item. + EndRem + Method SelectedIndex:Int() + Return SelectedGadgetItem(gadget) + End Method + + Rem + bbdoc: Get the indexes of the selected items. + EndRem + Method SelectedIndexes:Int[]() + Return SelectedGadgetItems(gadget) + End Method + + Rem + bbdoc: Get the first selected item, NULL if nothing selected. + EndRem + Method SelectedItem:TMListEntry() + If SelectedIndex()=-1 + Return Null + EndIf + + Return GetItem(SelectedIndex()) + End Method + + Rem + bbdoc: Get the selected items, NULL if nothing selected. + EndRem + Method SelectedItems:TMListEntry[]() + If SelectedIndex()=-1 + Return Null + EndIf + + Local sel:Int[]=SelectedIndexes() + Local ret:TMListEntry[]=New TMListEntry[sel.length] + + For Local f:Int=0 Until sel.length + ret[f]=GetItem(sel[f]) + Next + Return ret + End Method + + Rem + bbdoc: Called when the selection changes. + about: @index is the selected index. This can be -1 for no selection. + EndRem + Method OnIndexChanged(index:Int) + End Method + + Rem + bbdoc: Called when the selection changes. + EndRem + Field OnIndexChangedEvent:TMWEventListInt + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + OnIndexChanged(e.data) + OnIndexChangedEvent.Fire(Self,e.data) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed combo box. +EndRem +Type TMComboBox Extends TMListWidget + Rem + bbdoc: Creates a managed combo box. + returns: The created combo box. + about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateComboBox(), except that @group is a TMWidget. + If @values is not NULL it is used to load up the initial options. + IMPORTANT: It is really not recommended to use COMBOBOX_EDITABLE as OnIndexChanged() is called when the user edits the field. + There seems to be no easy way to remedy this. + EndRem + Method Create:TMComboBox(x:Int,y:Int, w:Int, h:Int, group:TMWidget, style:Int=0, values:TMListEntry[]=Null) + OnIndexChangedEvent=New TMWEventListInt + BaseInitialise(CreateComboBox(x,y,w,h,group.gadget,style),group) + typename="TMComboBox" + If values + AddItems(values) + EndIf + Return Self + End Method +End Type + + +Rem +bbdoc: Defines a managed list box. +EndRem +Type TMListBox Extends TMListWidget + Rem + bbdoc: Creates a managed list box. + returns: The created list box. + about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateListBox(), except that @group is a TMWidget. + If @values is not NULL it is used to load up the initial options. + EndRem + Method Create:TMListBox(x:Int,y:Int, w:Int, h:Int, group:TMWidget, values:TMListEntry[]=Null) + OnIndexChangedEvent=New TMWEventListInt + BaseInitialise(CreateListBox(x,y,w,h,group.gadget),group) + typename="TMListBox" + If values + AddItems(values) + EndIf + Return Self + End Method +End Type + + +Rem +bbdoc: Defines a managed tabber. +EndRem +Type TMTabber Extends TMListWidget + Field pages:TMWidget[][] + + Rem + bbdoc: Creates a managed tabber. + returns: The created tabber. + about: @x, @y, @w, @h, and @group act the same as the MaxGUI arguments to @CreateTabber(), except that @group is a TMWidget. + If @values is not NULL it is used to load up the initial options. + EndRem + Method Create:TMTabber(x:Int,y:Int, w:Int, h:Int, group:TMWidget, values:TMListEntry[]=Null) + OnIndexChangedEvent=New TMWEventListInt + BaseInitialise(CreateTabber(x,y,w,h,group.gadget),group) + typename="TMTabber" + If values + AddItems(values) + EndIf + Return Self + End Method + + Rem + bbdoc: Defines the gadgets to appear on each page of the tabber. + about: @widgets is an array of @TMWidget arrays. Each sub-array is one page. + EndRem + Method SetPages(widgets:TMWidget[][]) + pages=widgets + End Method + + Rem + bbdoc: Set the currently selected page. + about: This will hide/show the widgets defined by @DefinePages() as appropriate. + EndRem + Method SetSelectedIndex(index:Int) + SelectGadgetItem(gadget,index) + + If pages + For Local f:Int=0 Until pages.length + For Local w:TMWidget=EachIn pages[f] + w.Hidden(f<>index) + Next + Next + EndIf + End Method + + Rem + bbdoc: This default implementation will switch the widgets as defined by @DefinePages() + EndRem + Method OnIndexChanged(index:Int) + If index>-1 And pages + For Local f:Int=0 Until pages.length + For Local w:TMWidget=EachIn pages[f] + w.Hidden(f<>index) + Next + Next + EndIf + End Method + +End Type + + +Rem +bbdoc: Defines a managed HTML View. +EndRem +Type TMHTMLView Extends TMWidget + Rem + bbdoc: Creates a managed HTML View. + returns: The created HTML View. + about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateHMTLView(), except that @group is a TMWidget. + EndRem + Method Create:TMHTMLView(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) + OnPageLoadedEvent=New TMWEventListString + OnSelectURLEvent=New TMWEventListString + BaseInitialise(CreateHTMLView(x,y,w,h,group.gadget,style),group) + typename="TMHTMLView" + Return Self + End Method + + Rem + bbdoc: The current URL. + EndRem + Method CurrentURL:String() + Return HtmlViewCurrentURL(gadget) + End Method + + Rem + bbdoc: Enter the URL to goto. + EndRem + Method Go(url:String) + HtmlViewGo(gadget,url) + End Method + + Rem + bbdoc: Go back in the history. + EndRem + Method Back() + HtmlViewBack(gadget) + End Method + + Rem + bbdoc: Go forward in the history. + EndRem + Method Forward() + HtmlViewForward(gadget) + End Method + + Rem + bbdoc:Run a script. + EndRem + Method RunScript:String(script:String) + HtmlViewRun(gadget,script) + End Method + + Rem + bbdoc: If HTMLVIEW_NONAVIGATE is set in the styles, then this is called when a link is clicked. + about: @url is the selected URL. + EndRem + Method OnSelectURL(url:String) + End Method + + Rem + bbdoc: If HTMLVIEW_NONAVIGATE is set in the styles, then this is called when a link is clicked. + EndRem + Field OnSelectURLEvent:TMWEventListString + + Rem + bbdoc: Called when the page finishes loading. + about: @url is the loaded URL. + EndRem + Method OnPageLoaded(url:String) + End Method + + Rem + bbdoc: Called when the page finishes loading. + EndRem + Field OnPageLoadedEvent:TMWEventListString + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + OnSelectURL(e.extra.ToString()) + OnSelectURLEvent.Fire(Self,e.extra.ToString()) + Case EVENT_GADGETDONE + OnPageLoaded(CurrentURL()) + OnPageLoadedEvent.Fire(Self,CurrentURL()) + Default + super.Handle(e) + End Select + End Method +End Type + + +Type TMTreeNode + Field path:String + Field node:TGadget + Field tag:Object + Field icon:Int + Function Create:TMTreeNode(path:String, node:TGadget, tag:Object, icon:Int) + Local o:TMTreeNode=New TMTreeNode + o.path=path + o.node=node + o.tag=tag + o.icon=icon + Return o + End Function +End Type + +Rem +bbdoc: Defines a managed tree view. +about: The tree view works by treating its entries as if in a simple file system. +EndRem +Type TMTreeView Extends TMWidget + Field map:TMap + Field gmap:TMap + Field update:Int + + Rem + bbdoc: Creates a managed tree view. + returns: The created tree view. + about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateTreeView(), except that @group is a TMWidget. + EndRem + Method Create:TMTreeView(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) + update=False + map=New TMap + gmap=New TMap + OnSelectedEvent=New TMWEventListStringObject + OnClickedEvent=New TMWEventListStringObject + OnMenuEvent=New TMWEventListStringObject + OnExpandedEvent=New TMWEventListStringObject + OnCollapsedEvent=New TMWEventListStringObject + BaseInitialise(CreateTreeView(x,y,w,h,group.gadget,style),group) + typename="TMNodeView" + map.Insert("/",TMTreeNode.Create("/",TreeViewRoot(gadget),"/",-1)) + Return Self + End Method + + Method ResolvePath:TMTreeNode(path:String) + Return TMTreeNode(map.ValueForKey(path)) + End Method + + Method ResolveGadget:TMTreeNode(g:TGadget) + Return ResolvePath(gmap.ValueForKey(g).ToString()) + End Method + + Method Prune(path:String) + Local l:TList=CreateList() + + ' Not sure if this is overly ineffecient -- just being safe as in most languages deleting whilst iterating + ' is not recommended... + ' + For Local k:String=EachIn map.Keys() + If k=path Or k.Find(path+"/")=0 + l.AddLast(k) + EndIf + Next + + For Local k:String=EachIn l + Local n:TMTreeNode=ResolvePath(k) + map.Remove(k) + gmap.Remove(n.node) + Next + End Method + + Rem + bbdoc: Set an icon strip. + EndRem + Method SetIconStrip(icons:TIconStrip) + SetGadgetIconStrip(gadget,icons) + End Method + + Rem + bbdoc: The number of nodes in the view that are direct children on the passed node. + returns: The number of nodes. + about: @path is the path to count from. Unfortunately counting from the root (/) doesn't work, so it returns -1. + EndRem + Method CountChildren:Int(path:String) + If path="/" + Return -1 + EndIf + + Local node:TMTreeNode=ResolvePath(path) + + If node + Return CountTreeViewNodes(node.node) + Else + Return 0 + EndIf + End Method + + Rem + bbdoc: Remove nodes from the tree. + about: Attempting to remove the root node (/) will fail. + EndRem + Method Remove(path:String) + If path<>"/" + Local node:TMTreeNode=ResolvePath(path) + + If node + FreeTreeViewNode(node.node) + Prune(path) + EndIf + EndIf + End Method + + Rem + bbdoc: Don't redraw gadget when adding nodes. + EndRem + Method BeginUpdate() + update=True + End Method + + + Rem + bbdoc: Allow redraw of gadget when adding nodes. + EndRem + Method EndUpdate() + update=False + End Method + + + Rem + bbdoc: Add/modify nodes in the tree. + about: @path is the path to the node. This silently fails if the parent nodes don't exist. @tag is an Object that the entry is tagged with. + ToString() is called on this to create the text for the entry (so passing a String works fine). + @icon is the icon to use. Note that if you set an icon strip, then this seems to use the first icon (on Win32 at least) if set to -1. + EndRem + Method Set(path:String, tag:Object, icon:Int=-1) + Local parent:TMTreeNode=ResolvePath(FixedExtractDir(path)) + + If parent + Local node:TMTreeNode=ResolvePath(path) + + If node + ModifyTreeViewNode(node.node,tag.ToString(),icon) + Else + node=TMTreeNode.Create(path,AddTreeViewNode(tag.ToString(),parent.node,icon),tag,icon) + map.Insert(path,node) + gmap.Insert(node.node,path) + EndIf + + node.tag=tag + node.icon=icon + + If Not update + RedrawGadget(gadget) + EndIf + EndIf + End Method + + Rem + bbdoc: Get the tag at a node. + returns: The tag, or NULL for unknown node. + EndRem + Method GetNodeTag:Object(path:String) + Local node:TMTreeNode=ResolvePath(path) + If node + Return node.tag + Else + Return Null + EndIf + End Method + + Rem + bbdoc: Get the icon at a node. + returns: The icon, or -1 for none or unknown node. + EndRem + Method GetNodeIcon:Int(path:String) + Local node:TMTreeNode=ResolvePath(path) + If node + Return node.icon + Else + Return -1 + EndIf + End Method + + Rem + bbdoc: Expand a node on the tree. + EndRem + Method ExpandNode(path:String) + Local node:TMTreeNode=ResolvePath(path) + + If node + ExpandTreeViewNode(node.node) + EndIf + End Method + + Rem + bbdoc: Collapse a node on the tree. + EndRem + Method CollapseNode(path:String) + Local node:TMTreeNode=ResolvePath(path) + + If node + CollapseTreeViewNode(node.node) + EndIf + End Method + + Rem + bbdoc: Called when the an item is selected. + about: @path is the path to the selected item, @tag is the tag for that item. + EndRem + Method OnSelected(path:String, tag:Object) + End Method + + Rem + bbdoc: Called when the an item is selected. + EndRem + Field OnSelectedEvent:TMWEventListStringObject + + Rem + bbdoc: Called when the an item is double clicked. + about: @path is the path to the selected item, @tag is the tag for that item. + EndRem + Method OnClicked(path:String, tag:Object) + End Method + + Rem + bbdoc: Called when the an item is double clicked. + EndRem + Field OnClickedEvent:TMWEventListStringObject + + Rem + bbdoc: Called when the a context menu is requested. + about: @path is the path to the selected item, @tag is the tag for that item. + EndRem + Method OnMenu(path:String, tag:Object) + End Method + + Rem + bbdoc: Called when the an item is selected. + EndRem + Field OnMenuEvent:TMWEventListStringObject + + Rem + bbdoc: Called when a node is expanded. + about: @path is the path to the selected item, @tag is the tag for that item. + EndRem + Method OnExpanded(path:String, tag:Object) + End Method + + Rem + bbdoc: Called when a node is expanded. + EndRem + Field OnExpandedEvent:TMWEventListStringObject + + Rem + bbdoc: Called when a node is collapsed. + about: @path is the path to the selected item, @tag is the tag for that item. + EndRem + Method OnCollapsed(path:String, tag:Object) + End Method + + Rem + bbdoc: Called when a node is collapsed. + EndRem + Field OnCollapsedEvent:TMWEventListStringObject + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETSELECT + Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) + If n + OnSelected(n.path,n.tag) + OnSelectedEvent.Fire(Self,n.path,n.tag) + EndIf + Case EVENT_GADGETACTION + Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) + If n + OnClicked(n.path,n.tag) + OnClickedEvent.Fire(Self,n.path,n.tag) + EndIf + Case EVENT_GADGETOPEN + Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) + If n + OnExpanded(n.path,n.tag) + OnExpandedEvent.Fire(Self,n.path,n.tag) + EndIf + Case EVENT_GADGETCLOSE + Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) + If n + OnCollapsed(n.path,n.tag) + OnCollapsedEvent.Fire(Self,n.path,n.tag) + EndIf + Case EVENT_GADGETMENU + Local n:TMTreeNode=ResolveGadget(TGadget(e.extra)) + If n + OnMenu(n.path,n.tag) + OnMenuEvent.Fire(Self,n.path,n.tag) + EndIf + Default + super.Handle(e) + End Select + End Method +End Type + + +Type TMenuItem + Field id:Int + Field owner:TMMenu + Field path:String + Field tag:Object + Field gadget:TGadget + Field callback(menu:TMMenu, path:String, tag:Object) + Function Create:TMenuItem(owner:TMMenu, id:Int, path:String, gadget:TGadget, tag:Object, callback(menu:TMMenu, path:String, tag:Object)) + Local o:TMenuItem=New TMenuItem + o.owner=owner + o.id=id + o.path=path + o.gadget=gadget + o.tag=tag + o.callback=callback + Return o + End Function +End Type + + +Rem +bbdoc: Defines a managed menu. +about: Note that TMMenu is NOT a TMWidget. +EndRem +Type TMMenu + + Field root:TGadget + Field map:TMap + Field win:TMWindow + + Rem + bbdoc: Creates a managed menu that is associated as a window menu. + returns: The created menu. + about: @window is the window the menu is attached to. + EndRem + Method CreateWindowMenu:TMMenu(window:TMWindow) + map=New TMap + root=WindowMenu(window.gadget) + win=window + SetRoot() + Return Self + End Method + + Rem + bbdoc: Creates a managed menu that can be used as a popup menu. + returns: The created menu. + EndRem + Method CreatePopupMenu:TMMenu() + map=New TMap + root=CreateMenu("",0,Null) + win=Null + SetRoot() + Return Self + End Method + + Method Delete() + Clear() + If Not win + FreeMenu(root) + EndIf + End Method + + Rem + bbdoc: Clear all items from the menu + EndRem + Method Clear() + For Local m:TMenuItem=EachIn map + FreeMenu(m.gadget) + Static.DeregisterMenuItem(m) + Next + map.Clear() + SetRoot() + End Method + + Method SetRoot() + map.Insert("/",TMenuItem.Create(Self,0,"/",root,Null,Null)) + End Method + + Method ResolvePath:TMenuItem(path:String) + Return TMenuItem(map.ValueForKey(path)) + End Method + + Method Prune(path:String) + Local l:TList=CreateList() + + ' Not sure if this is overly ineffecient -- just being safe as in most languages deleting whilst iterating + ' is not recommended... + ' + For Local k:String=EachIn map.Keys() + If k=path Or k.Find(path+"/")=0 + l.AddLast(k) + EndIf + Next + + For Local k:String=EachIn l + Local n:TMenuItem=ResolvePath(k) + map.Remove(k) + Static.DeregisterMenuItem(n) + FreeMenu(n.gadget) + Next + End Method + + Rem + bbdoc: Add a menu option. + about: @path is the path to the menu item. This silently fails if the parent menus don't exist. @tag is an Object that the entry is tagged with. + ToString() is called on this to create the text for the menu (so passing a String works fine). If @callback is not null, then it is called when + this option is selected. + @hotkey and @modifier are as in MaxGUI's CreateMenu(). + EndRem + Method Set(path:String, tag:Object, callback(menu:TMMenu, path:String, tag:Object)=Null, hotkey:Int=0, modifier:Int=0) + If path<>"/" + Local parent:TMenuItem=ResolvePath(FixedExtractDir(path)) + + If parent + Local node:TMenuItem=ResolvePath(path) + + If node + SetMenuText(node.gadget,tag.ToString()) + Else + Local id:Int=Static.NextMenuID() + node=TMenuItem.Create(Self,id,path,CreateMenu(tag.ToString(),id,parent.gadget,hotkey,modifier),tag,callback) + map.Insert(path,node) + Static.RegisterMenuItem(node) + EndIf + + node.tag=tag + + If win + UpdateWindowMenu(win.gadget) + EndIf + EndIf + EndIf + End Method + + Rem + bbdoc: Remove menu item and its children. + about: @path is the path to the menu item. Root cannot be removed. + EndRem + Method Remove(path:String) + If path<>"/" + Prune(path) + + If win + UpdateWindowMenu(win.gadget) + EndIf + EndIf + End Method + + Rem + bbdoc: Change a menu tag (and therefore its text). + about: @path is the path to the menu item. Root cannot be changed. + EndRem + Method SetTag(path:String, tag:Object) + If path<>"/" + Local node:TMenuItem=ResolvePath(path) + + If node + SetMenuText(node.gadget,tag.ToString()) + node.tag=tag + + If win + UpdateWindowMenu(win.gadget) + EndIf + EndIf + EndIf + End Method + + Rem + bbdoc: Change a menu check. + about: @path is the path to the menu item. Root cannot be changed. + EndRem + Method Check(path:String, check:Int) + If path<>"/" + Local node:TMenuItem=ResolvePath(path) + + If node + If check + CheckMenu(node.gadget) + Else + UncheckMenu(node.gadget) + EndIf + + If win + UpdateWindowMenu(win.gadget) + EndIf + EndIf + EndIf + End Method + + Rem + about: Is a menu item checked. + EndRem + Method IsChecked:Int(path:String) + Local ret:Int=False + + If path<>"/" + Local node:TMenuItem=ResolvePath(path) + + If node + ret=MenuChecked(node.gadget) + EndIf + EndIf + + Return ret + End Method + + Rem + bbdoc: Enable/disable a menu item. + about: @path is the path to the menu item. Root cannot be changed. + EndRem + Method Enable(path:String, enab:Int) + If path<>"/" + Local node:TMenuItem=ResolvePath(path) + + If node + If enab + EnableMenu(node.gadget) + Else + DisableMenu(node.gadget) + EndIf + + If win + UpdateWindowMenu(win.gadget) + EndIf + EndIf + EndIf + End Method + + Rem + about: Is a menu item enabled. + EndRem + Method IsEnabled:Int(path:String) + Local ret:Int=False + + If path<>"/" + Local node:TMenuItem=ResolvePath(path) + + If node + ret=MenuEnabled(node.gadget) + EndIf + EndIf + + Return ret + End Method + + Rem + bbdoc: Called when the an item is selected in the menu. + EndRem + Method OnMenuItem(path:String, tag:Object) + End Method + + Rem + bbdoc: Popup the menu. + about: @win is a gadget to pass to MaxGUI. For some reason you need this, and the docs say it should be a window. + When I've tried any gadget would suffice, but don't come crying to me if it stops working for non-window gadgets. + EndRem + Method Popup(g:TMWidget) + PopupWindowMenu(g.gadget,root) + End Method + + Method ToString:String() + Return "TMMenu:"+super.ToString() + End Method +End Type + + +Rem +bbdoc: Defines a managed canvas. +EndRem +Type TMCanvas Extends TMWidget + + Rem + bbdoc: Creates a managed canvas. + returns: The created canvas. + about: @x, @y, @w, @h, @group, @style and @gfxflags act the same as the MaxGUI arguments to @CreateCanvas(), except that @group is a TMWidget. + EndRem + Method Create:TMCanvas(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) + OnRedrawEvent=New TMWEventListVoid + OnButtonDownEvent=New TMWEventListInt + OnButtonUpEvent=New TMWEventListInt + OnMouseMoveEvent=New TMWEventListIntInt + OnMouseWheelEvent=New TMWEventListInt + OnKeyDownEvent=New TMWEventListInt + OnKeyUpEvent=New TMWEventListInt + OnKeyEvent=New TMWEventListInt + BaseInitialise(CreateCanvas(x,y,w,h,group.gadget,style),group) + typename="TMCanvas" + Return Self + End Method + + Rem + bbdoc: Set the graphics so that the canvas can be drawn onto. + EndRem + Method SetupGraphics() + SetGraphics(CanvasGraphics(gadget)) + End Method + + Rem + bbdoc: Called when the canvas should be redrawn. + EndRem + Method OnRedraw() + End Method + + Rem + bbdoc: Called when the canvas should be redrawn. + EndRem + Field OnRedrawEvent:TMWEventListVoid + + Rem + bbdoc: Called when the a mouse button is pressed. + about: @button is the pressed button. + EndRem + Method OnButtonDown(button:Int) + End Method + + Rem + bbdoc: Called when the a mouse button is pressed. + EndRem + Field OnButtonDownEvent:TMWEventListInt + + Rem + bbdoc: Called when the a mouse button is released. + about: @button is the released button. + EndRem + Method OnButtonUp(button:Int) + End Method + + Rem + bbdoc: Called when the a mouse button is released. + EndRem + Field OnButtonUpEvent:TMWEventListInt + + Rem + bbdoc: Called when the mouse moves. + about: @x and @y are the mouse co-ordinates. + EndRem + Method OnMouseMove(x:Int, y:Int) + End Method + + Rem + bbdoc: Called when the an item is selected. + EndRem + Field OnMouseMoveEvent:TMWEventListIntInt + + Rem + bbdoc: Called when the mouse wheel moves. + about: @delta is the amount the wheel moves. + EndRem + Method OnMouseWheel(delta:Int) + End Method + + Rem + bbdoc: Called when the mouse wheel moves. + EndRem + Field OnMouseWheelEvent:TMWEventListInt + + Rem + bbdoc: Called when a key is held down. + about: @code is the key code. + EndRem + Method OnKeyDown(code:Int) + End Method + + Rem + bbdoc: Called when a key is held down. + EndRem + Field OnKeyDownEvent:TMWEventListInt + + Rem + bbdoc: Called when a key is released. + about: @code is the key code. + EndRem + Method OnKeyUp(code:Int) + End Method + + Rem + bbdoc: Called when a key is released. + EndRem + Field OnKeyUpEvent:TMWEventListInt + + Rem + bbdoc: Called when a key character is generated. + about: @code is the unicode value. + EndRem + Method OnKey(code:Int) + End Method + + Rem + bbdoc: Called when a key character is generated. + EndRem + Field OnKeyEvent:TMWEventListInt + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETPAINT + OnRedraw() + OnRedrawEvent.Fire(Self) + Case EVENT_MOUSEDOWN + OnButtonDown(e.data) + OnButtonDownEvent.Fire(Self,e.data) + Case EVENT_MOUSEUP + OnButtonUp(e.data) + OnButtonUpEvent.Fire(Self,e.data) + Case EVENT_MOUSEMOVE + OnMouseMove(e.x,e.y) + OnMouseMoveEvent.Fire(Self,e.x,e.y) + Case EVENT_MOUSEWHEEL + OnMouseWheel(e.data) + OnMouseWheelEvent.Fire(Self,e.data) + Case EVENT_KEYDOWN + OnKeyDown(e.data) + OnKeyDownEvent.Fire(Self,e.data) + Case EVENT_KEYUP + OnKeyUp(e.data) + OnKeyUpEvent.Fire(Self,e.data) + Case EVENT_KEYCHAR + OnKey(e.data) + OnKeyEvent.Fire(Self,e.data) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a toolbar. +EndRem +Type TMToolbar Extends TMWidget + Rem + bbdoc: Creates a managed toolbar. + returns: The created toolbar. + about: @source, @group and @style act the same as the MaxGUI arguments to @CreateToolBar(), except that @group is a TMWidget. + If @values is not NULL it is used to load up the initial options. + IMPORTANT: It is really not recommended to use COMBOBOX_EDITABLE as OnIndexChanged() is called when the user edits the field. + There seems to be no easy way to remedy this. + EndRem + Method Create:TMToolbar(source:Object, group:TMWidget, style:Int=0) + OnSelectedEvent=New TMWEventListInt + BaseInitialise(CreateToolBar(source,0,0,0,0,group.gadget,style),group) + typename="TMToolbar" + Return Self + End Method + + Rem + bbdoc: Adds an item to the toolbar. + EndRem + Method AddItem(icon:Int, flags:Int=0, tooltip:String=Null) + AddGadgetItem(gadget,"",flags,icon,tooltip,Null) + End Method + + Rem + bbdoc: Set the tooltips. + EndRem + Method SetTooltips(tips:String[]) + SetToolBarTips(gadget,tips) + End Method + + Rem + bbdoc: Enable or disable a particular item. + EndRem + Method ItemEnabled(index:Int, state:Int) + If state + EnableGadgetItem(gadget,index) + Else + DisableGadgetItem(gadget,index) + EndIf + End Method + + Rem + bbdoc: Called when an icon is selected. + about: @index is the selected index. + EndRem + Method OnSelected(index:Int) + End Method + + Rem + bbdoc: Called when an icon is selected. + EndRem + Field OnSelectedEvent:TMWEventListInt + + Method Handle(e:TEvent) + Select e.id + Case EVENT_GADGETACTION + OnSelected(e.data) + OnSelectedEvent.Fire(Self,e.data) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed panel. +EndRem +Type TMPanel Extends TMWidget + + Rem + bbdoc: Creates a managed panel. + returns: The created panel. + about: @x, @y, @w, @h, @group, @style and @title act the same as the MaxGUI arguments to @CreatePanel(), except that @group is a TMWidget. + EndRem + Method Create:TMPanel(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0, title:String="") + OnButtonDownEvent=New TMWEventListInt + OnButtonUpEvent=New TMWEventListInt + OnMouseMoveEvent=New TMWEventListIntInt + OnMouseWheelEvent=New TMWEventListInt + OnKeyDownEvent=New TMWEventListInt + OnKeyUpEvent=New TMWEventListInt + OnKeyEvent=New TMWEventListInt + BaseInitialise(CreatePanel(x,y,w,h,group.gadget,style,title),group) + typename="TMPanel" + Return Self + End Method + + Rem + bbdoc: Called when the a mouse button is pressed. + about: @button is the pressed button. + EndRem + Method OnButtonDown(button:Int) + End Method + + Rem + bbdoc: Called when the a mouse button is pressed. + EndRem + Field OnButtonDownEvent:TMWEventListInt + + Rem + bbdoc: Called when the a mouse button is released. + about: @button is the released button. + EndRem + Method OnButtonUp(button:Int) + End Method + + Rem + bbdoc: Called when the a mouse button is released. + EndRem + Field OnButtonUpEvent:TMWEventListInt + + Rem + bbdoc: Called when the mouse moves. + about: @x and @y are the mouse co-ordinates. + EndRem + Method OnMouseMove(x:Int, y:Int) + End Method + + Rem + bbdoc: Called when the an item is selected. + EndRem + Field OnMouseMoveEvent:TMWEventListIntInt + + Rem + bbdoc: Called when the mouse wheel moves. + about: @delta is the amount the wheel moves. + EndRem + Method OnMouseWheel(delta:Int) + End Method + + Rem + bbdoc: Called when the mouse wheel moves. + EndRem + Field OnMouseWheelEvent:TMWEventListInt + + Rem + bbdoc: Called when a key is held down. + about: @code is the key code. + EndRem + Method OnKeyDown(code:Int) + End Method + + Rem + bbdoc: Called when a key is held down. + EndRem + Field OnKeyDownEvent:TMWEventListInt + + Rem + bbdoc: Called when a key is released. + about: @code is the key code. + EndRem + Method OnKeyUp(code:Int) + End Method + + Rem + bbdoc: Called when a key is released. + EndRem + Field OnKeyUpEvent:TMWEventListInt + + Rem + bbdoc: Called when a key character is generated. + about: @code is the unicode value. + EndRem + Method OnKey(code:Int) + End Method + + Rem + bbdoc: Called when a key character is generated. + EndRem + Field OnKeyEvent:TMWEventListInt + + Method Handle(e:TEvent) + Select e.id + Case EVENT_MOUSEDOWN + OnButtonDown(e.data) + OnButtonDownEvent.Fire(Self,e.data) + Case EVENT_MOUSEUP + OnButtonUp(e.data) + OnButtonUpEvent.Fire(Self,e.data) + Case EVENT_MOUSEMOVE + OnMouseMove(e.x,e.y) + OnMouseMoveEvent.Fire(Self,e.x,e.y) + Case EVENT_MOUSEWHEEL + OnMouseWheel(e.data) + OnMouseWheelEvent.Fire(Self,e.data) + Case EVENT_KEYDOWN + OnKeyDown(e.data) + OnKeyDownEvent.Fire(Self,e.data) + Case EVENT_KEYUP + OnKeyUp(e.data) + OnKeyUpEvent.Fire(Self,e.data) + Case EVENT_KEYCHAR + OnKey(e.data) + OnKeyEvent.Fire(Self,e.data) + Default + super.Handle(e) + End Select + End Method +End Type + + +Rem +bbdoc: Defines a managed progress bar. +EndRem +Type TMProgressBar Extends TMWidget + + Rem + bbdoc: Creates a managed progress bar. + returns: The created progress bar. + about: @x, @y, @w, @h, @group and @style act the same as the MaxGUI arguments to @CreateProgBar(), except that @group is a TMWidget. + EndRem + Method Create:TMProgressBar(x:Int, y:Int, w:Int, h:Int, group:TMWidget, style:Int=0) + BaseInitialise(CreateProgBar(x,y,w,h,group.gadget,style),group) + typename="TMProgressBar" + Return Self + End Method + + Rem + bbdoc: Set the value for the progress bar. + about: @value is the value (between 0 and 1). + EndRem + Method SetValue(value:Double) + UpdateProgBar(gadget,value) + End Method +End Type + + +Rem +bbdoc: Enters the event processing loop. +about: @top is the top level TMWindow For the application. The loop continues Until the @closed Field of this window is TRUE. +Your code can do it's own event loop if required -- all this function does is continually call WaitEvent and is simply provided as +a basic main loop. +EndRem +Function MWidgetMainLoop(top:TMWindow) + While Not top.closed + WaitEvent() + Wend +End Function + + +Private + +Function FixedExtractDir:String(p:String) + p=ExtractDir(p) + If p.length=0 + p="/" + EndIf + Return p +End Function + +Type Static + Global list:TList + Global menu:TList + Global menuid:Int + + Function Init() + list=CreateList() + menu=CreateList() + menuid=0 + AddHook(EmitEventHook,EventHandler) + End Function + + Function EventHandler:Object(id:Int, data:Object, context:Object) + Local e:TEvent=TEvent(data) + + DebugLog "Got event : " + e.ToString() + + If e + If e.id=EVENT_MENUACTION + For Local m:TMenuItem=EachIn menu + If m.id=e.data + DebugLog "Passing menu event to " + m.owner.ToString() + m.owner.OnMenuItem(m.path,m.tag) + If m.callback + m.callback(m.owner,m.path,m.tag) + EndIf + EndIf + Next + Else + For Local g:TMWidget=EachIn list + If g And g.gadget And g.gadget=e.source + DebugLog "Passing event to " + g.ToString() + g.Handle(e) + EndIf + Next + EndIf + EndIf + + Return e + End Function + + Function Register(w:TMWidget) + list.AddLast(w) + w.OnManage() + w.OnManageEvent.Fire(w) + End Function + + Function Deregister(w:TMWidget) + w.OnUnmanage() + w.OnUnmanageEvent.Fire(w) + list.Remove(w) + End Function + + Function RegisterMenuItem(m:TMenuItem) + menu.AddLast(m) + End Function + + Function DeregisterMenuItem(m:TMenuItem) + menu.Remove(m) + End Function + + Function NextMenuID:Int() + menuid:+1 + Return menuid + End Function +End Type + Static.Init() \ No newline at end of file -- cgit v1.2.3