(Versuch) TreeGadget + ListIconGadget = TreeListGadget
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
Ihr müsst XP Skin aktivieren, nur so als Hinweis!
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
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
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
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
(Sorry für den langen Beitrag).
Kann gern ergänzt/gebugfixt werden.. wie ihr wollt.

Ein Beispiel zur Verwendung:
Weil mich das Thema irgendwie gereizt hat, hab ich mich gestern mal hingesetzt.. und das hier ist dabei herausgekommen

Kann gern ergänzt/gebugfixt werden.. wie ihr wollt.

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
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
@ 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
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.
Ok, das sieht schon ganz anders aus

- "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 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.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.
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.
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
Hehe danke, Gehn wirs mal durch...CNESM hat geschrieben:Ok, das sieht schon ganz anders ausMacht einen sehr guten Eindruck doch ein paar Dinge laufen bei mir (4.50) nicht richtig:

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.CNESM hat geschrieben:"No image here" hat einen einzelnen Punkt in der rechten oberen Ecke wo normalerweise das Icon ist.
Bei eingeschaltetem XP-Skin sollte der Punkt nahezu vollständig transparent sein. Ich weiß, dieser workaround ist nicht schön, aber selten :P
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:"Sub-category" verliert sein Icon wenn man die zwei "No image here" löscht.
Richtig. Löschen kann man immer nur einzelne Items, aber keine Kategorien, die SubItems beinhalten.CNESM hat geschrieben:"Category (disabled)","Sub-category 1", "Sub-category 2" usw. kann nicht gelöscht werden.
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:Wenn man die beiden Einträge "Image item" löscht verändert sich das Icon von "Category" in das Icon von "Image item".
Selber Effekt, nur umgekehrte RichtungCNESM 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.

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.
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
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
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!
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:

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!
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)?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
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
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
Sehr nett gemacht, finde ich.
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:
Bei solchen "einmaligen Suchvorgängen" kannst du doch noch innerhalb des If-Blockes ein Break einbauen, du hast ja dein Ziel schon gefunden.

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
Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
Da hast du natürlich völlig recht! Das kann ich noch ändern! Vielen Dank für den Hinweis!Bei solchen "einmaligen Suchvorgängen" kannst du doch noch innerhalb des If-Blockes ein Break einbauen, du hast ja dein Ziel schon gefunden.
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

Re: (Versuch) TreeGadget + ListIconGadget = TreeListGadget
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-erCNESM hat geschrieben:Meine Variante ist eher mal wieder really dirty
