Page 1 of 1

Posted: Fri Jul 04, 2008 12:42 pm
by gnozal
You could subclass the treeview :

Code: Select all

; treeview test 
#Tree=51 

Procedure TreeViewExpandAll(gadget.l) 
  Define hwndTV.l, hRoot.l, hItem.l 
  hwndTV.l = GadgetID(gadget)  
  hRoot.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)  
  hItem.l = hRoot  
  Repeat 
    SendMessage_(hwndTV, #TVM_EXPAND, #TVE_EXPAND, hItem) 
    hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXTVISIBLE , hItem)  
  Until hItem = #NULL  
  SendMessage_(hwndTV, #TVM_ENSUREVISIBLE, 0, hRoot) 
EndProcedure 

Procedure RemoveTreeRootBoxes(treeview, bool) 
  Define result.l 
  ;...This removes ALL +/- boxes at the tree root 
  If bool 
    result = SetWindowLong_(GadgetID(treeview), #GWL_STYLE, GetWindowLong_(GadgetID(treeview), #GWL_STYLE) & (~#TVS_LINESATROOT)) 
  Else 
    result = SetWindowLong_(GadgetID(treeview), #GWL_STYLE, GetWindowLong_(GadgetID(treeview), #GWL_STYLE) | #TVS_LINESATROOT) 
  EndIf 
  ProcedureReturn result 
EndProcedure 

Procedure SubClassedTree(hwnd.l, message.l, wParam.l, lParam.l)
  Shared OldProc
  If OldProc
    If message = #WM_LBUTTONDBLCLK
      Debug "#PB_EventType_LeftDoubleClick"
    Else
      ReturnValue = CallWindowProc_(OldProc, hwnd, message, wParam, lParam)
    EndIf
    ProcedureReturn ReturnValue
  EndIf
EndProcedure


If OpenWindow(0, 0, 0, 280, 200, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  
  TreeGadget(#Tree, 10, 10, 260, 180) ;,#PB_Tree_NoLines) 
  OldProc = SetWindowLong_(GadgetID(#Tree), #GWL_WNDPROC, @SubClassedTree())
  ;...Remove +/- boxes at tree root 
  RemoveTreeRootBoxes(#Tree, 1) 
  
  AddGadgetItem(#Tree, -1, "Here's one song", 0, 0) 
  AddGadgetItem(#Tree, -1, "Here's another song", 0, 0) 
  AddGadgetItem(#Tree, -1, "This is a Disk", 0, 0) 
  AddGadgetItem(#Tree, -1, "Song 01", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 02", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 03", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 04", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 05", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 06", 0, 1) 
  AddGadgetItem(#Tree, -1, "Some other song", 0, 0) 
  AddGadgetItem(#Tree, -1, "Just another song", 0, 0) 
  AddGadgetItem(#Tree, -1, "This is another Disk", 0, 0) 
  AddGadgetItem(#Tree, -1, "Song 01", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 02", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 03", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 04", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 05", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 06", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 07", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 08", 0, 1) 
  AddGadgetItem(#Tree, -1, "Another single song", 0, 0) 
  
  TreeViewExpandAll(#Tree) 
  
  Repeat 
    Event = WaitWindowEvent() 
  Until Event = #PB_Event_CloseWindow 
EndIf 
End

Posted: Fri Jul 04, 2008 12:44 pm
by srod
Alternatively :

Code: Select all

; treeview test 
#Tree=51 

Procedure TreeViewExpandAll(gadget.l) 
Define hwndTV.l, hRoot.l, hItem.l 
  hwndTV.l = GadgetID(gadget)  
  hRoot.l = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)  
  hItem.l = hRoot  
  Repeat 
    SendMessage_(hwndTV, #TVM_EXPAND, #TVE_EXPAND, hItem) 
    hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXTVISIBLE , hItem)  
  Until hItem = #Null  
  SendMessage_(hwndTV, #TVM_ENSUREVISIBLE, 0, hRoot) 
EndProcedure 


Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  Protected *nmh.NMHDR
  result = #PB_ProcessPureBasicEvents
  Select uMsg
    Case #WM_NOTIFY 
      *nmh = lParam
      Select *nmh\code
        Case #TVN_ITEMEXPANDING
          If *nmh\hwndFrom = GadgetID(#Tree)
            result =1
          EndIf
      EndSelect
  EndSelect
  ProcedureReturn Result
EndProcedure

If OpenWindow(0, 0, 0, 280, 200, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  
  TreeGadget(#Tree, 10, 10, 260, 180, #PB_Tree_NoLines|#PB_Tree_NoButtons) ;,#PB_Tree_NoLines) 

  AddGadgetItem(#Tree, -1, "Here's one song", 0, 0) 
  AddGadgetItem(#Tree, -1, "Here's another song", 0, 0) 
  AddGadgetItem(#Tree, -1, "This is a Disk", 0, 0) 
  AddGadgetItem(#Tree, -1, "Song 01", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 02", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 03", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 04", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 05", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 06", 0, 1) 
  AddGadgetItem(#Tree, -1, "Some other song", 0, 0) 
  AddGadgetItem(#Tree, -1, "Just another song", 0, 0) 
  AddGadgetItem(#Tree, -1, "This is another Disk", 0, 0) 
  AddGadgetItem(#Tree, -1, "Song 01", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 02", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 03", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 04", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 05", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 06", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 07", 0, 1) 
  AddGadgetItem(#Tree, -1, "Song 08", 0, 1) 
  AddGadgetItem(#Tree, -1, "Another single song", 0, 0) 
  TreeViewExpandAll(#Tree) 

  SetWindowCallback(@WinCallback())

  Repeat 
    Event = WaitWindowEvent() 
    Select Event 
    Case #PB_Event_Gadget 
      Select EventGadget() 
      Case #Tree 
        Select EventType() 
        Case #PB_EventType_LeftClick 
        Case #PB_EventType_RightClick 
        Case #PB_EventType_LeftDoubleClick 
        Case #PB_EventType_RightDoubleClick 
        EndSelect 
      EndSelect 
    EndSelect 
  Until Event = #PB_Event_CloseWindow 
EndIf 
End 

Thanks

Posted: Fri Jul 04, 2008 1:24 pm
by Perkin
Both answers work as i would like.

Thanks to both of you.

I think I'll go with the way srod done it.

I do need the 'bars' for the child nodes, so I've taken out the '#PB__Tree_NoLines'

On a side note - this no longer needed the 'RemoveTreeRootBoxes'

Can you say why.

Posted: Fri Jul 04, 2008 1:37 pm
by srod
Because of the #PB_Tree_NoButtons style which you case use with the TreeGadget() command.

Posted: Fri Jul 04, 2008 1:37 pm
by Perkin
I've just seen why it doesn't need RemoveTreeRootBoxes

'#PB_Tree_NoButtons'

Didn't notice it on first readthrough. (I don't usually use the flag, but as this is treeview will only have the one sublevel it works great)

Thanks for help.

Posted: Tue Jul 08, 2008 9:08 pm
by Perkin
I'm now using the code from 'gnozal' as this allows me to also have the root boxes, which fold, and also allows the doubleclick event to do what I want.

Thanks gnozal :D