Page 1 of 1

Just Another ListIcon Question...

Posted: Tue Oct 25, 2005 2:36 am
by kenmo
New question - if I have a listicon with draggable headers, how would I rearrange them from the program? The reason is I want the user to be able to rearrange them, but I need to save and restore the custom positions...

Posted: Wed Oct 26, 2005 5:02 am
by Sparkie
For Windows OS, you can save the column order in an Array() and then send the #LVM_SETCOLUMNORDERARRAY message.

Code: Select all

#LVM_SETCOLUMNORDERARRAY = #LVM_FIRST + 58
SendMessage_(GadgetID(#YourListIcon), #LVM_SETCOLUMNORDERARRAY, numberOfArrayItems, columnOrderArray())

Posted: Wed Oct 26, 2005 9:53 am
by Chris
My method
I don't know if it's the best, but... :roll:

Code: Select all

#MyWindow = 0

#LVM_SETCOLUMNORDERARRAY = #LVM_FIRST + 58
#LVM_GETHEADER = #LVM_FIRST + 31
#HDM_ORDERTOINDEX = #HDM_FIRST + 15

Enumeration
  #MyGadget
  #MyButton1
  #MyButton2
  #MyButton3
  #MyButton4
  #MyButton5
EndEnumeration

Structure MyList
  Column.l
  Text.s
EndStructure
NewList List.MyList()

Procedure SaveContent()
  Handle        = SendMessage_(GadgetID(#MyGadget), #LVM_GETHEADER, 0, 0)
  CountColumns  = SendMessage_(Handle, #HDM_GETITEMCOUNT, 0, 0)
  
  ClearList(List())
  For col = 0 To CountColumns -1
    For Line = 0 To CountGadgetItems(#MyGadget) -1
      AddElement(List())
      List()\Column = col
      List()\Text = GetGadgetItemText(#MyGadget, Line, col)
    Next
  Next
  ProcedureReturn
EndProcedure

Procedure ReloadContent()
  Handle        = SendMessage_(GadgetID(#MyGadget), #LVM_GETHEADER, 0, 0)
  CountColumns  = SendMessage_(Handle, #HDM_GETITEMCOUNT, 0, 0)
  
  For i = 0 To CountColumns -1
    col = SendMessage_(Handle, #HDM_ORDERTOINDEX, i, 0)
    
    ForEach List()
      If List()\Column = col
        SetGadgetItemText(#MyGadget, Line, List()\Text, col) : Line +1
      EndIf
    Next
    Line = 0
  Next
  ProcedureReturn
EndProcedure

If OpenWindow(#MyWindow,100,100,400,330,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ListIcon")
  If CreateGadgetList(WindowID())
    ButtonGadget(#MyButton1, 10, 300, 60, 20, "0-1-2-3")
    ButtonGadget(#MyButton2, 80, 300, 60, 20, "1-3-2-0")
    ButtonGadget(#MyButton3, 150, 300, 60, 20, "3-0-2-1")
    ButtonGadget(#MyButton4, 220, 300, 60, 20, "1-3-0-2")
    ButtonGadget(#MyButton5, 290, 300, 60, 20, "2-0-1-3")
    
    ListIconGadget(#MyGadget,5,5,390,290,"Colonne 0",100,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_HeaderDragDrop)
    For i = 1 To 3
      AddGadgetColumn(#MyGadget, i, "Colonne "+Str(i), 100)
    Next
    
    For i = 0 To 10
      AddGadgetItem(#MyGadget, -1, "Ligne "+Str(i)+Chr(10)+"Dans"+Chr(10)+"toutes"+Chr(10)+"les colonnes")
    Next
  EndIf
  
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_EventGadget
        Select EventGadgetID()
          Case #MyButton1
            SaveContent()
            SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order0)
            ReloadContent()
            
          Case #MyButton2
            SaveContent()
            SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order1)
            ReloadContent()
            
          Case #MyButton3
            SaveContent()
            SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order2)
            ReloadContent()
            
          Case #MyButton4
            SaveContent()
            SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order3)
            ReloadContent()
            
          Case #MyButton5
            SaveContent()
            SendMessage_(GadgetID(#MyGadget), #LVM_SETCOLUMNORDERARRAY, 4, ?Order4)
            ReloadContent()
            
            
        EndSelect
      Case #PB_EventCloseWindow
        Quit = #True
        
    EndSelect
  Until Quit
EndIf

DataSection
Order0:
Data.l 0, 1, 2, 3

Order1 :
Data.l 1, 3, 2, 0

Order2 :
Data.l 3, 0, 2, 1

Order3 :
Data.l 1, 3, 0, 2

Order4 :
Data.l 2, 0, 1, 3

EndDataSection

Posted: Wed Oct 26, 2005 11:02 am
by Shardik
Another solution which saves the current column order to disk and loads it after the program is started a second time to rebuild the saved column order:

Code: Select all

#LVM_GETCOLUMNORDERARRAY = #LVM_FIRST + 59
#LVM_SETCOLUMNORDERARRAY = #LVM_FIRST + 58

#Filename = "C:\ColumnOrder.Dat"
#NumColumns = 3

#WindowID = 0
#WindowHeight = 200
#WindowWidth = 202

Enumeration
  #ListIconID
  #SaveButtonID
  #CancelButtonID
EndEnumeration

ArrayBufferPtr.L
i.W
WindowEvent.L

ArrayBufferPtr = AllocateMemory(#NumColumns * 4)

If OpenWindow(#WindowID, 0, 0, #WindowWidth, #WindowHeight,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "ListIcon HeaderDrag-Demo")
  If CreateGadgetList(WindowID())
    ListIconGadget(#ListIconID, 9, 12, 184, 149, "Column 1", 60, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_HeaderDragDrop)
    ButtonGadget(#SaveButtonID, 10, #WindowHeight - 30, 110, 20, "Save Column Order")
    ButtonGadget(#CancelButtonID, #WindowWidth - 70, #WindowHeight - 30, 60, 20, "Cancel")
    
    For i = 2 To #NumColumns
      AddGadgetColumn(#ListIconID, i - 1, "Column " + Str(i), 60)
    Next i  

    For i = 1 To 9
      AddGadgetItem(#ListIconID, -1, "R" + Str(i) + " + C1" + #LF$ + "R" + Str(i) + " + C2" + #LF$ + "R" + Str(i) + " + C3")
    Next i  

    If ReadFile(1, #Filename)
      For i = 0 To #NumColumns - 1
        PokeL(ArrayBufferPtr + i * 4, ReadLong())
      Next i

      CloseFile(1)

      SendMessage_(GadgetID(#ListIconID), #LVM_SETCOLUMNORDERARRAY, #NumColumns, ArrayBufferPtr)
    EndIf

    Repeat
      WindowEvent = WaitWindowEvent()

      If WindowEvent = #PB_Event_Gadget
        Select EventGadgetID()
          Case #SaveButtonID
            If CreateFile(1, #Filename)
              If SendMessage_(GadgetID(#ListIconID), #LVM_GETCOLUMNORDERARRAY, 3, ArrayBufferPtr) <> #False
                For i = 0 To #NumColumns - 1
                  WriteLong(PeekL(ArrayBufferPtr + i * 4))
                Next i

                CloseFile(1)
              EndIf
            EndIf

            Break
          Case #CancelButtonID
            Break
        EndSelect
      EndIf
    Until WindowEvent = #PB_Event_CloseWindow
  EndIf
EndIf
For the information to read the actual column order with LVM_GETCOLUMNORDERARRAY, take a look in the MSDN:
http://msdn.microsoft.com/library/defau ... rarray.asp

Posted: Thu Oct 27, 2005 1:07 am
by kenmo
Wow, thanks to all three of you!