(Versuch) TreeGadget + ListIconGadget = TreeListGadget

Anfängerfragen zum Programmieren mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von CNESM »

Ihr müsst XP Skin aktivieren, nur so als Hinweis!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von STARGÅTE »

Also das was du zuletzt gepostet hast funktioniert nun bei mir ...
zumindest von der Darstellung her, auch das hinzufügen geht.

Aber beim löschen von Einträgen werden beide Spalten asynkron.
Wenn ich zB einen offenen Tree oben lösche, bleiben die Namen trotzdem noch stehen.
Desweiteren wird irgenwie immer nur der 1. Eintrag gelöscht, auch wenn ich ein anderen Markiert habe
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von Jilocasin »

Die Umsetzung mit mehreren Gadgets finde ich irgendwie fragwürdig. Synchronisation der Items, Scrollen.. das alles hat mir irgendwie nicht gefallen.
Weil mich das Thema irgendwie gereizt hat, hab ich mich gestern mal hingesetzt.. und das hier ist dabei herausgekommen :mrgreen: (Sorry für den langen Beitrag).
Kann gern ergänzt/gebugfixt werden.. wie ihr wollt.

Bild

Code: Alles auswählen

; TreeListGadget.pbi
;
; Author: Jilocasin
; Date: 14. August 2010
; OS: Windows
;
; Developed and tested with PureBasic 4.51 RC 1 (x86)
;
;  ~  All TL_ functions/variables/labels should only be used within the provided TreeList procedures.
;  ~  To use the TreeListGadget just include the .pbi file and make sure you dispatch the events in your main event loop using DispatchTreeListEvent().
;  ~  Due to the individual item flags, a checkbox-category-item can be created. You should avoid that.
;  ~  #TreeList_LeftMarginPixelSize defines the horizontal space between the left border of a ListIconGadget And an item inside.





EnableExplicit


UsePNGImageDecoder()


#TreeList_NodeState_Closed = #False
#TreeList_NodeState_Expanded = #True

#TreeList_LeftMarginPixelSize = 6

#TreeListItem_Checkbox = %1

Enumeration 0
  #TreeListEvent_None
  
  #TreeListEvent_Checked
  #TreeListEvent_Unchecked
  #TreeListEvent_Closed
  #TreeListEvent_Expanded
EndEnumeration


Structure TREELISTITEM
  Text.s
  ImageID.i
  BackColor.i
  FrontColor.i
  
  SubLevel.i
  NodeState.i
  Flags.i
  Data.l
  
  Disabled.i
  Checked.i
EndStructure

Structure TREELISTGADGET
  ListIconGadget.i
  List Items.TREELISTITEM()
EndStructure

Structure TREELISTSTOCKIMAGES
  Closed.i
  Expanded.i
  Empty.i
  Checked.i
  Unchecked.i
EndStructure

Global NewList TL_AllTreeLists.TREELISTGADGET()

Global TL_StockImages.TREELISTSTOCKIMAGES


;------------


Procedure TL_HasItemSubLevel()
  Protected CurrentSubLevel.i
  Protected Result.i
  
  Result = #False
  
  CurrentSubLevel = TL_AllTreeLists()\Items()\SubLevel
  
  If NextElement(TL_AllTreeLists()\Items())
    If TL_AllTreeLists()\Items()\SubLevel > CurrentSubLevel
      Result = #True
    EndIf
    
    PreviousElement(TL_AllTreeLists()\Items())
  EndIf
  
  ProcedureReturn Result
EndProcedure


