'--------------------------------------------------------------
'        TreeViewEx and ImageList Demo for FreeBasic.
'                    by zydon@mesra.net
'--------------------------------------------------------------

#include once "windows.bi"
#include once "win/commctrl.bi"
#include once "win/shellapi.bi"

'' Module state shared by the window callback and this program's setup code.
'' The example is single-threaded, so these handles have one GUI-thread owner.
	dim shared hInstance as HINSTANCE
	dim shared rc as RECT
	dim shared htv as HWND
	dim shared ilist as HIMAGELIST
	dim shared iccx as INITCOMMONCONTROLSEX

    hInstance = GetModuleHandle( null )

    ilist  = ImageList_Create( GetSystemMetrics(SM_CXSMICON), _
                                GetSystemMetrics(SM_CYSMICON), _
                                ILC_COLOR8 or ILC_MASK, _
                                1, _
                                1 )

    iccx.dwSize = len( INITCOMMONCONTROLSEX )
    iccx.dwICC  = ICC_TREEVIEW_CLASSES or ICC_WIN95_CLASSES

    InitCommonControlsEx( @iccx )


''
'' Window Procedure Handler
''
function WndProc ( byval hWnd as HWND, _
                   byval uMsg as UINT, _
                   byval wParam as WPARAM, _
                   byval lParam as LPARAM ) as integer

	function = 0

	select case ( uMsg )
	case WM_CREATE

		dim tvis as TVINSERTSTRUCT

        dim i as long
        dim hico as HICON
        dim hPrev as HTREEITEM
        dim tlib as long

        dim as string ico
        dim as string text

        GetClientRect( hWnd, @rc )

        htv = CreateWindowEx( WS_EX_CLIENTEDGE, WC_TREEVIEW, "", _
                              WS_CHILD or WS_VISIBLE or TVS_HASLINES _
                              or TVS_LINESATROOT or TVS_HASBUTTONS, _
                              0, 18, 160, rc.bottom-20, _
                              hWnd, 0, hInstance, 0 )

        TreeView_SetBkColor( htv, &hfff0e1 )

        for i = 3 to 5
            ico = STR( i )
            hico = ExtractIcon( 0, "Shell32.DLL", i )
            ImageList_ReplaceIcon( ilist, -1, hico )
            DestroyIcon( hico )
        next i

        TreeView_SetImageList( htv, ilist, TVSIL_NORMAL )

        '' TVINSERTSTRUCT contains only the raw Win32 message fields used below.
        '' FB-LINTER: DISABLE-NEXT-LINE FBL808
        clear tvis, 0, sizeof(tvis)
        tvis.Item.Mask = TVIF_TEXT or TVIF_IMAGE or TVIF_SELECTEDIMAGE

        '' SNDMSG sends TVM_INSERTITEM synchronously; text owns the buffer for
        '' every insertion call and is not retained as an application pointer.
        '-- Root: tv.additem -> tv.item(0)
        text                    	= "FreeBasic"
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        tvis.item.pszText          	= strptr(text)
        tvis.item.cchTextMax       	= len(text)
        tvis.item.iImage         	= 0
        tvis.item.iSelectedImage 	= 1
        tvis.hInsertAfter        	= 0
        tvis.hParent             	= TVI_ROOT
        hPrev                   	= TreeView_InsertItem( htv, @tvis )

        '-- tv.additem -> tv.item(1) | tv.children=0
        text            	  		= "Inc"
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        tvis.item.pszText   		= strptr(text)
        tvis.item.cchTextMax		= len(text)
        tvis.hParent        		= hPrev
        hPrev            	  		= TreeView_InsertItem( htv, @tvis )

        '-- tv.additem -> tv.item(2) | tv.children=1
        text            			= "Win"
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        tvis.item.pszText   		= strptr(text)
        tvis.item.cchTextMax		= len(text)
        tvis.hParent      			= hPrev
        hPrev            			= TreeView_InsertItem( htv, @tvis )

        '-- tv.additem -> tv.item(3) | tv.children=2
        text            = "Gui"
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        tvis.item.pszText   		= strptr(text)
        tvis.item.cchTextMax		= len(text)
        tvis.hParent      			= hPrev
        hPrev            			= TreeView_InsertItem( htv, @tvis )

        '-- tv.additem -> tv.item(4) | tv.children=0
        text            			= "Assembler"
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        tvis.item.pszText   		= strptr(text)
        tvis.item.cchTextMax		= len(text)
        tvis.hParent      			= TVI_ROOT
        hPrev            			= TreeView_InsertItem( htv, @tvis )

        '-- tv.additem -> tv.item(5) | tv.children=0
        text            			= "Tutorials"
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        tvis.item.pszText   		= strptr(text)
        tvis.item.cchTextMax		= len(text)
        hPrev            			= TreeView_InsertItem( htv, @tvis )

        '-- tv.additem -> tv.item(6) | tv.children=0
        text            			= "Object Oriented"
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        tvis.item.pszText   		= strptr(text)
        tvis.item.cchTextMax		= len(text)
        hPrev            			= TreeView_InsertItem( htv, @tvis )

	case WM_SIZE
        GetClientRect( hWnd, @rc )
        if ( htv <> 0 ) then
			MoveWindow( htv, 0, 18, 160, rc.bottom - rc.top - 20, 1 )
        end if

	case WM_KEYDOWN
		if( lobyte( wParam ) = 27 ) then
            PostMessage( hWnd, WM_CLOSE, 0, 0 )
        end if

	case WM_DESTROY
        ImageList_Destroy( ilist )
        PostQuitMessage( 0 )
        exit function
	end select

	function = DefWindowProc( hWnd, uMsg, wParam, lParam )

end function


	''
	'' Main Program Exclusive Entry
	''
	dim wMsg as MSG
	dim wcls as WNDCLASS
	dim hWnd as HWND

	dim appName as string
	appName = "WinTreeView"

    with wcls
		.style         = CS_HREDRAW or CS_VREDRAW
        .lpfnWndProc   = cast( WNDPROC, @WndProc )
        .cbClsExtra    = 0
        .cbWndExtra    = 0
        .hInstance     = hInstance
        .hIcon         = LoadIcon( null, IDI_APPLICATION )
        .hCursor       = LoadCursor( null, IDC_ARROW )
        .hbrBackground = cast( HGDIOBJ, 16 ) ' btnface color
        .lpszMenuName  = null
        '' RegisterClass consumes the class-name buffer before appName changes.
        '' FB-LINTER: DISABLE-NEXT-LINE FBL427
        .lpszClassName = strptr( appName )
    end with

	if ( RegisterClass( @wcls ) = false ) then
		MessageBox( null, "Failed to register wcls!",  appName, MB_ICONERROR )
		end 1
	end if

    hWnd = CreateWindowEx( 0, appName, "Treeview Demo", _
                           WS_OVERLAPPEDWINDOW or WS_VISIBLE, _
                           100, 100, 420, 240, _
                           null, null, hInstance, null )

	''
    '' messages loop
    ''
	do until( GetMessage( @wMsg, null, 0, 0 ) = FALSE )
		TranslateMessage( @wMsg )
        DispatchMessage( @wMsg )
	loop
