diff options
| -rw-r--r-- | mwidget.mod/.cvsignore | 6 | ||||
| -rw-r--r-- | mwidget.mod/mwidget.bmx | 1357 | 
2 files changed, 1363 insertions, 0 deletions
| diff --git a/mwidget.mod/.cvsignore b/mwidget.mod/.cvsignore new file mode 100644 index 0000000..c7027e3 --- /dev/null +++ b/mwidget.mod/.cvsignore @@ -0,0 +1,6 @@ +mwidget.release.win32.i
 +mwidget.debug.win32.a
 +mwidget.debug.win32.i
 +mwidget.release.win32.a
 +.bmx
 +doc
 diff --git a/mwidget.mod/mwidget.bmx b/mwidget.mod/mwidget.bmx new file mode 100644 index 0000000..139de6d --- /dev/null +++ b/mwidget.mod/mwidget.bmx @@ -0,0 +1,1357 @@ +Rem
 +bbdoc: noddybox.mwidget
 +about: Provides a simply class based interface to the MaxGUI.  Note that all widgets have create type methods.  For thes to work correctly with
 +sub-classes they must be called through a new operation, e.g.
 +<pre>
 +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)
 +</pre>
 +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
 +
 +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(e)
 +			Case EVENT_MOUSELEAVE
 +				OnMouseEnter(e)
 +			Case EVENT_TIMERTICK
 +				OnTimer()
 +		End Select
 +	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 is managed.
 +	EndRem
 +	Method OnManage()
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the widget is unmanaged.
 +	EndRem
 +	Method OnUnmanage()
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the mouse enters.
 +	EndRem
 +	Method OnMouseEnter(e:TEvent)
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the mouse leaves.
 +	EndRem
 +	Method OnMouseLeave(e:TEvent)
 +	End Method
 +	
 +	Rem
 +	bbdoc: Fires an event at this managed widget.
 +	about: The arguments are the same as @CreateEvent(), but not 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
 +		
 +		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
 +		
 +		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: 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.
 +	EndRem
 +	Method OnMove(e:TEvent)
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the window is resized.
 +	EndRem
 +	Method OnResize(e:TEvent)
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the window's close gadget is pressed.
 +	EndRem
 +	Method OnClose(e:TEvent)
 +		closed=True
 +		Hidden(True)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_WINDOWMOVE
 +				OnMove(e)
 +			Case EVENT_WINDOWSIZE
 +				OnResize(e)
 +			Case EVENT_WINDOWCLOSE
 +				OnClose(e)
 +			Default
 +				super.Handle(e)
 +		End Select
 +	End Method
 +End Type
 +
 +
 +Rem
 +bbdoc: Defines a managed menu.
 +EndRem
 +Type TMMenu Extends TMWidget
 +
 +	Rem
 +	bbdoc: Creates a managed menu.
 +	returns: The created button.
 +	about: @label, @tag, @group, @hotkey and @modifier act the same as the MaxGUI arguments to @CreateMenu(), except that @group is a TMWidget.
 +	EndRem
 +	Method Create:TMMenu(label:String, tag:Int, group:TMWidget, hotkey:Int=0, modifier:Int=0)
 +		BaseInitialise(CreateMenu(label,tag,group.gadget,hotkey,modifier),group)
 +		typename="TMMenu"
 +		Return Self
 +	End Method
 +
 +	Method Delete()
 +		FreeMenu(gadget)
 +	End Method
 +	
 +	Rem
 +	bbdoc: Called when the button is pressed.
 +	EndRem
 +	Method OnPress(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnPress(e)
 +			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)
 +		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)
 +		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)
 +		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(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnPress(e)
 +			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)
 +		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.
 +	EndRem
 +	Method OnPress(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnPress(e)
 +			Default
 +				super.Handle(e)
 +		End Select
 +	End Method
 +End Type
 +
 +
 +Rem
 +bbdoc: Defines a managed radio button.
 +EndRem
 +Type TMRadioButton Extends TMCheckbox
 +	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)
 +		BaseInitialise(CreateButton(label,x,y,w,h,group.gadget,BUTTON_RADIO),group)
 +		typename="TMRadioButton"
 +		Return Self
 +	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[])
 +		but=buttons
 +		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: 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
 +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)
 +		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 a character is entered into the field.
 +	EndRem
 +	Method OnKey(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnKey(e)
 +			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)
 +		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 a character is entered into the text.
 +	EndRem
 +	Method OnKey(e:TEvent)
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the selection or cursor changes.
 +	EndRem
 +	Method OnSelection(e:TEvent)
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the context menu is requested.
 +	EndRem
 +	Method OnMenu(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnKey(e)
 +			Case EVENT_GADGETSELECT
 +				OnSelection(e)
 +			Case EVENT_GADGETMENU
 +				OnMenu(e)
 +			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)
 +		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.
 +	EndRem
 +	Method OnValueChanged(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnValueChanged(e)
 +			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.
 +	EndRem
 +	Method OnIndexChanged(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnIndexChanged(e)
 +			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.
 +	<b>IMPORTANT</b>: 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)
 +		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)
 +		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)
 +		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 information will switch the widgets as defined by @DefinePages()
 +	EndRem
 +	Method OnIndexChanged(e:TEvent)
 +		Local sel:Int=SelectedIndex()
 +		
 +		If sel>-1 And pages
 +			For Local f:Int=0 Until pages.length
 +				For Local w:TMWidget=EachIn pages[f]
 +					w.Hidden(f<>sel)
 +				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)
 +		BaseInitialise(CreateHTMLView(x,y,w,h,group.gadget,style),group)
 +		typename="TMHTMLView"
 +		Return Self
 +	End Method
 +	
 +	Rem
 +	bbdoc: The current URL.
 +	EndRem
 +	Method URL: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.
 +	EndRem
 +	Method OnSelectURL(e:TEvent)
 +	End Method
 +
 +	Rem
 +	bbdoc: Called when the page finishes loading moves.
 +	EndRem
 +	Method OnPageLoaded(e:TEvent)
 +	End Method
 +
 +	Method Handle(e:TEvent)
 +		Select e.id
 +			Case EVENT_GADGETACTION
 +				OnSelectURL(e)
 +			Case EVENT_GADGETDONE
 +				OnPageLoaded(e)
 +			Default
 +				super.Handle(e)
 +		End Select
 +	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
 +
 +Type Static
 +	Global list:TList
 +	
 +	Function Init()
 +		list=CreateList()
 +		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
 +			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
 +		
 +		Return e
 +	End Function
 +
 +	Function Register(w:TMWidget)
 +		list.AddLast(w)
 +		w.OnManage()
 +	End Function
 +	
 +	Function Deregister(w:TMWidget)
 +		If w.children.Count()
 +			For Local c:TMWidget=EachIn w.children
 +				If c
 +					Deregister(c)
 +				EndIf
 +			Next
 +		EndIf
 +		
 +		w.OnUnmanage()
 +		list.Remove(w)
 +	End Function
 +End Type
 +
 +Static.Init()
\ No newline at end of file | 