Procedure TL_AddListIconItem(Gadget.i, Item.i, *TreeListItem.TREELISTITEM)
  Protected LvItem.LVITEM
  Protected ImageID.i
  
  If TL_HasItemSubLevel()
    If *TreeListItem\NodeState = #TreeList_NodeState_Closed
      ImageID = ImageID(TL_StockImages\Closed)
    Else
      ImageID = ImageID(TL_StockImages\Expanded)
    EndIf
  Else
    If *TreeListItem\Flags & #TreeListItem_Checkbox
      If *TreeListItem\Checked
        ImageID = ImageID(TL_StockImages\Checked)
      Else
        ImageID = ImageID(TL_StockImages\Unchecked)
      EndIf
    Else
      ImageID = *TreeListItem\ImageID
    EndIf
  EndIf
  
  AddGadgetItem(Gadget, Item, *TreeListItem\Text, ImageID)
  LvItem\iItem = Item
  LvItem\iSubItem = 0
  LvItem\mask = #LVIF_INDENT
  
  If *TreeListItem\FrontColor <> #PB_Ignore
    SetGadgetItemColor(Gadget, Item, #PB_Gadget_FrontColor, *TreeListItem\FrontColor)
  EndIf
  If *TreeListItem\BackColor <> #PB_Ignore
    SetGadgetItemColor(Gadget, Item, #PB_Gadget_BackColor, *TreeListItem\BackColor)
  EndIf
  
  If SendMessage_(GadgetID(Gadget), #LVM_GETITEM, 0, @LvItem)
    LvItem\iIndent = *TreeListItem\SubLevel
    SendMessage_(GadgetID(Gadget), #LVM_SETITEM, 0, @LvItem)
  EndIf
  
  SetGadgetItemData(Gadget, Item, *TreeListItem)
EndProcedure


;------------


Procedure GetTreeListItemFlags(Gadget.i, Item.i, *Item)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  ProcedureReturn TL_AllTreeLists()\Items()\Flags
EndProcedure


Procedure GetTreeListItemNodeState(Gadget.i, Item.i, *Item)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  ProcedureReturn TL_AllTreeLists()\Items()\NodeState
EndProcedure


Procedure SetTreeListItemNodeState(Gadget.i, Item.i, *Item.TREELISTITEM, State.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  Protected ChangingSubLevel.i
  Protected VisibleElementsCount.i
  Protected VisibleLockedSubLevel.i
  
  Protected CursorState.i
  
  *Item\NodeState = State
  
  VisibleElementsCount = 0
  VisibleLockedSubLevel = -1
  
  ResetList(TL_AllTreeLists()\Items())
  While NextElement(TL_AllTreeLists()\Items())
    If @TL_AllTreeLists()\Items() = *Item
      VisibleElementsCount + 1
      Break
    EndIf
    
    If VisibleLockedSubLevel = -1
      VisibleElementsCount + 1
    Else
      If TL_AllTreeLists()\Items()\SubLevel <= VisibleLockedSubLevel
        VisibleLockedSubLevel = -1
        VisibleElementsCount + 1
      EndIf
    EndIf
    
    If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed And VisibleLockedSubLevel = -1
      VisibleLockedSubLevel = TL_AllTreeLists()\Items()\SubLevel
    EndIf
  Wend
  
  ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  
  If TL_HasItemSubLevel()
    CursorState = GetGadgetState(Gadget)
    
    If *Item\NodeState = #TreeList_NodeState_Closed
      RemoveGadgetItem(Gadget, VisibleElementsCount - 1)
      TL_AddListIconItem(Gadget, VisibleElementsCount - 1, *Item)
    Else
      RemoveGadgetItem(Gadget, VisibleElementsCount - 1)
      TL_AddListIconItem(Gadget, VisibleElementsCount - 1, *Item)
    EndIf
    
    SetGadgetState(Gadget, CursorState)
  EndIf
  
  If ListIndex(TL_AllTreeLists()\Items()) + 1 = ListSize(TL_AllTreeLists()\Items())
    ProcedureReturn
  EndIf
  
  Select State
  Case #TreeList_NodeState_Closed
    ChangingSubLevel = TL_AllTreeLists()\Items()\SubLevel
    
    ChangeCurrentElement(TL_AllTreeLists()\Items(), GetGadgetItemData(Gadget, VisibleElementsCount))
    While TL_AllTreeLists()\Items()\SubLevel > ChangingSubLevel
      RemoveGadgetItem(Gadget, VisibleElementsCount)
      
      If GetGadgetItemData(Gadget, VisibleElementsCount)
        ChangeCurrentElement(TL_AllTreeLists()\Items(), GetGadgetItemData(Gadget, VisibleElementsCount))
      Else
        Break
      EndIf
    Wend
    
  Case #TreeList_NodeState_Expanded
    ChangingSubLevel = *Item\SubLevel
    VisibleLockedSubLevel = -1
    
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
    
    While NextElement(TL_AllTreeLists()\Items())
      If TL_AllTreeLists()\Items()\SubLevel > ChangingSubLevel
        If VisibleLockedSubLevel = -1
          TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
          VisibleElementsCount + 1
        Else
          If TL_AllTreeLists()\Items()\SubLevel <= VisibleLockedSubLevel
            VisibleLockedSubLevel = -1
            TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
            VisibleElementsCount + 1
          EndIf
        EndIf
        
        If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed And VisibleLockedSubLevel = -1
          VisibleLockedSubLevel = TL_AllTreeLists()\Items()\SubLevel
        EndIf
      Else
        Break
      EndIf
    Wend
  EndSelect
EndProcedure



Procedure GetTreeListItemSubLevel(Gadget.i, Item.i, *Item)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  ProcedureReturn TL_AllTreeLists()\Items()\SubLevel
EndProcedure


Procedure GetTreeListItemData(Gadget.i, Item.i, *Item)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  ProcedureReturn TL_AllTreeLists()\Items()\Data
EndProcedure


Procedure SetTreeListItemData(Gadget.i, Item.i, *Item, NewData.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  TL_AllTreeLists()\Items()\Data = NewData
EndProcedure


Procedure.s GetTreeListItemText(Gadget.i, Item.i, *Item)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn ""
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  ProcedureReturn TL_AllTreeLists()\Items()\Text
EndProcedure


Procedure SetTreeListItemText(Gadget.i, Item.i, *Item.TREELISTITEM, Text.s)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
    *Item = @TL_AllTreeLists()\Items()
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  TL_AllTreeLists()\Items()\Text = Text
  
  Protected VisibleElementsCount.i
  Protected VisibleLockedSubLevel.i
  Protected CurrentTestSubLevel.i
  
  VisibleElementsCount = 0
  VisibleLockedSubLevel = -1
  
  ResetList(TL_AllTreeLists()\Items())
  While NextElement(TL_AllTreeLists()\Items())
    If @TL_AllTreeLists()\Items() = *Item
      Break
    EndIf
    
    If VisibleLockedSubLevel = -1
      VisibleElementsCount + 1
    Else
      If TL_AllTreeLists()\Items()\SubLevel <= VisibleLockedSubLevel
        VisibleLockedSubLevel = -1
        VisibleElementsCount + 1
      EndIf
    EndIf
    
    If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed And VisibleLockedSubLevel = -1
      VisibleLockedSubLevel = TL_AllTreeLists()\Items()\SubLevel
    EndIf
  Wend
  
  ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  CurrentTestSubLevel = *Item\SubLevel
  
  SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #False, 0)
  
  If *Item\SubLevel > 0
    While PreviousElement(TL_AllTreeLists()\Items())
      If TL_AllTreeLists()\Items()\SubLevel = CurrentTestSubLevel - 1
        If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed
          Break
        Else
          CurrentTestSubLevel - 1
          
          If CurrentTestSubLevel = 0
            RemoveGadgetItem(Gadget, VisibleElementsCount)
            ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
            TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
            
            Break
          EndIf
        EndIf
      EndIf
    Wend
  Else
    RemoveGadgetItem(Gadget, VisibleElementsCount)
    TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
  EndIf
  
  SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #True, 0)
  InvalidateRect_(GadgetID(Gadget), 0, 0)
EndProcedure


Procedure GetTreeListItemColor(Gadget.i, Item.i, *Item, ColorType.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  Select ColorType
  Case #PB_Gadget_FrontColor
    ProcedureReturn TL_AllTreeLists()\Items()\FrontColor
    
  Case #PB_Gadget_BackColor
    ProcedureReturn TL_AllTreeLists()\Items()\BackColor
  EndSelect
EndProcedure


Procedure SetTreeListItemColor(Gadget.i, Item.i, *Item.TREELISTITEM, ColorType.i, Color.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
    *Item = @TL_AllTreeLists()\Items()
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  Select ColorType
  Case #PB_Gadget_FrontColor
    TL_AllTreeLists()\Items()\FrontColor = Color
    
  Case #PB_Gadget_BackColor
    TL_AllTreeLists()\Items()\BackColor = Color
  EndSelect
  
  Protected VisibleElementsCount.i
  Protected VisibleLockedSubLevel.i
  Protected CurrentTestSubLevel.i
  
  VisibleElementsCount = 0
  VisibleLockedSubLevel = -1
  
  ResetList(TL_AllTreeLists()\Items())
  While NextElement(TL_AllTreeLists()\Items())
    If @TL_AllTreeLists()\Items() = *Item
      Break
    EndIf
    
    If VisibleLockedSubLevel = -1
      VisibleElementsCount + 1
    Else
      If TL_AllTreeLists()\Items()\SubLevel <= VisibleLockedSubLevel
        VisibleLockedSubLevel = -1
        VisibleElementsCount + 1
      EndIf
    EndIf
    
    If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed And VisibleLockedSubLevel = -1
      VisibleLockedSubLevel = TL_AllTreeLists()\Items()\SubLevel
    EndIf
  Wend
  
  ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  CurrentTestSubLevel = *Item\SubLevel
  
  SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #False, 0)
  
  If *Item\SubLevel > 0
    While PreviousElement(TL_AllTreeLists()\Items())
      If TL_AllTreeLists()\Items()\SubLevel = CurrentTestSubLevel - 1
        If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed
          Break
        Else
          CurrentTestSubLevel - 1
          
          If CurrentTestSubLevel = 0
            RemoveGadgetItem(Gadget, VisibleElementsCount)
            ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
            TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
            
            Break
          EndIf
        EndIf
      EndIf
    Wend
  Else
    RemoveGadgetItem(Gadget, VisibleElementsCount)
    TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
  EndIf
  
  SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #True, 0)
  InvalidateRect_(GadgetID(Gadget), 0, 0)
EndProcedure


;------------


Procedure DisableTreeListItem(Gadget.i, Item.i, *Item, Disabled.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  TL_AllTreeLists()\Items()\Disabled = Disabled
EndProcedure


Procedure CheckTreeListItem(Gadget.i, Item.i, *Item.TREELISTITEM, Checked.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
    *Item = @TL_AllTreeLists()\Items()
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  TL_AllTreeLists()\Items()\Checked = Checked
  
  Protected VisibleElementsCount.i
  Protected VisibleLockedSubLevel.i
  Protected CurrentTestSubLevel.i
  
  VisibleElementsCount = 0
  VisibleLockedSubLevel = -1
  
  ResetList(TL_AllTreeLists()\Items())
  While NextElement(TL_AllTreeLists()\Items())
    If @TL_AllTreeLists()\Items() = *Item
      Break
    EndIf
    
    If VisibleLockedSubLevel = -1
      VisibleElementsCount + 1
    Else
      If TL_AllTreeLists()\Items()\SubLevel <= VisibleLockedSubLevel
        VisibleLockedSubLevel = -1
        VisibleElementsCount + 1
      EndIf
    EndIf
    
    If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed And VisibleLockedSubLevel = -1
      VisibleLockedSubLevel = TL_AllTreeLists()\Items()\SubLevel
    EndIf
  Wend
  
  ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  CurrentTestSubLevel = *Item\SubLevel
  
  SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #False, 0)
  
  If *Item\SubLevel > 0
    While PreviousElement(TL_AllTreeLists()\Items())
      If TL_AllTreeLists()\Items()\SubLevel = CurrentTestSubLevel - 1
        If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed
          Break
        Else
          CurrentTestSubLevel - 1
          
          If CurrentTestSubLevel = 0
            RemoveGadgetItem(Gadget, VisibleElementsCount)
            ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
            TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
            
            Break
          EndIf
        EndIf
      EndIf
    Wend
  Else
    RemoveGadgetItem(Gadget, VisibleElementsCount)
    TL_AddListIconItem(Gadget, VisibleElementsCount, @TL_AllTreeLists()\Items())
  EndIf
  
  SendMessage_(GadgetID(Gadget), #WM_SETREDRAW, #True, 0)
  InvalidateRect_(GadgetID(Gadget), 0, 0)
EndProcedure


Procedure IsTreeListItemDisabled(Gadget.i, Item.i, *Item)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  ProcedureReturn TL_AllTreeLists()\Items()\Disabled
EndProcedure


Procedure IsTreeListItemChecked(Gadget.i, Item.i, *Item)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  ProcedureReturn TL_AllTreeLists()\Items()\Checked
EndProcedure


;------------


Procedure TreeListGadget(Gadget.i, x.i, y.i, Width.i, Height.i, Columns.s, Flags.i = 0)
  Protected ColumnCount.i = (CountString(Columns, #LF$) + 1) / 2
  Protected ColumnIndex.i
  Protected Result.i
  
  If TL_StockImages\Closed = 0 And TL_StockImages\Expanded = 0
    TL_StockImages\Closed = CatchImage(#PB_Any, ?TL_Image_Closed)
    TL_StockImages\Expanded = CatchImage(#PB_Any, ?TL_Image_Expanded)
    TL_StockImages\Empty = CatchImage(#PB_Any, ?TL_Image_Empty)
    TL_StockImages\Checked = CatchImage(#PB_Any, ?TL_Image_Checked)
    TL_StockImages\Unchecked = CatchImage(#PB_Any, ?TL_Image_Unchecked)
  EndIf
  
  Flags = Flags & ~#PB_ListIcon_MultiSelect & ~#PB_ListIcon_CheckBoxes & ~#PB_ListIcon_HeaderDragDrop
  
  If Gadget = #PB_Any
    Gadget = ListIconGadget(Gadget, x, y, Width, Height, StringField(Columns, 1, #LF$), Val(StringField(Columns, 2, #LF$)), Flags)
    If Gadget
      Result = Gadget
    Else
      ProcedureReturn #False
    EndIf
  Else
    If ListIconGadget(Gadget, x, y, Width, Height, StringField(Columns, 1, #LF$), Val(StringField(Columns, 2, #LF$)), Flags)
      Result = #True
    Else
      ProcedureReturn #False
    EndIf
  EndIf
  
  For ColumnIndex = 1 To ColumnCount - 1
    AddGadgetColumn(Gadget, ColumnIndex, StringField(Columns, ColumnIndex * 2 + 1, #LF$), Val(StringField(Columns, ColumnIndex * 2 + 2, #LF$)))
  Next
  
  AddElement(TL_AllTreeLists())
  TL_AllTreeLists()\ListIconGadget = Gadget
  
  SetGadgetData(Gadget, @TL_AllTreeLists())
EndProcedure


Procedure FreeTreeListGadget(Gadget.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  ClearList(TL_AllTreeLists()\Items())
  ClearGadgetItems(TL_AllTreeLists()\ListIconGadget)
  FreeGadget(TL_AllTreeLists()\ListIconGadget)
  DeleteElement(TL_AllTreeLists())
EndProcedure



Procedure AddTreeListItem(Gadget.i, Item.i, Text.s, SubLevel.i = 0, NodeState.i = #PB_Ignore, ImageID.i = #PB_Ignore, Flags.i = 0) ; Returns the position of the new item
  Protected *TreeListItem.TREELISTITEM
  
  Protected CurrentTestSubLevel.i
  
  Protected VisibleElementsCount.i
  Protected VisibleLockedSubLevel.i
  
  If NodeState = #PB_Ignore
     NodeState = #TreeList_NodeState_Expanded
  EndIf
  
  If ImageID = #PB_Ignore
     ImageID = ImageID(TL_StockImages\Empty)
  EndIf
  
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = -1 Or Item >= ListSize(TL_AllTreeLists()\Items())
    LastElement(TL_AllTreeLists()\Items())
    AddElement(TL_AllTreeLists()\Items())
    Item = ListSize(TL_AllTreeLists()\Items()) - 1
  Else
    SelectElement(TL_AllTreeLists()\Items(), Item)
    InsertElement(TL_AllTreeLists()\Items())
  EndIf
  
  *TreeListItem = @TL_AllTreeLists()\Items()
    
  TL_AllTreeLists()\Items()\Text = Text
  TL_AllTreeLists()\Items()\ImageID = ImageID
  TL_AllTreeLists()\Items()\SubLevel = SubLevel
  TL_AllTreeLists()\Items()\NodeState = NodeState
  TL_AllTreeLists()\Items()\Disabled = #False
  TL_AllTreeLists()\Items()\Flags = Flags
  TL_AllTreeLists()\Items()\FrontColor = #PB_Ignore
  TL_AllTreeLists()\Items()\BackColor = #PB_Ignore
  
  VisibleElementsCount = 0
  VisibleLockedSubLevel = -1
  
  ResetList(TL_AllTreeLists()\Items())
  While NextElement(TL_AllTreeLists()\Items())
    If @TL_AllTreeLists()\Items() = *TreeListItem
      Break
    EndIf
    
    If VisibleLockedSubLevel = -1
      VisibleElementsCount + 1
    Else
      If TL_AllTreeLists()\Items()\SubLevel <= VisibleLockedSubLevel
        VisibleLockedSubLevel = -1
        VisibleElementsCount + 1
      EndIf
    EndIf
    
    If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed And VisibleLockedSubLevel = -1
      VisibleLockedSubLevel = TL_AllTreeLists()\Items()\SubLevel
    EndIf
  Wend
  
  ChangeCurrentElement(TL_AllTreeLists()\Items(), *TreeListItem)
  CurrentTestSubLevel = SubLevel
  
  If SubLevel > 0
    While PreviousElement(TL_AllTreeLists()\Items())
      If TL_AllTreeLists()\Items()\SubLevel = CurrentTestSubLevel - 1
        If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed
          If CurrentTestSubLevel <> SubLevel
            Break
          EndIf
        EndIf
        
        CurrentTestSubLevel - 1
        
        If CurrentTestSubLevel = 0
          
          ChangeCurrentElement(TL_AllTreeLists()\Items(), *TreeListItem)
          If PreviousElement(TL_AllTreeLists()\Items())
            If TL_AllTreeLists()\Items()\SubLevel < *TreeListItem\SubLevel
              RemoveGadgetItem(Gadget, VisibleElementsCount - 1)
              TL_AddListIconItem(Gadget, VisibleElementsCount - 1, @TL_AllTreeLists()\Items())
            EndIf
          EndIf
          
          Break
        EndIf
      EndIf
    Wend
  EndIf
  
  ChangeCurrentElement(TL_AllTreeLists()\Items(), *TreeListItem)
  CurrentTestSubLevel = SubLevel
  
  If SubLevel > 0
    While PreviousElement(TL_AllTreeLists()\Items())
      If TL_AllTreeLists()\Items()\SubLevel = CurrentTestSubLevel - 1
        If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed
          Break
        Else
          CurrentTestSubLevel - 1
          
          If CurrentTestSubLevel = 0
            ChangeCurrentElement(TL_AllTreeLists()\Items(), *TreeListItem)
            TL_AddListIconItem(TL_AllTreeLists()\ListIconGadget, VisibleElementsCount, *TreeListItem)
            Break
          EndIf
        EndIf
      EndIf
    Wend
  Else
    TL_AddListIconItem(TL_AllTreeLists()\ListIconGadget, VisibleElementsCount, *TreeListItem)
  EndIf
  
  ProcedureReturn Item
EndProcedure


Procedure RemoveTreeListItem(Gadget.i, Item.i, *Item.TREELISTITEM)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  
  If Item = #PB_Ignore And *Item = #PB_Ignore
    ProcedureReturn 0
  EndIf
  
  If Item <> #PB_Ignore
    SelectElement(TL_AllTreeLists()\Items(), Item)
    *Item = @TL_AllTreeLists()\Items()
  ElseIf *Item <> #PB_Ignore
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
  EndIf
  
  If TL_HasItemSubLevel() = #False
    Protected VisibleElementsCount.i
    Protected VisibleLockedSubLevel.i
    
    Protected CurrentTestSubLevel.i
    
    Protected ItemDeleted.i
    
    
    VisibleElementsCount = 0
    VisibleLockedSubLevel = -1
    
    ResetList(TL_AllTreeLists()\Items())
    While NextElement(TL_AllTreeLists()\Items())
      If @TL_AllTreeLists()\Items() = *Item
        Break
      EndIf
      
      If VisibleLockedSubLevel = -1
        VisibleElementsCount + 1
      Else
        If TL_AllTreeLists()\Items()\SubLevel <= VisibleLockedSubLevel
          VisibleLockedSubLevel = -1
          VisibleElementsCount + 1
        EndIf
      EndIf
      
      If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed And VisibleLockedSubLevel = -1
        VisibleLockedSubLevel = TL_AllTreeLists()\Items()\SubLevel
      EndIf
    Wend
    
    ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
    CurrentTestSubLevel = *Item\SubLevel
    
    ItemDeleted = #False
    
    If *Item\SubLevel > 0
      While PreviousElement(TL_AllTreeLists()\Items())
        If TL_AllTreeLists()\Items()\SubLevel = CurrentTestSubLevel - 1
          If TL_AllTreeLists()\Items()\NodeState = #TreeList_NodeState_Closed
            Break
          Else
            CurrentTestSubLevel - 1
            
            If CurrentTestSubLevel = 0
              RemoveGadgetItem(TL_AllTreeLists()\ListIconGadget, VisibleElementsCount)
              
              ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
              DeleteElement(TL_AllTreeLists()\Items())
              
              ItemDeleted = #True
              
              If TL_HasItemSubLevel() = #False
                RemoveGadgetItem(Gadget, VisibleElementsCount - 1)
                TL_AddListIconItem(Gadget, VisibleElementsCount - 1, @TL_AllTreeLists()\Items())
              EndIf
              
              Break
            EndIf
          EndIf
        EndIf
      Wend
    Else
      RemoveGadgetItem(TL_AllTreeLists()\ListIconGadget, VisibleElementsCount)
    EndIf
    
    If ItemDeleted = #False
      ChangeCurrentElement(TL_AllTreeLists()\Items(), *Item)
      DeleteElement(TL_AllTreeLists()\Items())
    EndIf
    
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure


Procedure GetTreeListState(Gadget.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  ChangeCurrentElement(TL_AllTreeLists()\Items(), GetGadgetItemData(Gadget, GetGadgetState(Gadget)))
  ProcedureReturn ListIndex(TL_AllTreeLists()\Items())
EndProcedure


Procedure ClearTreeListItems(Gadget.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  ClearList(TL_AllTreeLists()\Items())
  ClearGadgetItems(TL_AllTreeLists()\ListIconGadget)
EndProcedure


Procedure CountTreeListItems(Gadget.i)
  ChangeCurrentElement(TL_AllTreeLists(), GetGadgetData(Gadget))
  ProcedureReturn ListSize(TL_AllTreeLists()\Items())
EndProcedure


;------------


Procedure DispatchTreeListEvent()
  Protected EventGadget.i
  Protected EventType.i
  Protected GadgetItemData.i
  Protected Result.i
  
  EventGadget = EventGadget()
  EventType = EventType()
  GadgetItemData = GetGadgetItemData(EventGadget(), GetGadgetState(EventGadget()))
  Result = #TreeListEvent_None
  
  ForEach TL_AllTreeLists()
    If EventGadget = TL_AllTreeLists()\ListIconGadget And GetGadgetState(EventGadget) <> -1 And IsTreeListItemDisabled(EventGadget(), #PB_Ignore, GadgetItemData) = 0
      Select EventType
      Case #PB_EventType_LeftClick
        Define ScrollInfo.SCROLLINFO
        
        ScrollInfo\cbSize = SizeOf(SCROLLINFO)
        ScrollInfo\fMask = #SIF_POS
        
        If GetScrollInfo_(GadgetID(EventGadget), #SB_HORZ, @ScrollInfo)
          If WindowMouseX(0) > GadgetX(EventGadget) - ScrollInfo\nPos + #TreeList_LeftMarginPixelSize + 16 * GetTreeListItemSubLevel(EventGadget, #PB_Ignore, GadgetItemData)
            If WindowMouseX(0) < GadgetX(EventGadget) - ScrollInfo\nPos + 16 + #TreeList_LeftMarginPixelSize + 16 * GetTreeListItemSubLevel(EventGadget, #PB_Ignore, GadgetItemData)
              ChangeCurrentElement(TL_AllTreeLists()\Items(), GadgetItemData)
              If GetTreeListItemFlags(EventGadget, #PB_Ignore, GadgetItemData) & #TreeListItem_Checkbox And TL_HasItemSubLevel() = 0
                Protected CurrentState = GetGadgetState(EventGadget)
                
                If IsTreeListItemChecked(EventGadget, #PB_Ignore, GadgetItemData)
                  CheckTreeListItem(EventGadget, #PB_Ignore, GadgetItemData, #False)
                  Result = #TreeListEvent_Unchecked
                Else
                  CheckTreeListItem(EventGadget, #PB_Ignore, GadgetItemData, #True)
                  Result = #TreeListEvent_Checked
                EndIf
                
                SetGadgetState(EventGadget, CurrentState)
              Else
                Select GetTreeListItemNodeState(EventGadget, #PB_Ignore, GadgetItemData)
                Case #TreeList_NodeState_Closed
                  SetTreeListItemNodeState(EventGadget, #PB_Ignore, GadgetItemData, #TreeList_NodeState_Expanded)
                  Result = #TreeListEvent_Expanded
                  
                Case #TreeList_NodeState_Expanded
                  SetTreeListItemNodeState(EventGadget, #PB_Ignore, GadgetItemData, #TreeList_NodeState_Closed)
                  Result = #TreeListEvent_Closed
                  
                EndSelect
              EndIf
            EndIf
          EndIf
        EndIf
        
      Case #PB_EventType_LeftDoubleClick
        Select GetTreeListItemNodeState(EventGadget(), #PB_Ignore, GadgetItemData)
        Case #TreeList_NodeState_Closed
          SetTreeListItemNodeState(EventGadget(), #PB_Ignore, GadgetItemData, #TreeList_NodeState_Expanded)
          Result = #TreeListEvent_Expanded
          
        Case #TreeList_NodeState_Expanded
          SetTreeListItemNodeState(EventGadget(), #PB_Ignore, GadgetItemData, #TreeList_NodeState_Closed)
          Result = #TreeListEvent_Closed
          
        EndSelect
        
      EndSelect
      
      Break
    EndIf
  Next
  
  ProcedureReturn Result
EndProcedure


;------------


DataSection
  TL_Image_Closed:
  Data.b -119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31, -13, -1, 97, 0, 0, 0, 7, 116, 73, 77, 69, 7, -38, 8, 14, 12, 58, 9, -6, -79
  Data.b 54, -94, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 18, 0, 0, 11, 18, 1, -46, -35, 126, -4, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, -79, -113, 11, -4, 97, 5, 0, 0, 1, -13, 73, 68, 65, 84, 120, -38, -59
  Data.b -109, -67, 107, 83, 81, 24, -58, 127, -25, -36, 123, 19, 74, -109, -101, 38, 34, 14, 98, -111, 34, -8, -119, 20, 23, -117, 91, -63, 46, -118, -72, 57, 56, 88, -16, 99, 20, -100, 4, 7, -1, 1, -63, -43, 85, -63, -51, -63, -83, 104
  Data.b 113, -112, -118, -125, -43, 65, 58, 8, 69, -95, -125, -42, -113, -88, 105, -102, 52, 77, 114, -65, -50, -15, 61, 13, -119, -106, 116, 18, -63, 115, 121, -32, 112, -33, -13, -4, -34, 123, 30, -34, 11, -1, 123, -87, -2, -26, -64, -55, 55, 51
  Data.b -57, -113, -115, -50, -74, -69, 90, -75, -38, -48, 108, 103, -84, 124, -116, 105, 117, 18, -48, 6, -91, 50, 57, 21, 67, 55, -82, -39, 118, -29, 54, -11, 11, 13, -25, -13, -5, -128, -103, -23, -14, -99, 19, -109, -69, 38, -85, 117, 69, -75
  Data.b 102, -88, -82, 27, 58, -59, -108, 15, 107, 6, 10, 10, 59, 42, -67, -14, -122, 96, 117, -123, 100, -87, -75, 44, -106, 123, -50, -89, -5, -128, 92, -32, -5, 86, 7, -32, -27, 33, 24, 97, -9, 30, -97, -101, -77, 62, -31, -66, 28, -20
  Data.b 45, -62, -72, 104, -94, -120, 29, 47, 73, -37, -92, -48, -9, -23, -33, -105, -15, 68, -86, 39, 79, 113, 104, 127, -58, -107, -77, 21, -98, -36, 10, 40, 85, 82, 40, 75, -67, 34, 10, 125, -25, -14, -122, 1, -125, 64, -84, 60, 25, 47
  Data.b -106, 3, 30, 45, -4, -32, -44, -63, -112, -89, -105, 21, -91, 48, -126, -110, 28, 119, 87, -47, -39, -64, -25, -1, 9, 48, 38, -27, -46, 25, 24, 11, 3, -127, 72, -55, 22, -80, -42, 50, 53, 17, 50, 127, 110, -125, -45, -81, 98, -70
  Data.b 121, 1, 88, -85, 118, 4, -72, 111, -88, -42, 18, 54, 35, 69, 106, -40, 74, -1, 104, 97, 100, -85, -14, -82, 110, 105, -101, 0, 109, -73, 59, -74, 1, -76, -10, -104, 95, -52, 81, -35, -128, 90, -108, 114, -3, -68, -110, 72, 20, -9
  Data.b 95, 55, -71, -74, 24, 96, 74, 10, 29, 89, -105, -109, -35, 17, 48, 120, 43, -35, -89, -113, 36, 76, 29, 30, -29, -63, 66, -125, -85, 115, 98, 46, -21, 94, -95, 37, 50, -98, 25, 6, -40, -52, -35, -83, -89, -52, -14, 114, 9, -34
  Data.b 127, -83, 113, -9, -71, -21, -20, -48, 82, -113, 68, -51, -44, 113, -78, 33, 64, 20, -89, 49, 70, 38, -51, 5, -100, -56, 16, 53, 12, -113, -33, 38, -104, 53, 73, -65, 37, -103, -55, -128, -111, -53, 80, 95, -42, -27, -116, -41, 28, 2
  Data.b -52, 61, -5, 121, -29, -45, -25, -18, -59, 78, -20, -23, -51, -74, -95, 37, -6, -74, -22, 70, 87, 70, 89, -55, 40, 107, -41, 52, 33, -115, -46, 26, -33, -61, -121, -1, -6, -97, -6, -5, -11, 11, -3, 3, -57, -85, -25, -100, -62, -98
  Data.b 0, 0, 0, 0, 73, 69, 78, 68, -82, 66, 96, -126


  TL_Image_Expanded:
  Data.b -119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31, -13, -1, 97, 0, 0, 0, 7, 116, 73, 77, 69, 7, -38, 8, 14, 12, 58, 17, -23, -35
  Data.b -82, -12, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 18, 0, 0, 11, 18, 1, -46, -35, 126, -4, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, -79, -113, 11, -4, 97, 5, 0, 0, 1, -15, 73, 68, 65, 84, 120, -38, -59
  Data.b -109, -49, 107, 19, 65, 20, -57, 63, 51, -69, -101, 104, 72, -101, 68, -91, -98, -60, -109, 82, 42, 20, 13, -120, 23, 69, 47, -94, 40, -24, -95, 7, -63, -117, -126, -11, 36, -98, 4, -1, 3, -113, -126, -1, -127, -96, 120, -13, -86, 32
  Data.b 61, -12, 38, -115, 32, 30, 85, -88, -95, -108, 18, 92, 37, -90, 89, -14, 107, 119, 103, 103, 125, -69, 49, -11, 71, 122, 18, -63, -127, 89, 30, 51, -17, 125, -26, -5, -66, 59, 3, -1, 123, -88, 73, 112, -88, -66, 118, -26, -14, -7
  Data.b 3, -113, -118, 5, -73, -128, 114, 118, -49, 78, 19, -94, -40, -104, -107, -43, -50, -3, -11, -58, -55, -107, 108, -55, -99, -20, 45, 46, -108, -81, -41, 79, -20, -85, -93, 11, -126, 85, 57, -39, -38, 36, -85, 66, 107, 87, -66, 89, -104, -94
  Data.b 108, -116, -1, 53, -70, -79, -34, -32, 119, -64, 48, 114, -12, -105, -114, 6, -57, -55, 1, -39, -72, 112, 106, -60, -63, -3, 46, 79, 94, -22, -79, 88, 1, -112, 24, 6, 35, -67, -93, 124, 7, -48, 31, 88, -4, -74, 5, 79, -110, 28
  Data.b -39, -105, -102, 114, -39, -93, 58, -21, -14, -71, 107, -91, 92, -64, -103, -96, -40, -46, 27, -4, -20, 74, 79, -126, 94, 6, -24, 88, -126, 48, 100, -15, -56, -112, 118, 104, 48, -106, 92, -70, 63, 76, 56, 122, -72, -113, -43, 33, -2, -74
  Data.b -28, 12, -110, 105, -64, -58, 86, -60, -37, 102, -52, -36, 92, -62, -14, -107, 42, 119, -81, 74, -87, -74, -71, -20, -91, -45, 67, -18, 44, -43, 56, 62, 111, 120, -73, 97, 104, 110, 70, 76, -73, 48, -118, -7, -12, -51, -14, 112, -43, 99
  Data.b 97, -66, -53, -51, -77, 21, -87, -51, -83, -29, -38, -71, 18, -81, 63, 6, -36, 123, 14, -127, -28, 48, -116, -89, 21, -120, -67, -46, -76, -62, 86, 28, 110, -67, -16, 120, -4, 38, 16, 47, 85, 62, -41, -102, 1, -105, -98, -90, 4, -91
  Data.b 61, 121, 78, -82, -20, 79, 5, 74, 39, -92, 37, -39, -84, 8, -92, -26, -80, -36, 80, -92, 123, 3, -114, -43, 20, 23, 95, 65, 119, 70, -118, -115, -12, -66, -99, 65, -109, -15, 111, -3, 21, 32, -10, 66, 65, 18, 74, -55, 15, 37
  Data.b -118, -37, -17, 61, 74, -38, -48, -101, 41, 102, -105, 2, 34, -103, -59, -20, -12, 93, 60, 32, 52, 109, -81, -43, 36, -11, -86, -48, -111, -27, -78, 116, 87, 84, -116, 68, -108, 27, -54, 121, 125, -103, -127, 65, 109, 117, 49, -93, -88, 61
  Data.b 5, 72, 91, -23, -125, -40, -8, -101, 124, 104, -51, -118, 51, 14, 58, -47, -30, -30, -8, -62, 40, -107, 98, 29, -117, -107, -101, 96, -68, -98, -76, -14, -20, -97, 63, -86, -65, 30, -33, 1, 80, 45, -49, 68, -53, -121, 103, -44, 0, 0
  Data.b 0, 0, 73, 69, 78, 68, -82, 66, 96, -126
  
  TL_Image_Empty:
  Data.b -119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31, -13, -1, 97, 0, 0, 0, 7, 116, 73, 77, 69, 7, -38, 8, 14, 13, 33, 41, 105, 43
  Data.b -73, -57, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 18, 0, 0, 11, 18, 1, -46, -35, 126, -4, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, -79, -113, 11, -4, 97, 5, 0, 0, 0, 22, 73, 68, 65, 84, 120, -38, 99
  Data.b 96, -96, 12, -80, 83, -88, 127, 20, -116, -126, 81, 48, 120, 0, 0, 30, -64, 0, 8, -5, 113, 44, 98, 0, 0, 0, 0, 73, 69, 78, 68, -82, 66, 96, -126
  
  TL_Image_Checked:
  Data.b -119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31, -13, -1, 97, 0, 0, 0, 7, 116, 73, 77, 69, 7, -38, 8, 14, 16, 7, 42, 39, 2
  Data.b 85, 122, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 18, 0, 0, 11, 18, 1, -46, -35, 126, -4, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, -79, -113, 11, -4, 97, 5, 0, 0, 2, 38, 73, 68, 65, 84, 120, -38, -75
  Data.b 82, 75, 107, 19, 81, 20, -2, -18, -99, -103, 36, -45, 16, 80, 68, 83, 23, 86, 68, 91, 16, 117, 83, 16, 92, 8, 46, 68, 68, 20, -92, 96, -36, 40, 90, 40, -120, -18, 93, -71, -15, 55, 8, -30, -50, -91, -108, 116, -45, -123
  Data.b 84, 23, 22, 23, -22, -78, 32, -8, 88, 8, 85, 80, 4, -93, 77, 38, 51, 105, 102, 38, -13, -70, -41, 115, -17, -104, 73, 82, -36, -119, 7, -18, 99, -26, 126, -25, 59, -33, 121, 0, -1, 104, 76, 109, 15, 95, 124, -105, -22, 84
  Data.b 91, 16, -60, -24, -11, 99, -72, 110, 8, -57, 29, -96, -19, -8, -40, -22, -8, 104, 119, 66, -72, 94, 8, -61, -28, -123, -77, -9, -14, 38, 51, -121, 31, 75, -89, -9, 22, 15, -67, 72, 34, 78, 37, -6, 81, -122, 44, -109, 58, 76
  Data.b -85, -105, 64, -48, 53, -91, -17, -124, -42, -115, -69, 107, 26, -85, 9, -126, 48, 25, -79, -58, 12, 63, 9, 28, 39, 2, -103, -108, 90, 34, 103, 12, -75, -118, -127, 84, 16, 1, 109, 113, 38, 11, -68, -42, -77, -35, -113, -14, -56, -54
  Data.b -39, -117, 16, -60, 25, 24, -109, -88, 90, 28, 53, -101, 99, -7, -39, 39, 108, -68, -5, -127, 41, 11, -104, 42, 113, 84, -84, 81, 26, 90, 65, -41, 27, -96, 27, 10, 116, 124, 65, -14, 4, 1, 57, 108, -117, -63, -94, -43, 106, -121
  Data.b 120, -68, -6, 17, 51, -45, 53, -100, 59, 117, 64, -89, -58, -104, -104, 36, 112, -70, 33, 124, -54, 55, 78, 36, -79, 27, 68, -64, 80, 86, 4, -100, 99, 117, -3, 11, 18, 114, -70, 115, -27, 24, 42, 38, -45, 41, 9, -55, -32, 81
  Data.b -48, -126, -96, -29, 4, 80, -39, 90, -106, -52, 37, -46, 42, 25, 76, -25, -37, 92, -33, -60, -66, -35, 54, 22, -50, -52, 80, 49, -103, 46, -92, 24, 9, -56, 107, -16, -85, -19, 67, 117, -57, -91, -74, 29, 111, 52, 113, -30, -22, 10
  Data.b -74, -3, 24, 107, 111, -66, 98, -85, 27, 97, -23, -14, 28, -20, -78, 1, -45, 0, 74, 92, 98, -84, -109, -71, 2, -43, 107, 10, -120, -46, -97, -105, -112, -46, 121, -14, 124, 19, 79, 95, 127, 67, -43, 54, -79, 120, 113, 86, 59, -107
  Data.b 13, 14, 79, 73, 72, 118, 40, 80, 3, -45, 27, 100, -88, -17, -79, 113, -1, -42, -68, 126, 120, -48, -4, -128, -9, -97, 29, 92, 59, 127, 24, -11, 93, 21, 29, 64, -39, -16, -100, 80, -32, -109, 92, 85, 3, 106, 59, 22, 47, -51
  Data.b -95, 76, -31, -18, 61, -38, -128, -63, 25, 110, 47, 28, 69, 54, -106, 116, 94, -58, 29, 4, -54, 20, 40, -51, 24, 77, -98, -127, -21, 23, 102, -11, -65, 87, 111, 91, 56, -72, -65, 10, -51, 60, -60, -115, -35, 11, -126, -23, 122, -107
  Data.b -90, -116, 33, 33, -110, 40, 101, 52, 121, -100, 72, -114, -96, 113, -10, -48, -124, 51, 116, 11, -1, 66, 16, 12, 82, -100, 108, 44, -25, 18, 73, -95, 65, -3, -105, 4, -52, -60, 36, -8, -65, -40, 111, 113, 41, -10, 93, 68, 89, 56
  Data.b -43, 0, 0, 0, 0, 73, 69, 78, 68, -82, 66, 96, -126
  
  TL_Image_Unchecked:
  Data.b -119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31, -13, -1, 97, 0, 0, 0, 7, 116, 73, 77, 69, 7, -38, 8, 14, 16, 7, 48, -38, 96
  Data.b -84, 0, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 18, 0, 0, 11, 18, 1, -46, -35, 126, -4, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, -79, -113, 11, -4, 97, 5, 0, 0, 1, -104, 73, 68, 65, 84, 120, -38, -75
  Data.b 82, 73, 82, -61, 48, 16, 108, 89, 118, -100, 5, 114, -93, -32, 35, -36, -8, 6, 87, 56, -16, 5, -98, -62, 31, 120, 1, 39, -86, 120, 13, 7, 32, -79, 99, 27, -81, -78, 22, 70, 50, -15, 18, -56, -119, 98, -86, 36, 75, -42
  Data.b 76, 79, 79, -49, 0, 127, 52, 102, -73, -121, -25, 87, 99, -65, 118, 43, 75, -127, 44, 23, 72, -110, 10, 113, 82, 99, 27, 23, -40, 68, 5, -74, 81, -123, 36, -83, -64, 125, -81, 15, 78, 95, 110, -103, -65, -65, -36, 93, -99, -11
  Data.b 15, 89, 99, 32, -92, 65, -34, 40, 40, 101, 92, -102, -73, -84, -123, -90, -93, -92, 123, 75, -21, -26, -2, -55, -7, 58, -128, -78, 106, 7, 84, -63, -16, 78, -50, -94, -43, 80, -58, 56, -118, 30, 99, 56, -99, 115, 72, 77, 0, -76
  Data.b 9, 101, 122, 127, 7, -16, -103, 55, 93, 102, 27, -100, 54, 40, -123, 70, 64, 76, 87, 68, -105, -5, 67, -75, 13, -127, 74, -49, -125, 39, 15, 0, 118, 105, -115, 93, -91, 17, 21, -102, -24, 105, 44, 41, 122, 17, 48, 4, -76, 90
  Data.b 57, 8, -26, -121, -98, 43, -115, 49, 61, 5, -120, 119, 21, 10, -86, 87, -76, 6, -13, -128, 19, 0, 67, 104, 1, 40, 27, -66, 25, -44, 82, -9, -86, 107, -61, -112, 82, -46, 30, 32, -118, 75, -40, 106, -125, -64, 96, 57, -13, 48
  Data.b -89, 53, -29, 12, -21, 112, 80, 60, -54, 9, -128, -76, -80, 66, 106, -115, 41, -125, -113, 109, 1, -37, -99, -109, 25, -57, 122, -63, -35, -61, 56, -40, -38, 34, -28, -82, 60, 67, 8, 106, -12, -28, -114, -74, -41, -100, 13, 63, 15, -125
  Data.b 93, 38, -105, -128, 4, 28, 59, -18, 1, -20, -64, 100, -75, -78, 12, -113, -38, 62, -18, 32, -66, 3, 40, 10, -31, 52, -96, -74, 67, 81, -127, 89, -93, -113, 2, 49, -4, -62, -64, -102, 13, -108, 84, -93, 82, 118, -90, -51, 4, 68
  Data.b -115, 84, -77, -61, -11, 3, -32, -30, 124, 69, 83, 70, 61, 39, -57, 70, 106, 55, -82, -92, 22, 54, 89, 51, 9, -122, 107, -31, 20, -96, 27, -27, 90, -30, -14, -6, -79, -93, 72, 12, 57, -11, -33, -112, -93, -46, 83, -25, 127, -79
  Data.b 47, -55, 68, -37, -7, -29, -65, -25, 81, 0, 0, 0, 0, 73, 69, 78, 68, -82, 66, 96, -126
EndDataSection

Ein Beispiel zur Verwendung:

Code: Alles auswählen

XIncludeFile "TreeListGadget.pbi"

Enumeration
  #Gadget_TreeList
  #Gadget_InsertSubitem
  #Gadget_Delete
  #Gadget_InsertAbove
EndEnumeration

OpenWindow(0, 0, 0, 420, 354, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

TreeListGadget(#Gadget_TreeList, 10, 10, 400, 300, "Name" + #LF$ + "170" + #LF$ + "Quantity" + #LF$ + "100" + #LF$ + "Price" + #LF$ + "100", #PB_ListIcon_FullRowSelect)
ButtonGadget(#Gadget_InsertSubitem, 10, 320, 100, 24, "Insert subitem")
ButtonGadget(#Gadget_Delete, 120, 320, 100, 24, "Delete")
ButtonGadget(#Gadget_InsertAbove, 230, 320, 100, 24, "Insert above")

CatchImage(0, ?ExampleIcon)

Define Position.i

Position = AddTreeListItem(#Gadget_TreeList, -1, "Red category (disabled)", 0, #PB_Ignore, ImageID(0))
SetTreeListItemColor(#Gadget_TreeList, Position, #PB_Ignore, #PB_Gadget_BackColor, $8888FF)
DisableTreeListItem(#Gadget_TreeList, 0, #PB_Ignore, 1)

  AddTreeListItem(#Gadget_TreeList, -1, "Sub-category 1", 1, #TreeList_NodeState_Closed, ImageID(0))
  
    Position = AddTreeListItem(#Gadget_TreeList, -1, "Checkbox (disabed)", 2, #PB_Ignore, #PB_Ignore, #TreeListItem_Checkbox)
    CheckTreeListItem(#Gadget_TreeList, Position, #PB_Ignore, 1)
    DisableTreeListItem(#Gadget_TreeList, Position, #PB_Ignore, 1)
    SetTreeListItemColor(#Gadget_TreeList, Position, #PB_Ignore, #PB_Gadget_FrontColor, $AAAAAA)
    
    Position = AddTreeListItem(#Gadget_TreeList, -1, "Checkbox (disabed)", 2, #PB_Ignore, #PB_Ignore, #TreeListItem_Checkbox)
    DisableTreeListItem(#Gadget_TreeList, Position, #PB_Ignore, 1)
    SetTreeListItemColor(#Gadget_TreeList, Position, #PB_Ignore, #PB_Gadget_FrontColor, $AAAAAA)
    
  AddTreeListItem(#Gadget_TreeList, -1, "Sub-category 2", 1, #PB_Ignore, ImageID(0))
    AddTreeListItem(#Gadget_TreeList, -1, "Checkbox", 2, #PB_Ignore, #PB_Ignore, #TreeListItem_Checkbox)
    AddTreeListItem(#Gadget_TreeList, -1, "Checkbox", 2, #PB_Ignore, #PB_Ignore, #TreeListItem_Checkbox)
    
Position = AddTreeListItem(#Gadget_TreeList, -1, "Green category", 0, #TreeList_NodeState_Expanded, ImageID(0))
SetTreeListItemColor(#Gadget_TreeList, Position, #PB_Ignore, #PB_Gadget_BackColor, $88FF88)

  AddTreeListItem(#Gadget_TreeList, -1, "Image item" + #LF$ + "7" + #LF$ + "30 $", 1, #PB_Ignore, ImageID(0))
  AddTreeListItem(#Gadget_TreeList, -1, "Image item" + #LF$ + "2" + #LF$ + "10 $", 1, #PB_Ignore, ImageID(0))
  Position = AddTreeListItem(#Gadget_TreeList, -1, "Sub-category", 1, #TreeList_NodeState_Closed, #PB_Ignore)
  
    AddTreeListItem(#Gadget_TreeList, -1, "No image here" + #LF$ + "136" + #LF$ + "0.99 $", 2, #PB_Ignore, #PB_Ignore)
    AddTreeListItem(#Gadget_TreeList, -1, "No image here" + #LF$ + "35" + #LF$ + "0.99 $", 2, #PB_Ignore, #PB_Ignore)

Repeat
  Define Event.i = WaitWindowEvent()
  Define TreeListEvent.i
  
  Select Event
  Case #PB_Event_Gadget
    Select EventGadget()
    Case #Gadget_TreeList
      TreeListEvent = DispatchTreeListEvent()
      
      Select TreeListEvent
      Case #TreeListEvent_Checked
        Debug "You activated a checkbox"
        
      Case #TreeListEvent_Unchecked
        Debug "You deactivated a checkbox"
        
      Case #TreeListEvent_Closed
        Debug "You closed a category"
        
      Case #TreeListEvent_Expanded
        Debug "You expanded a category"
        
      Default
        Select EventType()
        Case #PB_EventType_Change
          Debug "You changed the selected item"
          
        EndSelect
      EndSelect
      
    Case #Gadget_InsertSubitem
      If GetGadgetState(#Gadget_TreeList) <> -1
        AddTreeListItem(#Gadget_TreeList, GetTreeListState(#Gadget_TreeList) + 1, "Sublevel " + Str(GetTreeListItemSubLevel(#Gadget_TreeList, GetTreeListState(#Gadget_TreeList), #PB_Ignore) + 1), GetTreeListItemSubLevel(#Gadget_TreeList, GetTreeListState(#Gadget_TreeList), #PB_Ignore) + 1, #PB_Ignore, ImageID(0))
      EndIf
      
    Case #Gadget_Delete
      If GetGadgetState(#Gadget_TreeList) <> -1
        RemoveTreeListItem(#Gadget_TreeList, #PB_Ignore, GetGadgetItemData(#Gadget_TreeList, GetGadgetState(#Gadget_TreeList)))
      EndIf
      
    Case #Gadget_InsertAbove
      If GetGadgetState(#Gadget_TreeList) <> -1
        AddTreeListItem(#Gadget_TreeList, GetTreeListState(#Gadget_TreeList), "Inserted item", GetTreeListItemSubLevel(#Gadget_TreeList, GetTreeListState(#Gadget_TreeList), #PB_Ignore), #TreeList_NodeState_Expanded, ImageID(0))
      EndIf
    EndSelect
    
  Case #PB_Event_CloseWindow
    End
    
  EndSelect
ForEver



DataSection
  ExampleIcon:
  Data.b -119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 16, 0, 0, 0, 16, 8, 6, 0, 0, 0, 31, -13, -1, 97, 0, 0, 0, 7, 116, 73, 77, 69, 7, -38, 8, 14, 12, 59, 41, -40, -60
  Data.b 39, 43, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 18, 0, 0, 11, 18, 1, -46, -35, 126, -4, 0, 0, 0, 4, 103, 65, 77, 65, 0, 0, -79, -113, 11, -4, 97, 5, 0, 0, 1, 92, 73, 68, 65, 84, 120, -38, 99
  Data.b 96, 24, 104, -64, -40, 63, 105, -6, 127, 74, 12, 96, 1, 17, 46, -18, -98, 4, 21, 78, -103, -65, -111, 33, 39, -47, 31, -123, -42, -112, 98, -125, -72, -64, -38, -54, -116, 44, -37, -113, 30, 59, 5, 113, -127, -87, -79, 17, 92, -16
  Data.b 63, 16, -126, -47, -1, -1, 12, -1, -2, -125, 25, 12, -1, -2, 1, 69, -1, -1, 99, -8, -1, 15, 36, -10, 15, 44, 7, -62, 32, 3, -104, 112, 26, -1, 31, 97, 16, 24, -2, -121, 26, -50, -16, 31, 14, 65, 0, -59, 0, -112
  Data.b -32, -33, 127, 127, 25, 102, 95, -99, -59, -16, -4, -37, 115, -72, 70, -96, 19, -128, 44, -88, -51, -1, 24, -64, 24, -24, 20, 76, 3, -98, 125, 123, -58, 112, -17, -37, 93, -122, 11, 127, -50, 50, 68, 94, 12, 99, 120, 5, -28, -125
  Data.b -99, -50, 0, -47, 4, 115, 13, 3, -36, 126, 104, 44, 64, 108, 103, 96, 104, 60, -34, -64, 112, -26, -13, 57, 6, 9, 126, 49, -122, -29, 127, -114, 51, -52, 56, -45, -61, 80, 99, -43, -51, -80, 100, -31, 86, 120, -40, -128, -120, -16
  Data.b 40, 15, -120, 23, -111, 13, 0, 9, 76, -76, -99, -60, -16, -5, -49, 111, -122, -123, -41, -89, 51, 124, -65, -12, -118, 33, -51, -67, 24, -24, -16, 127, 12, 81, -79, -98, -48, -128, -5, 7, 113, -7, -65, 127, 104, 46, -128, -14, -40, -104
  Data.b -39, 25, 88, -104, 88, 24, 68, 25, -91, 24, -106, 120, 110, 100, 16, 17, 16, 97, -8, -5, 31, 26, 14, 72, 52, 48, -3, -63, 53, -79, -64, 2, -17, 63, 68, -106, -127, -15, 63, 35, 67, -112, 78, 56, 60, -86, -96, -70, -64, -20
  Data.b -101, 55, -17, -62, 29, -84, -86, -86, -120, -26, 2, 88, -36, -61, 34, 9, -22, -28, -1, -16, -88, 100, 96, 80, 83, 83, -126, 90, -124, -106, -108, 39, 78, -99, 73, 86, 74, -92, 10, 0, 0, 4, 39, -28, 124, 97, 98, 106, 79, 0
  Data.b 0, 0, 0, 73, 69, 78, 68, -82, 66, 96, -126
EndDataSection
Bild
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von CNESM »

@ Jilocasin

Ok, das sieht schon ganz anders aus :-) Macht einen sehr guten Eindruck doch ein paar Dinge laufen bei mir (4.50) nicht richtig:

- "No image here" hat einen einzelnen Punkt in der rechten oberen Ecke wo normalerweise das Icon ist.
- "Sub-category" verliert sein Icon wenn man die zwei "No image here" löscht.
- "Category (disabled)","Sub-category 1", "Sub-category 2" usw. kann nicht gelöscht werden.
- Wenn man die beiden Einträge "Image item" löscht verändert sich das Icon von "Category" in das Icon von "Image item".
- "Insert subitem" funktioniert auch nicht richtig. Wenn ich z.B. den Cursor beim letzten Eintrag "No image here" setze und "Insert subitem" ausführen, verändert sich jeweils auch das markiere Icon d.h. es wird überschrieben. Vielleicht ist das auch so gewünscht.

@ STARGÅTE
Wenn ich zB einen offenen Tree oben lösche, bleiben die Namen trotzdem noch stehen.
Desweiteren wird irgenwie immer nur der 1. Eintrag gelöscht, auch wenn ich ein anderen Markiert habe.
Wenn du dir den Code anschaust siehst du das er immer den Eintrag 0 löscht, egal was man ausgewählt hat. Das kann man natürlich (und sollte man auch) noch ändern.

Das ein geöffneter Tree nicht komplett gelöscht wird, ist bei mir nicht so:

Wenn ich einen Eintrag hinzufüge, diesen Aufklappe und dann lösche, wird die gesamte Liste gelöscht. Das liegt daran, weil im Delete Befehl der Eintrag 0 angegeben ist. Somit löscht er also den ersten Eintrag und damit verbunden auch die gesamte SubItems dieses Eintrags.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von Jilocasin »

CNESM hat geschrieben:Ok, das sieht schon ganz anders aus :-) Macht einen sehr guten Eindruck doch ein paar Dinge laufen bei mir (4.50) nicht richtig:
Hehe danke, Gehn wirs mal durch... :D
CNESM hat geschrieben:"No image here" hat einen einzelnen Punkt in der rechten oberen Ecke wo normalerweise das Icon ist.
Ja das ist wahr. Ich wollte die Möglichkeit anbieten ein Item ganz ohne Icon einzufügen, wenn ich aber ein vollständig transparentes Icon nehme, kommt nur eine fette schwarze Box. Der "winzige" Pixel war ein wenig workaround-mäßig und sollte eigentlich garnicht erkennbar sein. Oder man lässt das Kein-Icon einfach weg und benutzt überall eins, denn komplett ohne (mit AddGadgetItem() ohne ImageID) funktioniert das Einrücken nichtmehr.
Bei eingeschaltetem XP-Skin sollte der Punkt nahezu vollständig transparent sein. Ich weiß, dieser workaround ist nicht schön, aber selten :P

CNESM hat geschrieben:"Sub-category" verliert sein Icon wenn man die zwei "No image here" löscht.
Da ich immer nur ein Icon pro Eintrag anzeigen kann (nicht Auf-/zuklapp-Icon plus ein eigenes), werden Kategorien eben ein wenig anders behandelt. Ein Eintrag zeigt immer nur dann ein Öffnen/Schließen-Icon an, wenn es auch SubItems hat. Sind keine vorhanden, wie nach dem löschen der beiden "No image here"s, dann wird "Sub-categorie" sozusagen automatisch zu einem Item, statt einer klappbaren Kategorie. Diesem Item hab ich kein Icon zugewiesen, also bleibt es ohne Bild.

CNESM hat geschrieben:"Category (disabled)","Sub-category 1", "Sub-category 2" usw. kann nicht gelöscht werden.
Richtig. Löschen kann man immer nur einzelne Items, aber keine Kategorien, die SubItems beinhalten.
CNESM hat geschrieben:Wenn man die beiden Einträge "Image item" löscht verändert sich das Icon von "Category" in das Icon von "Image item".
Siehe die Erklärung mit dem "Icon verlieren". Dem Eintrag "Green category" wurde beim Erstellen ein Icon zugewiesen. Das wird aber auch nur angezeigt wenn der Eintrag nicht mehr als Kategorie behandelt wird (wenn "Green category" keine SubItems mehr hat). Dann wird statt dem Auf-/zuklapp-Icon das angegebene benutzt.
CNESM hat geschrieben:"Insert subitem" funktioniert auch nicht richtig. Wenn ich z.B. den Cursor beim letzten Eintrag "No image here" setze und "Insert subitem" ausführen, verändert sich jeweils auch das markiere Icon d.h. es wird überschrieben. Vielleicht ist das auch so gewünscht.
Selber Effekt, nur umgekehrte Richtung :D

Alles in allem hört es sich vielleicht verwirrend an, aber ich war der Meinung es macht so am meisten Sinn, da man sich nicht selbst darum kümmern muss, was nun Kategorie oder Item ist. Hat ein Eintrag SubItems ist es eine Kategorie mit Klappicons, hat es keine, dann ist es ein Item mit seinem zugewiesenen Icon.
Bild
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von CNESM »

Also ich denke, das das schon mal eine sehr gute Umsetzung ist. Auch wenn sich das ganze in manchen Dingen etwas anders verhält, so muss man einfach lernen damit umzugehen. Wenn man es weiss, ist es alles halb so schlimm :mrgreen:

Ich dachte halt anfangs, das es sich dabei um Bugs handelt, aber wenn das Verhalten so gewünscht ist (weil einfacher umzusetzen) ist es auf jedenfall eine sehr gute Lösung!
Ja das ist wahr. Ich wollte die Möglichkeit anbieten ein Item ganz ohne Icon einzufügen, wenn ich aber ein vollständig transparentes Icon nehme, kommt nur eine fette schwarze Box. Der "winzige" Pixel war ein wenig workaround-mäßig und sollte eigentlich garnicht erkennbar sein. Oder man lässt das Kein-Icon einfach weg und benutzt überall eins, denn komplett ohne (mit AddGadgetItem() ohne ImageID) funktioniert das Einrücken nichtmehr.
Bei eingeschaltetem XP-Skin sollte der Punkt nahezu vollständig transparent sein. Ich weiß, dieser workaround ist nicht schön, aber selten :P
Das kann ich bestätigen. Mit aktivierten Skin verschwindet das ganze, aber warum hast du als Farbe nicht eine etwas hellere genommen like RGB(254,254,254)?

Ich hab die letzten Tage auch mal etwas an meiner Idee weitergebastelt (auch zur Ablenkung aktueller Projekte). Vielleicht möchte es jemand ja mal testen:

Code: Alles auswählen

;Only for test
Global Tmp_Container_Main.l
Global Tmp_Container_Header.l
Global Tmp_Container_Left.l
Global Tmp_Container_Right.l
Global Tmp_Gadget_Main.l
Global Tmp_Gadget_Header.l
Global Tmp_Gadget_Left.l
Global Tmp_Gadget_Right.l
Global Tmp_Gadget_Scrollbar.l
;------------------------------

Global myHSB.SCROLLINFO
Global myHSB\cbSize = SizeOf(SCROLLINFO)
Global TreeListGadgetItemExpanded
Global TreeListGadgetItem
Global Ignore.s="This cell will not be change!"
Global TreeListGadget_OldProcedure

#TreeListGadget_CheckBoxes=256
#TreeListGadget_NoLines=2
#TreeListGadget_NoButtons=1
#TreeListGadget_AlwaysShowSelection=32
#TreeListGadget_Replace=10
#TreeListGadget_Conserve=11

#TreeListGadget_Container_Main=1
#TreeListGadget_Container_Header=2
#TreeListGadget_Container_Left=3
#TreeListGadget_Container_Right=4
#TreeListGadget_Gadget_Main=5
#TreeListGadget_Gadget_Header=6
#TreeListGadget_Gadget_Left=7
#TreeListGadget_Gadget_Right=8
#TreeListGadget_Gadget_Scrollbar=9

#TreeListGadget_Select=1
#TreeListGadget_Expand=2
#TreeListGadget_Collapse=8
#TreeListGadget_Check=4
#TreeListGadget_Uncheck=5
#TreeListGadget_DisableCheckbox=1
#TreeListGadget_DisableItem=2

Structure Structure1
  Container_Main.l
  Container_Header.l
  Container_Left.l
  Container_Right.l
  Gadget_Main.l
  Gadget_Header.l
  Gadget_Left.l
  Gadget_Right.l
  Gadget_Scrollbar.l
EndStructure
Global NewList TreeListGadget_Objects.Structure1()

Structure Structure2
  ID.l
  Item.l
  Status.l
EndStructure
Global NewList TreeListGadget_ItemStatus.Structure2()

Procedure GetHeaderHeight(GadgetID.l)
  Header.RECT
  GetWindowRect_(SendMessage_(GadgetID(GadgetID.l) , #LVM_GETHEADER , 0 , 0) , Header)
  ProcedureReturn Header\bottom - Header\top
EndProcedure

Procedure TreeListGadget_NewProcedure(hwnd, uMsg, wParam, lParam)
  Protected result, HitTest.TV_HITTESTINFO, i
  If uMsg= #WM_LBUTTONDOWN Or uMsg= #WM_LBUTTONDBLCLK
    HitTest\pt\x = lParam&$FFFF
    HitTest\pt\y = (lParam>>16)&$FFFF
    SendMessage_(hwnd, #TVM_HITTEST, 0, HitTest)
    For i = 0 To CountGadgetItems(Tmp_Gadget_Left.l)-1
      If HitTest\hItem = GadgetItemID(Tmp_Gadget_Left.l,i) 
        ResetList(TreeListGadget_ItemStatus()) 
        While NextElement(TreeListGadget_ItemStatus())
          If (TreeListGadget_ItemStatus()\Item.l = i And TreeListGadget_ItemStatus()\Status.l = #TreeListGadget_DisableItem And HitTest\flags <> #TVHT_ONITEMSTATEICON) 
            Result1=1
            Break
          ElseIf (TreeListGadget_ItemStatus()\Item.l = i And TreeListGadget_ItemStatus()\Status.l = #TreeListGadget_DisableItem And HitTest\flags = #TVHT_ONITEMSTATEICON) 
            Result1=1
            Break
          ElseIf (TreeListGadget_ItemStatus()\Item.l = i And TreeListGadget_ItemStatus()\Status.l = #TreeListGadget_DisableCheckbox And HitTest\flags = #TVHT_ONITEMSTATEICON)
            Result1=1
            Break
          Else
            Result1=0
          EndIf
        Wend
      EndIf
    Next
    If Result1=0
      Result2 = CallWindowProc_(TreeListGadget_OldProcedure, hwnd, uMsg, wParam, lParam) 
    EndIf
  Else
    Result2 = CallWindowProc_(TreeListGadget_OldProcedure, hwnd, uMsg, wParam, lParam)
  EndIf
  ProcedureReturn Result2
EndProcedure

Procedure TreeListGadget_Callback(Window, Message, wParam, lParam) 
  Protected *pnmtv.NM_TREEVIEW
  Select Message   
    Case #WM_VSCROLL
      If lParam = GadgetID(Tmp_Gadget_Scrollbar.l)
        myHSB\fMask =#SIF_PAGE|#SIF_POS|#SIF_RANGE|#SIF_TRACKPOS
        GetScrollInfo_(GadgetID(Tmp_Gadget_Scrollbar.l), #SB_CTL, @myHSB)
        SetScrollPos_(GadgetID(Tmp_Gadget_Right.l),#SB_VERT,myHSB\nPos,1)
        SendMessage_(GadgetID(Tmp_Gadget_Right.l),#WM_SETREDRAW,1,0)
        SetScrollPos_(GadgetID(Tmp_Gadget_Left.l),#SB_VERT,myHSB\nPos,1)
        SendMessage_(GadgetID(Tmp_Gadget_Left.l),#WM_SETREDRAW,1,0)
      EndIf
    Case #WM_NOTIFY 
      *pnmtv = lParam
      Select *pnmtv\hdr\code
        Case #TVN_ITEMEXPANDED
          TreeListGadgetItem = *pnmtv\itemNew\lParam
          Select *pnmtv\action
            Case 1
              TreeListGadgetItemExpanded = 1
            Case 2
              TreeListGadgetItemExpanded = 2
          EndSelect
      EndSelect
  EndSelect 
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure

Procedure.l TreeListGadget_Events(Event)
  If Event = #PB_Event_Gadget
    If EventGadget() = Tmp_Gadget_Left.l
      If TreeListGadgetItemExpanded = 1
        SetGadgetItemState(Tmp_Gadget_Right.l, TreeListGadgetItem, #PB_Tree_Collapsed)
      ElseIf TreeListGadgetItemExpanded = 2
        SetGadgetItemState(Tmp_Gadget_Right.l, TreeListGadgetItem, #PB_Tree_Expanded)
      EndIf
    EndIf
  ElseIf Event = #WM_HSCROLL Or Event = #WM_VSCROLL Or Event = #WM_MOUSEWHEEL 
    If IsGadget(Tmp_Gadget_Right.l) And IsGadget(Tmp_Gadget_Scrollbar.l)
      SetScrollPos_(GadgetID(Tmp_Gadget_Right.l),#SB_HORZ,GetScrollPos_(GadgetID(Tmp_Gadget_Left.l), #SB_HORZ),1) 
      SetScrollPos_(GadgetID(Tmp_Gadget_Right.l),#SB_VERT,GetScrollPos_(GadgetID(Tmp_Gadget_Left.l), #SB_VERT),1)
      SendMessage_(GadgetID(Tmp_Gadget_Right.l),#WM_SETREDRAW,1,0)
      myHSB\fMask = #SIF_PAGE|#SIF_POS|#SIF_RANGE|#SIF_TRACKPOS
      GetScrollInfo_(GadgetID(Tmp_Gadget_Right.l), #SB_VERT, @myHSB)
      SetScrollInfo_(GadgetID(Tmp_Gadget_Scrollbar.l), #SB_CTL, myHSB, 1)
    EndIf
  EndIf
  If IsGadget(Tmp_Gadget_Right.l)
    If GetWindowLong_(GadgetID(Tmp_Gadget_Right.l), #GWL_STYLE) & #WS_VSCROLL
      ResizeGadget(Tmp_Gadget_Scrollbar.l, 300 - GetSystemMetrics_(#SM_CXVSCROLL) - GetSystemMetrics_(#SM_CYEDGE), #PB_Ignore, #PB_Ignore, #PB_Ignore)
      myHSB\fMask = #SIF_PAGE|#SIF_POS|#SIF_RANGE|#SIF_TRACKPOS
      GetScrollInfo_(GadgetID(Tmp_Gadget_Right.l), #SB_VERT, @myHSB)
      SetScrollInfo_(GadgetID(Tmp_Gadget_Scrollbar.l), #SB_CTL, myHSB, 1)
      ResizeGadget(Tmp_Container_Right.l, #PB_Ignore, #PB_Ignore, (GadgetWidth(Tmp_Container_Main.l)/2) - (GetSystemMetrics_(#SM_CYEDGE))-GetSystemMetrics_(#SM_CXVSCROLL), #PB_Ignore)
    Else
      ResizeGadget(Tmp_Gadget_Scrollbar.l, 300 - GetSystemMetrics_(#SM_CXVSCROLL) + GetSystemMetrics_(#SM_CXVSCROLL), #PB_Ignore, #PB_Ignore, #PB_Ignore)
      ResizeGadget(Tmp_Container_Right.l, #PB_Ignore, #PB_Ignore, (GadgetWidth(Tmp_Container_Main.l)/2) - (GetSystemMetrics_(#SM_CYEDGE)), #PB_Ignore)
    EndIf
  EndIf
EndProcedure

Procedure TreeListGadget_GetHwnd(ID.l,InputObject.l,OutputObject.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If InputObject.l=#TreeListGadget_Container_Main
      If TreeListGadget_Objects()\Container_Main.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Container_Header
      If TreeListGadget_Objects()\Container_Header.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Container_Left
      If TreeListGadget_Objects()\Container_Left.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Container_Right
      If TreeListGadget_Objects()\Container_Right.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Gadget_Main
      If TreeListGadget_Objects()\Gadget_Main.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Gadget_Header
      If TreeListGadget_Objects()\Gadget_Header.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Gadget_Left
      If TreeListGadget_Objects()\Gadget_Left.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Gadget_Right
      If TreeListGadget_Objects()\Gadget_Right.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    ElseIf InputObject.l=#TreeListGadget_Gadget_Scrollbar
      If TreeListGadget_Objects()\Gadget_Scrollbar.l = ID.l
        If OutputObject.l=#TreeListGadget_Container_Main
          ProcedureReturn TreeListGadget_Objects()\Container_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Header
          ProcedureReturn TreeListGadget_Objects()\Container_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Left
          ProcedureReturn TreeListGadget_Objects()\Container_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Container_Right
          ProcedureReturn TreeListGadget_Objects()\Container_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Main
          ProcedureReturn TreeListGadget_Objects()\Gadget_Main.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Header
          ProcedureReturn TreeListGadget_Objects()\Gadget_Header.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Left
          ProcedureReturn TreeListGadget_Objects()\Gadget_Left.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Right
          ProcedureReturn TreeListGadget_Objects()\Gadget_Right.l
        ElseIf OutputObject.l=#TreeListGadget_Gadget_Scrollbar
          ProcedureReturn TreeListGadget_Objects()\Gadget_Scrollbar.l
        EndIf
      EndIf
    EndIf
  Wend
EndProcedure

Procedure.l TreeListGadget_Create(ID.l,x.l,y.l,x1.l,y1.l,Flag.l)
  If ID.l=#PB_Any
    Tmp_Gadget_Main.l=ListSize(TreeListGadget_Objects())+1
  Else
    ResetList(TreeListGadget_Objects())
    While NextElement(TreeListGadget_Objects())
      If TreeListGadget_Objects()\Gadget_Main.l = ID.l
        If Flag.l & #TreeListGadget_Replace
        Else
          ProcedureReturn 0
        EndIf
      EndIf
    Wend
    Tmp_Gadget_Main.l=ID.l
  EndIf
  Tmp_Container_Main.l = ContainerGadget(#PB_Any, x.l , y.l , x1.l , y1.l , #PB_Container_Flat)
  If Tmp_Container_Main.l
    SetGadgetColor(Tmp_Container_Main.l, #PB_Gadget_BackColor , RGB(255 , 255 , 255))
    Tmp_Container_Header.l = ContainerGadget(#PB_Any, 0 , 0 , GadgetWidth(Tmp_Container_Main.l) - (GetSystemMetrics_(#SM_CYEDGE)/2) , 100 , #PB_Container_BorderLess)
    If Tmp_Container_Header.l  
      Tmp_Gadget_Header.l = ListIconGadget(#PB_Any, 0 , 0 , GadgetWidth(Tmp_Container_Main.l) + 5 , 100 , "City" , 150 , #LVS_NOSCROLL)
      If Tmp_Gadget_Header.l
        AddGadgetColumn(Tmp_Gadget_Header.l, 1 , "Name" , 300)
        AddGadgetItem(Tmp_Gadget_Header.l,  - 1 , "" + Chr(10) + "")
        SetGadgetColor(Tmp_Gadget_Header.l, #PB_Gadget_BackColor , RGB(245 , 245 , 245))
        SetGadgetItemColor(Tmp_Gadget_Header.l, 0 , #PB_Gadget_BackColor , RGB(255 , 255 , 255) , 1)
        SetWindowLong_(GadgetID(Tmp_Gadget_Header.l) , #GWL_EXSTYLE , GetWindowLong_(GadgetID(Tmp_Gadget_Header.l) , #GWL_EXSTYLE) & (~#WS_EX_CLIENTEDGE) & (~#WS_BORDER) & (~#WS_DLGFRAME) & (~#WS_VSCROLL) & (~#WS_HSCROLL) & (~#WS_THICKFRAME) & (~#WS_EX_DLGMODALFRAME) & (~#WS_EX_WINDOWEDGE) & (~#WS_EX_LEFTSCROLLBAR ) & (~#WS_EX_RIGHTSCROLLBAR) & (~#WS_EX_STATICEDGE)) 
        SetWindowPos_(GadgetID(Tmp_Gadget_Header.l) , 0 , 0 , 0 , 0 , 0 , #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
        ResizeGadget(Tmp_Gadget_Header.l , #PB_Ignore , #PB_Ignore , #PB_Ignore , GetHeaderHeight(Tmp_Gadget_Header.l))
        ResizeGadget(Tmp_Container_Header.l , #PB_Ignore , #PB_Ignore , #PB_Ignore , GetHeaderHeight(Tmp_Gadget_Header.l))
        DisableGadget(Tmp_Gadget_Header.l,1)
        CloseGadgetList()
        Tmp_Container_Left.l = ContainerGadget(#PB_Any , 0 , GetHeaderHeight(Tmp_Gadget_Header.l) , (GadgetWidth(Tmp_Container_Main.l)/2) - (GetSystemMetrics_(#SM_CYEDGE)/2) , GadgetHeight(Tmp_Container_Main.l) - GetHeaderHeight(Tmp_Gadget_Header.l) - GetSystemMetrics_(#SM_CYEDGE) , #PB_Container_BorderLess)
        If Tmp_Container_Left.l
          Tmp_Gadget_Left.l = TreeGadget(#PB_Any , 0 , 0, (GadgetWidth(Tmp_Container_Main.l)/2) - (GetSystemMetrics_(#SM_CYEDGE)/2) + GetSystemMetrics_(#SM_CXVSCROLL) , GadgetHeight(Tmp_Container_Main.l) - GetHeaderHeight(Tmp_Gadget_Header.l) - GetSystemMetrics_(#SM_CYEDGE), Flag.l)  ; TreeGadget mit Checkboxen  +  ohne Linien
          If Tmp_Gadget_Left.l 
            TreeListGadget_OldProcedure = SetWindowLong_(GadgetID(Tmp_Gadget_Left.l), #GWL_WNDPROC, @TreeListGadget_NewProcedure())
            SetWindowLong_(GadgetID(Tmp_Gadget_Left.l) , #GWL_EXSTYLE , GetWindowLong_(GadgetID(Tmp_Gadget_Left.l) , #GWL_EXSTYLE) & (~#WS_EX_CLIENTEDGE) & (~#WS_BORDER) & (~#WS_DLGFRAME) & (~#WS_VSCROLL) & (~#WS_HSCROLL) & (~#WS_THICKFRAME) & (~#WS_EX_DLGMODALFRAME) & (~#WS_EX_WINDOWEDGE) & (~#WS_EX_LEFTSCROLLBAR ) & (~#WS_EX_RIGHTSCROLLBAR) & (~#WS_EX_STATICEDGE)) 
            SetWindowPos_(GadgetID(Tmp_Gadget_Left.l) , 0 , 0 , 0 , 0 , 0 , #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
            SetWindowLong_(GadgetID(Tmp_Gadget_Left.l) ,  #GWL_STYLE ,  GetWindowLong_(GadgetID(Tmp_Gadget_Left.l) ,  #GWL_STYLE) & ~#WS_HSCROLL)
            SetWindowPos_(GadgetID(Tmp_Gadget_Left.l) , 0 , 0 , 0 , 0 , 0 , #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOZORDER | #SWP_FRAMECHANGED)
            CloseGadgetList()
            Tmp_Container_Right.l = ContainerGadget(#PB_Any ,GadgetWidth(Tmp_Container_Main.l)/2 , GetHeaderHeight(Tmp_Gadget_Header.l) , (GadgetWidth(Tmp_Container_Main.l)/2) - (GetSystemMetrics_(#SM_CYEDGE)) , GadgetHeight(Tmp_Container_Main.l) - GetHeaderHeight(Tmp_Gadget_Header.l) - GetSystemMetrics_(#SM_CYEDGE) , #PB_Container_BorderLess)
            If Tmp_Container_Right.l
              Tmp_Gadget_Right.l = TreeGadget(#PB_Any ,0 , 0 , (GadgetWidth(Tmp_Container_Main.l)/2) - (GetSystemMetrics_(#SM_CYEDGE)), GadgetHeight(Tmp_Container_Main.l) - GetHeaderHeight(Tmp_Gadget_Header.l) - GetSystemMetrics_(#SM_CYEDGE) , #PB_Tree_NoLines | #PB_Tree_NoButtons)
              If  Tmp_Gadget_Right.l
                SetWindowLong_(GadgetID(Tmp_Gadget_Right.l) , #GWL_EXSTYLE , GetWindowLong_(GadgetID(Tmp_Gadget_Right.l) , #GWL_EXSTYLE)  & (~#WS_EX_CLIENTEDGE) & (~#WS_BORDER) & (~#WS_DLGFRAME) & (~#WS_VSCROLL) & (~#WS_HSCROLL) & (~#WS_THICKFRAME) & (~#WS_EX_DLGMODALFRAME) & (~#WS_EX_WINDOWEDGE) & (~#WS_EX_LEFTSCROLLBAR ) & (~#WS_EX_RIGHTSCROLLBAR) & (~#WS_EX_STATICEDGE) ) 
                SetWindowPos_(GadgetID(Tmp_Gadget_Right.l) , 0 , 0 , 0 , 0 , 0 , #SWP_SHOWWINDOW | #SWP_NOZORDER | #SWP_NOSIZE | #SWP_NOMOVE | #SWP_FRAMECHANGED)
                SendMessage_(GadgetID(Tmp_Gadget_Right.l) , #TVM_SETINDENT ,  - 1 , 0)
                SetGadgetColor(Tmp_Gadget_Right.l , #PB_Gadget_BackColor ,GetSysColor_(#COLOR_BTNFACE) )
                EnableWindow_(GadgetID(Tmp_Gadget_Right.l),#False)
                CloseGadgetList()
                Tmp_Gadget_Scrollbar.l = ScrollBarGadget(#PB_Any, 300 - GetSystemMetrics_(#SM_CYEDGE), GetHeaderHeight(Tmp_Gadget_Header.l) , GetSystemMetrics_(#SM_CXVSCROLL) , GadgetHeight(Tmp_Container_Main.l) - GetHeaderHeight(Tmp_Gadget_Header.l) - GetSystemMetrics_(#SM_CYEDGE) , 0 ,  100 ,  50 ,  #PB_ScrollBar_Vertical)
                If Tmp_Gadget_Scrollbar.l
                  CloseGadgetList()
                  AddElement(TreeListGadget_Objects())
                  TreeListGadget_Objects()\Container_Main.l = Tmp_Container_Main.l
                  TreeListGadget_Objects()\Container_Header.l = Tmp_Container_Header.l
                  TreeListGadget_Objects()\Container_Left.l = Tmp_Container_Left.l
                  TreeListGadget_Objects()\Container_Right.l = Tmp_Container_Right.l
                  TreeListGadget_Objects()\Gadget_Main.l = Tmp_Gadget_Main.l
                  TreeListGadget_Objects()\Gadget_Header.l = Tmp_Gadget_Header.l
                  TreeListGadget_Objects()\Gadget_Left.l = Tmp_Gadget_Left.l
                  TreeListGadget_Objects()\Gadget_Right.l = Tmp_Gadget_Right.l
                  TreeListGadget_Objects()\Gadget_Scrollbar.l = Tmp_Gadget_Scrollbar.l
                  ProcedureReturn Tmp_Gadget_Main.l
                EndIf
                ProcedureReturn 0  
              EndIf
              ProcedureReturn 0  
            EndIf
            ProcedureReturn 0  
          EndIf
          ProcedureReturn 0  
        EndIf
        ProcedureReturn 0  
      EndIf
      ProcedureReturn 0  
    EndIf
    ProcedureReturn 0  
  EndIf
EndProcedure

Procedure.l TreeListGadget_Free(ID.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      If IsGadget(TreeListGadget_Objects()\Container_Main.l)
        FreeGadget(TreeListGadget_Objects()\Container_Main.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Container_Header.l)
        FreeGadget(TreeListGadget_Objects()\Container_Header.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Container_Left.l)
        FreeGadget(TreeListGadget_Objects()\Container_Left.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Container_Right.l)
        FreeGadget(TreeListGadget_Objects()\Container_Right.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Gadget_Main.l)
        FreeGadget(TreeListGadget_Objects()\Gadget_Main.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Gadget_Header.l)
        FreeGadget(TreeListGadget_Objects()\Gadget_Header.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Gadget_Left.l)
        FreeGadget(TreeListGadget_Objects()\Gadget_Left.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Gadget_Right.l)
        FreeGadget(TreeListGadget_Objects()\Gadget_Right.l)
      EndIf
      If IsGadget(TreeListGadget_Objects()\Gadget_Scrollbar.l)
        FreeGadget(TreeListGadget_Objects()\Gadget_Scrollbar.l)
      EndIf
      ResetList(TreeListGadget_Objects())
      While NextElement(TreeListGadget_Objects())
        If TreeListGadget_Objects()\Gadget_Main.l = ID.l
          DeleteElement(TreeListGadget_Objects())
        EndIf
      Wend
    EndIf
  Wend
EndProcedure

Procedure.l TreeListGadget_AddItem(ID.l, Position.l, Text.s, ImageID.l, SubLevel.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l) And IsGadget(Tmp_Gadget_Right.l)
    AddGadgetItem(Tmp_Gadget_Left.l, Position.l, StringField(Text.s, 1, Chr(9)), ImageID1.l, SubLevel.l)
    AddGadgetItem(Tmp_Gadget_Right.l, Position.l, StringField(Text.s, 2, Chr(9)), 0, SubLevel.l)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure.l TreeListGadget_DeleteItem(ID.l , Position.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l) And IsGadget(Tmp_Gadget_Right.l)
    RemoveGadgetItem(Tmp_Gadget_Left.l , Position.l)
    RemoveGadgetItem(Tmp_Gadget_Right.l , Position.l)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure.l TreeListGadget_ChangeItemText(ID.l, Position.l, Text.s)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l) And IsGadget(Tmp_Gadget_Right.l)
    If StringField(Text.s, 1, Chr(9))<>Ignore.s
      SetGadgetItemText(Tmp_Gadget_Left.l, Position.l, StringField(Text.s, 1, Chr(9)))
    EndIf
    If StringField(Text.s, 2, Chr(9))<>Ignore.s
      SetGadgetItemText(Tmp_Gadget_Right.l, Position.l, StringField(Text.s, 2, Chr(9)))
    EndIf
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure.s TreeListGadget_GetItemText(ID.l, Position.l, Column.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l) And IsGadget(Tmp_Gadget_Right.l)
    If Column.l=1
      ProcedureReturn GetGadgetItemText(Tmp_Gadget_Left.l, Position.l)
    ElseIf Column.l=2
      ProcedureReturn GetGadgetItemText(Tmp_Gadget_Right.l, Position.l)
    EndIf
  Else
    ProcedureReturn ""
  EndIf
EndProcedure

Procedure.l TreeListGadget_ClearItems(ID.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l) And IsGadget(Tmp_Gadget_Right.l)
    ClearGadgetItems(Tmp_Gadget_Left.l)
    ClearGadgetItems(Tmp_Gadget_Right.l)
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure.l TreeListGadget_CountItems(ID.l,Sublevel.l=-1)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l)
    If Sublevel.l=-1
      ProcedureReturn CountGadgetItems(Tmp_Gadget_Left.l)
    Else
      Count.l=0
      For a=1 To CountGadgetItems(Tmp_Gadget_Left.l)
        If GetGadgetItemAttribute(Tmp_Gadget_Left.l,a,#PB_Tree_SubLevel)=Sublevel.l
          Count.l=Count.l+1  
        EndIf
      Next
      ProcedureReturn Count.l
    EndIf
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure.l TreeListGadget_SetItemState(ID.l, Item.l, Flag.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l)
    If Flag.l=#TreeListGadget_Select
      SetGadgetItemState(Tmp_Gadget_Left.l, Item.l, GetGadgetItemState(Tmp_Gadget_Left.l, Item.l)|#PB_Tree_Selected)
      SetActiveGadget(Tmp_Gadget_Left.l)  
    ElseIf Flag.l=#TreeListGadget_Expand
      SetGadgetItemState(Tmp_Gadget_Left.l, Item.l, GetGadgetItemState(Tmp_Gadget_Left.l, Item.l)|#PB_Tree_Expanded&~#PB_Tree_Collapsed)
      SetGadgetItemState(Tmp_Gadget_Right.l, Item.l, GetGadgetItemState(Tmp_Gadget_Right.l, Item.l)|#PB_Tree_Expanded&~#PB_Tree_Collapsed) 
    ElseIf Flag.l=#TreeListGadget_Collapse 
      SetGadgetItemState(Tmp_Gadget_Left.l, Item.l, GetGadgetItemState(Tmp_Gadget_Left.l, Item.l)|#PB_Tree_Collapsed&~#PB_Tree_Expanded)
      SetGadgetItemState(Tmp_Gadget_Right.l, Item.l, GetGadgetItemState(Tmp_Gadget_Right.l, Item.l)|#PB_Tree_Collapsed&~#PB_Tree_Expanded)
    ElseIf Flag.l=#TreeListGadget_Check
      SetGadgetItemState(Tmp_Gadget_Left.l, Item.l, GetGadgetItemState(Tmp_Gadget_Left.l, Item.l)|#PB_Tree_Checked)
    ElseIf Flag.l=#TreeListGadget_Uncheck
      SetGadgetItemState(Tmp_Gadget_Left.l, Item.l, GetGadgetItemState(Tmp_Gadget_Left.l, Item.l)&~#PB_Tree_Checked)
    EndIf
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure.l TreeListGadget_GetItemState(ID.l, Item.l)
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
  If IsGadget(Tmp_Gadget_Left.l)
    ProcedureReturn GetGadgetItemState(Tmp_Gadget_Left.l, Item.l)
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

Procedure TreeListGadget_HideCheckbox(ID.l, ItemID, State.l)
  Protected TVItem.TV_ITEM
  ResetList(TreeListGadget_Objects())
  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
    EndIf
  Wend
  TVItem\Mask = #TVIF_STATE
  TVItem\hItem = GadgetItemID(Tmp_Gadget_Left.l, ItemID)
  TVItem\StateMask = #TVIS_STATEIMAGEMASK
  SendMessage_(GadgetID(Tmp_Gadget_Left.l), #TVM_GETITEM, 0, @TVItem)
  If State.l = #True
    TVItem\State = 0
  ElseIf State.l = #False
    TVItem\State = $1000
  EndIf
  SendMessage_(GadgetID(Tmp_Gadget_Left.l), #TVM_SETITEM, 0, @TVItem)
EndProcedure

Procedure TreeListGadget_DisableCheckbox(ID.l, Item.l, State.l)
  ResetList(TreeListGadget_ItemStatus())
  While NextElement(TreeListGadget_ItemStatus())
    If TreeListGadget_ItemStatus()\ID.l = ID.l And TreeListGadget_ItemStatus()\Item.l = Item.l
      DeleteElement(TreeListGadget_ItemStatus())
    EndIf
  Wend
  If State.l=#True
    AddElement(TreeListGadget_ItemStatus())
    TreeListGadget_ItemStatus()\ID.l = ID.l
    TreeListGadget_ItemStatus()\Item.l = Item.l
    TreeListGadget_ItemStatus()\Status.l = #TreeListGadget_DisableCheckbox
  ElseIf State.l=#False
    ;Do nothing
  EndIf
EndProcedure

Procedure TreeListGadget_DisableItem(ID.l, Item.l, State.l)
  ResetList(TreeListGadget_ItemStatus())
  While NextElement(TreeListGadget_ItemStatus())
    If TreeListGadget_ItemStatus()\ID.l = ID.l And TreeListGadget_ItemStatus()\Item.l = Item.l
      DeleteElement(TreeListGadget_ItemStatus())
    EndIf
  Wend
  If State.l=#True
    AddElement(TreeListGadget_ItemStatus())
    TreeListGadget_ItemStatus()\ID.l = ID.l
    TreeListGadget_ItemStatus()\Item.l = Item.l
    TreeListGadget_ItemStatus()\Status.l = #TreeListGadget_DisableItem
  ElseIf State.l=#False
    ;Do nothing
  EndIf
EndProcedure

If OpenWindow(0 , 100 , 100 , 640 , 645 , "TreeListGadget" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ;Add some buttons
  ButtonGadget(99 , 10 , 10 , 300 , 25 , "TreeListGadget_Create", #PB_Button_Left)
  ButtonGadget(103 , 10 , 40 , 300 , 25 , "TreeListGadget_Free", #PB_Button_Left)
  ButtonGadget(100 , 10 , 70 , 300 , 25 , "TreeListGadget_AddItem", #PB_Button_Left)
  ButtonGadget(101 , 10 , 100 , 300 , 25 , "TreeListGadget_DeleteItem", #PB_Button_Left)
  ButtonGadget(104 , 10 , 130 , 300 , 25 , "TreeListGadget_ChangeItemText", #PB_Button_Left)
  ButtonGadget(106 , 10 , 160 , 300 , 25 , "TreeListGadget_GetItemText", #PB_Button_Left)
  ButtonGadget(102 , 10 , 190 , 300 , 25 , "TreeListGadget_ClearItems", #PB_Button_Left)
  ButtonGadget(105 , 10 , 220 , 300 , 25 , "TreeListGadget_CountItems (count all)", #PB_Button_Left)
  ButtonGadget(107 , 10 , 250 , 300 , 25 , "TreeListGadget_CountItems (count only items of sublevel 0)", #PB_Button_Left)
  ButtonGadget(108 , 10 , 280 , 300 , 25 , "TreeListGadget_SetItemState (#TreeListGadget_Select)", #PB_Button_Left)
  ButtonGadget(109 , 10 , 310 , 300 , 25 , "TreeListGadget_SetItemState (#TreeListGadget_Expand)", #PB_Button_Left)
  ButtonGadget(110 , 10 , 340 , 300 , 25 , "TreeListGadget_SetItemState (#TreeListGadget_Collapse)", #PB_Button_Left)
  ButtonGadget(111 , 10 , 370 , 300 , 25 , "TreeListGadget_SetItemState (#TreeListGadget_Check)", #PB_Button_Left)
  ButtonGadget(112 , 10 , 400 , 300 , 25 , "TreeListGadget_SetItemState (#TreeListGadget_Uncheck)", #PB_Button_Left)
  ButtonGadget(113 , 10 , 430 , 300 , 25 , "TreeListGadget_GetItemState", #PB_Button_Left)
  ButtonGadget(114 , 10 , 460 , 300 , 25 , "TreeListGadget_HideCheckbox (Yes)", #PB_Button_Left)
  ButtonGadget(115 , 10 , 490 , 300 , 25 , "TreeListGadget_HideCheckbox (No)", #PB_Button_Left)
  ButtonGadget(116 , 10 , 520 , 300 , 25 , "TreeListGadget_DisableCheckbox (Yes)", #PB_Button_Left)
  ButtonGadget(117 , 10 , 550 , 300 , 25 , "TreeListGadget_DisableCheckbox (No)", #PB_Button_Left)
  ButtonGadget(118 , 10 , 580 , 300 , 25 , "TreeListGadget_DisableItem (Yes)", #PB_Button_Left)
  ButtonGadget(119 , 10 , 610 , 300 , 25 , "TreeListGadget_DisableItem (No)", #PB_Button_Left)
    
  SetWindowCallback(@TreeListGadget_Callback()) 

  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      If EventGadget() = 99
        TreeListGadget_Create(1, 320, 10, 300, 150, #TreeListGadget_CheckBoxes | #TreeListGadget_NoLines | #TreeListGadget_AlwaysShowSelection | #TreeListGadget_Replace)
      ElseIf EventGadget() = 100
        TreeListGadget_AddItem(1, -1, "Berlin", 0, 0)
        TreeListGadget_AddItem(1, -1, "Charlottenburg"+Chr(9)+"Peter", 0, 1)
        TreeListGadget_AddItem(1, -1, "Kreuzberg"+Chr(9)+"Levent", 0, 1)
        TreeListGadget_AddItem(1, -1, "Neukölln"+Chr(9)+"Tobias", 0, 1)
        TreeListGadget_AddItem(1, -1, "Tiergarten"+Chr(9)+"Erkan", 0, 1)
      ElseIf EventGadget() = 101
        TreeListGadget_DeleteItem(1, GetGadgetState(Tmp_Gadget_Left.l))
      ElseIf EventGadget() = 102
        TreeListGadget_ClearItems(1)
      ElseIf EventGadget() = 103
        TreeListGadget_Free(1)
      ElseIf EventGadget() = 104
        TreeListGadget_ChangeItemText(1, GetGadgetState(Tmp_Gadget_Left.l), Ignore.s+Chr(9)+"Olga")
      ElseIf EventGadget() = 106  
        Debug TreeListGadget_GetItemText(1, GetGadgetState(Tmp_Gadget_Left.l), 1)+" | "+TreeListGadget_GetItemText(1, GetGadgetState(Tmp_Gadget_Left.l), 2)
      ElseIf EventGadget() = 105  
        Debug TreeListGadget_CountItems(1)
      ElseIf EventGadget() = 107
        Debug TreeListGadget_CountItems(1,0)
      ElseIf EventGadget() = 108  
        TreeListGadget_SetItemState(1, GetGadgetState(Tmp_Gadget_Left.l), #TreeListGadget_Select)
      ElseIf EventGadget() = 109 
        TreeListGadget_SetItemState(1, GetGadgetState(Tmp_Gadget_Left.l), #TreeListGadget_Expand)
      ElseIf EventGadget() = 110
        TreeListGadget_SetItemState(1, GetGadgetState(Tmp_Gadget_Left.l), #TreeListGadget_Collapse)
      ElseIf EventGadget() = 111
        TreeListGadget_SetItemState(1, GetGadgetState(Tmp_Gadget_Left.l), #TreeListGadget_Check)
      ElseIf EventGadget() = 112
        TreeListGadget_SetItemState(1, GetGadgetState(Tmp_Gadget_Left.l), #TreeListGadget_Uncheck)
      ElseIf EventGadget() = 113
        If TreeListGadget_GetItemState(1, GetGadgetState(Tmp_Gadget_Left.l))&#TreeListGadget_Select
          Debug "#TreeListGadget_Select"
        EndIf
        If TreeListGadget_GetItemState(1, GetGadgetState(Tmp_Gadget_Left.l))&#TreeListGadget_Expand
          Debug "#TreeListGadget_Expand"
        EndIf 
        If TreeListGadget_GetItemState(1, GetGadgetState(Tmp_Gadget_Left.l))&#TreeListGadget_Collapse
          Debug "#TreeListGadget_Collapse"
        EndIf 
        If TreeListGadget_GetItemState(1, GetGadgetState(Tmp_Gadget_Left.l))&#TreeListGadget_Check
          Debug "#TreeListGadget_Check"
        Else
          Debug "#TreeListGadget_Uncheck"
        EndIf
      ElseIf EventGadget() = 114  
        TreeListGadget_HideCheckbox(1, 0, #True)
      ElseIf EventGadget() = 115
        TreeListGadget_HideCheckbox(1, 0, #False)
      ElseIf EventGadget() = 116
        TreeListGadget_DisableCheckbox(1, GetGadgetState(Tmp_Gadget_Left.l), #True)
      ElseIf EventGadget() = 117
        TreeListGadget_DisableCheckbox(1, GetGadgetState(Tmp_Gadget_Left.l), #False)
      ElseIf EventGadget() = 118
        TreeListGadget_DisableItem(1, GetGadgetState(Tmp_Gadget_Left.l), #True)
      ElseIf EventGadget() = 119
        Input.s = InputRequester("TreeListGadget", "TreeListGadget_DisableItem (No)", "")
        If Input.s<>""
          TreeListGadget_DisableItem(1,Val(Input.s), #False)
        EndIf
      EndIf
    EndIf
    TreeListGadget_Events(Event)
  Until Event = #PB_Event_CloseWindow
EndIf
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von Jilocasin »

Sehr nett gemacht, finde ich. :D Das Scrollen scheint synchron zu sein und du hast alles in Procedures verpackt ^^
Hast ja auch eine Art "globale Liste", seh ich gerade >:)

Was mir noch auffiel, waren Dinge, wie:

Code: Alles auswählen

  While NextElement(TreeListGadget_Objects())
    If TreeListGadget_Objects()\Gadget_Main.l = ID.l
      Tmp_Gadget_Left.l = TreeListGadget_Objects()\Gadget_Left.l
      Tmp_Gadget_Right.l = TreeListGadget_Objects()\Gadget_Right.l
    EndIf
  Wend
Bei solchen "einmaligen Suchvorgängen" kannst du doch noch innerhalb des If-Blockes ein Break einbauen, du hast ja dein Ziel schon gefunden.
Bild
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von CNESM »

Bei solchen "einmaligen Suchvorgängen" kannst du doch noch innerhalb des If-Blockes ein Break einbauen, du hast ja dein Ziel schon gefunden.
Da hast du natürlich völlig recht! Das kann ich noch ändern! Vielen Dank für den Hinweis!

Der Code ist aber immer noch in der Entwicklungsphase. Dinge wie "HideCheckbox" und "DisableCheckbox" sollen noch in "SetItemState" integriert werden. Auch sollen alle Variablen mit "Tmp_*" durch einen globalen Object Manager ersetzt werden. Da bin ich aber noch am Tüfteln.

Ich werde mir in einer ruhigen Minute deinen Code aber nochmal richtig anschauen. Sind viel Dinge dabei, die mich interessieren. Zudem finde ich deine Lösung auch etwas schicker. Meine Variante ist eher mal wieder really dirty :-D
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget

Beitrag von Jilocasin »

CNESM hat geschrieben:Meine Variante ist eher mal wieder really dirty :-D
Eigentlich finde ich meine Version mit dem eigenständigen Einfügen und Entfernen von Einträgen, dem "Missbrauchen" des Images und der immer nebenher existierenden Liste viel dirty-er :wink:
Bild
Antworten