Seite 1 von 1

Treegadget Multiselect ... gibbed datt?

Verfasst: 30.07.2007 10:02
von Xaby
Hi Fans,

ich wollte heute einfach mal ein paar Einträge in einem Baum markieren und sie alle zusammen umbenennen. Aber nur halt die ausgewählten.

wie kann ich ein #PB_Tree_Multiselect Flagg setzen?

Gibt es sowas überhaupt? Hab mich wieder mal im Forum durch viele Treegadget-Probleme gequält, die meisten behandeln aber das Exploreraussehen und Icons, oder Drag'n'Drop ...

Und nein, ich will keine Häkchen, das sieht bescheiden mit Häkchen aus.

:roll:

Verfasst: 30.07.2007 14:17
von edel
Gibt es so nicht, entweder selber zeichnen, oder, ebenfalls per Api, den
Status aendern.

Verfasst: 31.07.2007 09:07
von Xaby
Wie mache ich das?

Selbst zeichnen kommt nicht in Frage.

Kann man die Häkchen nicht unsichtbar machen und Haken wie Markierungen darstellen?

Irgendwie so ... :roll:

Verfasst: 07.08.2007 16:31
von Shardik
Ich habe die Auswahl mehrerer Einträge (= MultiSelect) schon einmal für ein ExplorerTreeGadget benötigt, bei der ein Anwender mehrere Einträge anklicken (und auch wieder durch einen zweiten Klick abwählen kann), ohne dabei wie sonst in Windows üblich die Strg-Taste gedrückt halten zu müssen. Im Windows-API ist so etwas für TreeView-Gadgets eigentlich nicht vorgesehen. Man muß daher etwas tricksen. Die markierten Einträge werden dazu in einer LinkedList festgehalten. Ich habe den Code einmal für das TreeGadget umgeschrieben. Der Code zum Auslesen eines übergeordneten Node-Namens ist übrigens einem Beispiel von edel entnommen (http://www.purebasic.fr/german/viewtopi ... 51&start=2). Danke dafür :allright:

Code: Alles auswählen

EnableExplicit

#Button = 0
#Tree = 1
#Window = 0

Procedure.L HighlightItem(HighlightFlag.B)
  Protected ItemHandle.L
  Protected TVHitTest.TV_HITTESTINFO
  Protected TVItem.TV_ITEM

  TVHitTest\Pt\x = WindowMouseX(#Window) - GadgetX(#Tree)
  TVHitTest\Pt\y = WindowMouseY(#Window) - GadgetY(#Tree)

  ItemHandle = SendMessage_(GadgetID(#Tree), #TVM_HITTEST, 0, @TVHitTest)

  If ItemHandle <> 0
    If TVHitTest\Flags <> #TVHT_ONITEMBUTTON
      TVItem\Mask = #TVIF_STATE
      TVItem\hItem = ItemHandle

      If HighlightFlag = #True
        TVItem\StateMask = #TVIS_DROPHILITED
        TVItem\State = #TVIS_DROPHILITED
      Else
        TVItem\StateMask = #TVIS_DROPHILITED | #TVIS_SELECTED
        TVItem\State = 0
      EndIf

      SendMessage_(GadgetID(#Tree), #TVM_SETITEM, 0, @TVItem)

      RedrawWindow_(GadgetID(#Tree), 0, 0, #RDW_UPDATENOW)

      ProcedureReturn #True
    EndIf
  EndIf

  ProcedureReturn #False
EndProcedure


Procedure.S GetMajorNodeName()
  Protected CurrentItem.L
  Protected ItemHandle.L
  Protected NodeName.S
  Protected SubLevel.L
  Protected TreeHandle.L
  Protected TreeViewStructure.TV_ITEM

  CurrentItem = GetGadgetState(#Tree)
  SubLevel = GetGadgetItemAttribute(#Tree, CurrentItem, #PB_Tree_SubLevel)
  TreeHandle = GadgetID(#Tree)

  If SubLevel > 0
    ItemHandle = SendMessage_(TreeHandle, #TVM_GETNEXTITEM, #TVGN_PARENT, GadgetItemID(#Tree, CurrentItem))

    NodeName.S = Space(20) 
    TreeViewStructure\pszText = @NodeName
    TreeViewStructure\Mask = #TVIF_TEXT | #TVIF_HANDLE 
    TreeViewStructure\hItem = ItemHandle
    TreeViewStructure\cchTextMax = Len(NodeName)

    SendMessage_(TreeHandle, #TVM_GETITEM, 0, @TreeViewStructure)

    NodeName + " / "
  EndIf

  ProcedureReturn NodeName
EndProcedure


Define EntryFound.L
Define i.L
Define Msg.S
Define WindowEvent.L

NewList MarkedItem.S()

If OpenWindow(#Window, 0, 0, 170, 265, "MultiSelect-Demo", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(#Window))
    TreeGadget(#Tree, 9, 12, 150, 210)
    ButtonGadget(#Button, 10, 235, 150, 20, "Markierte Einträge anzeigen")

    For i = 1 To 3
      AddGadgetItem(#Tree, -1, "Node " + Str(i))
      AddGadgetItem(#Tree, -1, "Subnode 1", 0, 1)
      AddGadgetItem(#Tree, -1, "Subnode 2", 0, 1)
      AddGadgetItem(#Tree, -1, "Subnode 3", 0, 1)
      SetGadgetItemState(#Tree, (i - 1) * 4, #PB_Tree_Expanded)
    Next i

    Repeat
      WindowEvent = WaitWindowEvent()

      If EventType() = #PB_EventType_LeftClick
        If EventGadget() = #Button
          Break
        EndIf

        If GetGadgetState(#Tree) <> -1
          EntryFound = #False

          If CountList(MarkedItem()) = 0
            If HighlightItem(#True) = #True
              AddElement(MarkedItem())
              MarkedItem() = GetMajorNodeName() + GetGadgetText(#Tree)
            EndIf
          Else              
            ForEach MarkedItem()
              If MarkedItem() = GetMajorNodeName() + GetGadgetText(#Tree)
                If HighlightItem(#False) = #True
                  DeleteElement(MarkedItem())
                  EntryFound = #True
                EndIf

                Break
              EndIf
            Next

            If EntryFound = #False
              If HighlightItem(#True) = #True
                AddElement(MarkedItem())
                MarkedItem() = GetMajorNodeName() + GetGadgetText(#Tree)
              EndIf
            EndIf
          EndIf
        EndIf
      EndIf  
    Until WindowEvent = #PB_Event_CloseWindow
    
    If CountList(MarkedItem()) > 0
      Msg = "Anzahl ausgewählter Einträge: " + Str(CountList(MarkedItem())) + #CR$ + #CR$
      
      ForEach MarkedItem()
        Msg = Msg + MarkedItem() + #CR$
      Next
      
      MessageRequester("Info", Msg)
    Else
      MessageRequester("Info", "Es wurden keine Einträge markiert!")
    EndIf
  EndIf
EndIf