diff options
author | Ian C <ianc@noddybox.co.uk> | 2020-04-08 21:23:22 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2020-04-08 21:23:22 +0000 |
commit | 6c0b11a6bb632a5c7cd29ad8a92ce31fe929c194 (patch) | |
tree | 81d8972c24c12b4e1ec51a853ce0bee5737e2a56 /mwidget.mod | |
parent | 2fc5b1e06854d1cb1e5ad59ceb6d8748a9d82f32 (diff) |
Removed Strict -- doesn't seem to like it anymore.
Diffstat (limited to 'mwidget.mod')
-rw-r--r-- | mwidget.mod/mwidget.bmx | 5615 |
1 files changed, 2807 insertions, 2808 deletions
diff --git a/mwidget.mod/mwidget.bmx b/mwidget.mod/mwidget.bmx index 397d50d..51b2573 100644 --- a/mwidget.mod/mwidget.bmx +++ b/mwidget.mod/mwidget.bmx @@ -1,2808 +1,2807 @@ -' Copyright (c) 2006 Ian Cowburn -' -' Permission is hereby granted, free of charge, to any person obtaining a copy of -' this software and associated documentation files (the "Software"), to deal in -' the Software without restriction, including without limitation the rights to -' use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -' of the Software, and to permit persons to whom the Software is furnished to do -' so, subject to the following conditions: -' -' The above copyright notice and this permission notice shall be included in all -' copies or substantial portions of the Software. -' -' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -' SOFTWARE. -' -' $Id$ -' -Rem -bbdoc: noddybox.mwidget -about: <p>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.</p> -<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) -MWidgetMainLoop(window) -</pre> -<p> -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: -</p> -<pre> -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) -</pre> -<p> -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. -</p> -EndRem -Module noddybox.mwidget - -ModuleInfo "Framework: Simple Managed Widget Classes" -ModuleInfo "Copyright: Ian Cowburn -- released under the MIT License" -ModuleInfo "Author: Ian Cowburn" -ModuleInfo "Version: $Revision$" - -Strict -Import maxgui.maxgui -Import brl.linkedlist -Import brl.event -Import brl.timer -Import brl.map -Import brl.filesystem -Import brl.eventqueue - -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. - <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) - 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 <b>NOT</b> 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 TMapEnumerator(MapValues(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. - <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: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() +' Copyright (c) 2006 Ian Cowburn
+'
+' Permission is hereby granted, free of charge, to any person obtaining a copy of
+' this software and associated documentation files (the "Software"), to deal in
+' the Software without restriction, including without limitation the rights to
+' use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+' of the Software, and to permit persons to whom the Software is furnished to do
+' so, subject to the following conditions:
+'
+' The above copyright notice and this permission notice shall be included in all
+' copies or substantial portions of the Software.
+'
+' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+' SOFTWARE.
+'
+' $Id$
+'
+Rem
+bbdoc: noddybox.mwidget
+about: <p>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.</p>
+<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)
+MWidgetMainLoop(window)
+</pre>
+<p>
+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:
+</p>
+<pre>
+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)
+</pre>
+<p>
+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.
+</p>
+EndRem
+Module noddybox.mwidget
+
+ModuleInfo "Framework: Simple Managed Widget Classes"
+ModuleInfo "Copyright: Ian Cowburn -- released under the MIT License"
+ModuleInfo "Author: Ian Cowburn"
+ModuleInfo "Version: $Revision$"
+
+Import maxgui.maxgui
+Import brl.linkedlist
+Import brl.event
+Import brl.timer
+Import brl.map
+Import brl.filesystem
+Import brl.eventqueue
+
+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.
+ <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)
+ 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 <b>NOT</b> 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 TMapEnumerator(MapValues(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.
+ <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: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()
|