' 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:

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

Type MyApp Extends TMWindow
    Method OnClose(e:TEvent)
        closed=Confirm("Really quit?")
    End Method
End Type

Local window:TMWindow=New MyApp.Create("Test",100,100,640,400)
MWidgetMainLoop(window)

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

Function OnClose(o:TMWidget)
    Local w:TMWindow=TMWindow(o)
    w.closed=Confirm("Really quit?")
End Function

Local window:TMWindow=New TMWindow.Create("Test",100,100,640,400)
window.OnCloseEvent.Add(OnClose)
MWidgetMainLoop(window)

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

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