Whoooooooooooooooooooooooooooooooo! :-P
And I never thought I'd see the day! Glad to see you've decided to start development again! That IDE certainly is turbo-charged now - it's highlighting the MaxIDE source on my computer in about 1.5 seconds!!! Well-done! Btw, I thought I'd look for some bugs and have listed them below (some of them have been mentioned in the previous thread but are still broken):
1.
GadgetText() returns an empty string for windows, buttons and labels. Fix below!
2.
Labels with the separator flag don't display.
3.
EVENT_MENUACTION events do not have an EventSource().
4.
No hotkey text is display for a menu which is assigned to non alpha-numberic keys (inc. Delete, Insert, Print Screen, Return, Space, Plus, Minus, Escape, Home, End, Page Up, Page Down) - looks like it will be a quick-fix in TWindowsMenu.SetHotKey(). I've nabbed Grisu's screenshot for demonstration... Fix below!

5. Textareas allow you to change the alignment of selected text by using the default keyboard shortcuts (Left:
Ctrl+
L, Center:
Ctrl+
E, Right:
Ctrl+
R [right alignment doesn't work in IDE as this is the shortcut for running modules]) and you can change the font size either by using
Ctrl+
Shift+
> /
Ctrl+
Shift+
<, or by holding
Ctrl while spinning the mouse wheel.
6.
HtmlViews still allows you to cut text from it by selecting the text, and hitting Ctrl+X.7.
SetMinWindowSize() doesn't seem to work very well (see source code below).8.
Panels don't seem to like it when you change the pixmap.Here's some test code for points 7 and 8:
SuperStrict
Import Axe.Win32MaxGUI
Print "Please wait... Downloading images from BRL site..."
Global pixOne:TPixmap = LoadPixmap(LoadBank("http::www.blitzbasic.com/Products/win32ide_small.png"))
Global pixTwo:TPixmap = LoadPixmap(LoadBank("http::www.blitzbasic.com/Products/macoside_small.png"))
Print "Done!"
Global wndMain:TGadget = CreateWindow("Test Window (Click on the panel!)", 100, 100, 400, 300, Null, WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_RESIZABLE|WINDOW_CLIENTCOORDS)
SetMinWindowSize(wndMain,GadgetWidth(wndMain),GadgetHeight(wndMain))
Global pnlTest:TGadget = CreatePanel(0,0,ClientWidth(wndMain),ClientHeight(wndMain),wndMain,PANEL_ACTIVE);SetGadgetLayout(pnlTest, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED )
SetPanelPixmap(pnlTest, pixOne, PANELPIXMAP_FIT)
Repeat
WaitEvent()
SetStatusText(wndMain, CurrentEvent.toString())
Select EventID()
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE;End
Case EVENT_MOUSEDOWN;SetPanelPixmap(pnlTest, pixTwo, PANELPIXMAP_FIT)
Case EVENT_MOUSEUP;SetPanelPixmap(pnlTest, pixOne, PANELPIXMAP_FIT)
EndSelect
Forever
9.
I like the idea of having the XP manifest file built in to Axe.Win32MaxGUI but it seems to break any other imported object files (that may, for example, include icons). This is visible both when compiling MaxIDE and when compiling my own project with its own custom icon set.10.
EVENT_MOUSEMOVE is constantly being emitted by an active panel regardless of whether the cursor is actually moving (that's strange - it seems to be happening for both Axe.Win32MaxGUI and BRL.Win32MaxGUI). I've nabbed my example from the OS X thread which seems to demonstrate it well.SuperStrict
Framework Axe.Win32MaxGUI
Global wndMain:TGadget = CreateWindow("Test Window (Drag The Panel)",100,100,400,300,Null,WINDOW_TITLEBAR|WINDOW_STATUS)
Global pnlWindow:TGadget = CreatePanel(0,0,ClientWidth(wndMain),ClientHeight(wndMain),wndMain,PANEL_ACTIVE)
Global pnlDrag:TGadget = CreatePanel( 10, 10, 12, 12, pnlWindow, PANEL_ACTIVE )
SetPanelPixmap( pnlDrag, GetPanelPic() )
Global intStartDragPos%[] = [0,0]
AddHook EmitEventHook, eventHandler
Repeat;WaitSystem();Forever
Function eventHandler:Object( pID%, pData:Object, pContext:Object)
Local tmpEvent:TEvent = TEvent(pData)
If tmpEvent Then
Print tmpEvent.toString()
SetStatusText(wndMain, tmpEvent.toString())
Select tmpEvent.id
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE;End
Case EVENT_MOUSEUP
If (tmpEvent.source = pnlWindow Or tmpEvent.source = pnlDrag) Then EndDrag( GadgetX(TGadget(tmpEvent.source))+tmpEvent.x, GadgetY(TGadget(tmpEvent.source))+tmpEvent.y )
Case EVENT_MOUSEDOWN
If tmpEvent.source = pnlDrag Then StartDrag( tmpEvent.x, tmpEvent.y )
EndSelect
Return Null
EndIf
Return pData
EndFunction
Function StartDrag( pX%, pY% )
intStartDragPos = [pX,pY]
SetPointer( POINTER_SIZEALL )
HideGadget(pnlDrag)
EndFunction
Function EndDrag( pX%, pY% )
If Not GadgetHidden(pnlDrag) Then Return
SetPointer( POINTER_DEFAULT )
SetGadgetShape( pnlDrag, pX-intStartDragPos[0], pY-intStartDragPos[1], GadgetWidth(pnlDrag), GadgetHeight(pnlDrag) )
ShowGadget(pnlDrag)
EndFunction
'Bitmap stuff
Function GetPanelPic:TPixmap()
'Bitmap data
Local bmpSample:Byte[] = [$42:Byte, $4D:Byte, $E8:Byte, $01:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, $36:Byte, $00:Byte, $00:Byte, $00:Byte, $28:Byte, $00:Byte, $00:Byte, ..
$00:Byte, $0C:Byte, $00:Byte, $00:Byte, $00:Byte, $0C:Byte, $00:Byte, $00:Byte, $00:Byte, $01:Byte, $00:Byte, $18:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, ..
$B2:Byte, $01:Byte, $00:Byte, $00:Byte, $12:Byte, $0B:Byte, $00:Byte, $00:Byte, $12:Byte, $0B:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, $00:Byte, ..
$00:Byte, $00:Byte, $00:Byte, $6C:Byte, $6C:Byte, $6C:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, ..
$66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, $66:Byte, ..
$66:Byte, $66:Byte, $2A:Byte, $2A:Byte, $2A:Byte, $C3:Byte, $C3:Byte, $C3:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$FD:Byte, $FD:Byte, $FD:Byte, $7D:Byte, $7E:Byte, $7E:Byte, $D9:Byte, $DA:Byte, $DA:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $69:Byte, $69:Byte, $69:Byte, $C3:Byte, $C3:Byte, $C3:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FB:Byte, ..
$FB:Byte, $FB:Byte, $76:Byte, $77:Byte, $77:Byte, $14:Byte, $15:Byte, $14:Byte, $41:Byte, $41:Byte, $41:Byte, $E1:Byte, $E2:Byte, $E2:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $69:Byte, $69:Byte, $69:Byte, $C3:Byte, $C3:Byte, $C3:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$FF:Byte, $F9:Byte, $F9:Byte, $F9:Byte, $A8:Byte, $A9:Byte, $A9:Byte, $42:Byte, $42:Byte, $42:Byte, $9C:Byte, $9D:Byte, $9D:Byte, $DD:Byte, $DD:Byte, $DD:Byte, $FF:Byte, ..
$FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $69:Byte, $69:Byte, $69:Byte, $C3:Byte, $C3:Byte, $C3:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$E1:Byte, $E1:Byte, $E1:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $6B:Byte, $6B:Byte, $6B:Byte, $F5:Byte, $F5:Byte, $F5:Byte, $FF:Byte, $FF:Byte, ..
$FF:Byte, $DD:Byte, $DD:Byte, $DD:Byte, $EA:Byte, $EA:Byte, $EA:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $69:Byte, $69:Byte, $69:Byte, $A2:Byte, $A2:Byte, $A2:Byte, $80:Byte, ..
$81:Byte, $81:Byte, $4A:Byte, $4B:Byte, $4B:Byte, $E4:Byte, $E4:Byte, $E4:Byte, $E1:Byte, $E1:Byte, $E1:Byte, $5D:Byte, $5D:Byte, $5D:Byte, $CA:Byte, $CA:Byte, $CA:Byte, ..
$E4:Byte, $E4:Byte, $E4:Byte, $8F:Byte, $8F:Byte, $8F:Byte, $41:Byte, $43:Byte, $43:Byte, $D6:Byte, $D6:Byte, $D6:Byte, $69:Byte, $69:Byte, $69:Byte, $50:Byte, $50:Byte, ..
$50:Byte, $0F:Byte, $10:Byte, $10:Byte, $11:Byte, $11:Byte, $11:Byte, $60:Byte, $60:Byte, $60:Byte, $60:Byte, $60:Byte, $60:Byte, $23:Byte, $23:Byte, $23:Byte, $59:Byte, ..
$59:Byte, $59:Byte, $65:Byte, $65:Byte, $65:Byte, $47:Byte, $47:Byte, $47:Byte, $14:Byte, $14:Byte, $14:Byte, $70:Byte, $71:Byte, $71:Byte, $69:Byte, $69:Byte, $69:Byte, ..
$BC:Byte, $BC:Byte, $BC:Byte, $BC:Byte, $BD:Byte, $BD:Byte, $65:Byte, $66:Byte, $66:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $71:Byte, $71:Byte, ..
$71:Byte, $EF:Byte, $EF:Byte, $EF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $B1:Byte, $B1:Byte, $B1:Byte, $78:Byte, $79:Byte, $79:Byte, $FA:Byte, $FA:Byte, $FA:Byte, $69:Byte, ..
$69:Byte, $69:Byte, $C3:Byte, $C3:Byte, $C3:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $F8:Byte, $F8:Byte, $F8:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$64:Byte, $64:Byte, $64:Byte, $EE:Byte, $EE:Byte, $EE:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FA:Byte, $FA:Byte, $FA:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$FF:Byte, $69:Byte, $69:Byte, $69:Byte, $C3:Byte, $C3:Byte, $C3:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $F7:Byte, $F7:Byte, $F7:Byte, $65:Byte, ..
$65:Byte, $66:Byte, $15:Byte, $15:Byte, $15:Byte, $47:Byte, $47:Byte, $47:Byte, $CD:Byte, $CE:Byte, $CE:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$FF:Byte, $FF:Byte, $FF:Byte, $69:Byte, $69:Byte, $69:Byte, $C3:Byte, $C3:Byte, $C3:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FD:Byte, $FD:Byte, ..
$FD:Byte, $BB:Byte, $BC:Byte, $BD:Byte, $1D:Byte, $1D:Byte, $1E:Byte, $7F:Byte, $80:Byte, $81:Byte, $F8:Byte, $F8:Byte, $F8:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, ..
$FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $FF:Byte, $69:Byte, $69:Byte, $69:Byte, $9C:Byte, $9C:Byte, $9C:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, ..
$CC:Byte, $CC:Byte, $CC:Byte, $CA:Byte, $CA:Byte, $CA:Byte, $62:Byte, $62:Byte, $62:Byte, $B1:Byte, $B1:Byte, $B2:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, ..
$CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $CC:Byte, $81:Byte, $81:Byte, $81:Byte, $00:Byte, $00:Byte]
'End of bitmap data
Return LoadPixmap(CreateStaticBank(bmpSample,bmpSample.length))
EndFunction11.
Computer "beeps" when an item is clicked in a list view (apparent in the CreateListView() example).Lol, I know that's quite a list. I can cross them off as and when like I'm doing for Brucey in the
MaxGUI on OS X thread.
Thanks!