(Icon)ListView sorting

Share your advanced PureBasic knowledge/code with the community.
Tranquil
Addict
Addict
Posts: 952
Joined: Mon Apr 28, 2003 2:22 pm
Location: Europe

(Icon)ListView sorting

Post by Tranquil »

Code updated For 5.20+
I found a user lib by gnozal but I have done my own thingie to be sure that my apps will work withour tailbited libs on further versions.

The following procedures sorts a ListView Gadget by your desired options.

This procedure copies also all colorinformation and itemdata set by SetGadgetItemData(). If this is not required you can modify the source for your own needs. Have fun.

Code: Select all

Syntax:
SortListView(ID.l,ColumnID,ColumnType,direction.b,mask$ = "")

ID : Gadget ID (Not handle!)
Column : Column position starting at 0
ColumnType: Can be one of the following constants:
  #SCL_ColumnType_Byte
  #SCL_ColumnType_Float
  #SCL_ColumnType_Quad
  #SCL_ColumnType_Long
  #SCL_ColumnType_String
  #SCL_ColumnType_Date
  #SCL_ColumnType_Double
  #SCL_ColumnType_Word

direction : See PB commands SortStructuredList option for details

mask$ : only needed for date fields. It defines the date formate as the same in the pb internal date formats. See FormatDate for more details on this. Mask$ is optional and must only be given in case ob #SCL_ColumnType_Date

Code: Select all


    Enumeration
      #SCL_ColumnType_Byte
      #SCL_ColumnType_Float
      #SCL_ColumnType_Quad
      #SCL_ColumnType_Long
      #SCL_ColumnType_String
      #SCL_ColumnType_Date
      #SCL_ColumnType_Double
      #SCL_ColumnType_Word
    EndEnumeration

    Procedure SortListView(ID.l,ColumnID,ColumnType,direction.b,mask$ = "")

      Structure SCLListViewStruct
        SortBy_String.s
        SortBy_Double.d
        SortBy_Long.l
        SortBy_Quad.q
        SortBy_Byte.b
        SortBy_Word.w
        SortBy_Float.f
        SortBy_Date.l
        Row.s
        LongData.l
        BGColor.l
        FNTColor.l
      EndStructure

      If IsGadget(id)=0
        ProcedureReturn #False
      EndIf

      If CountGadgetItems(ID)=0
        ProcedureReturn #True
      EndIf

      NewList Items.SCLListViewStruct()
     
      ;Ermittle Anzahl der Columns im gadget
      headerid=SendMessage_(GadgetID(id),#LVM_FIRST + 31,0,0)
      anzcolumns=SendMessage_(headerid,#HDM_GETITEMCOUNT,#Null,#Null)
     
      For pos=0 To CountGadgetItems(ID)-1
        AddElement(Items())
     
        ; Row erstellen
        For row=0 To anzcolumns-1
          items()\row + GetGadgetItemText(id,pos,row)+Chr(10)
        Next
       
        ; ItemData holen
        items()\LongData = GetGadgetItemData(ID,pos)
       
        ; Item Farben holen
        items()\BGColor = GetGadgetItemColor(ID,pos,#PB_Gadget_BackColor)
        items()\FNTColor= GetGadgetItemColor(id,pos,#PB_Gadget_FrontColor)
       
        Select ColumnType
          Case #SCL_ColumnType_Byte
            items()\SortBy_Byte = Val(GetGadgetItemText(ID,pos,ColumnID))
          Case #SCL_ColumnType_Float
            items()\SortBy_Float = ValF(GetGadgetItemText(ID,pos,ColumnID))
          Case #SCL_ColumnType_Quad
            items()\SortBy_Quad = Val(GetGadgetItemText(ID,pos,ColumnID))
          Case #SCL_ColumnType_Long
            items()\SortBy_Long = Val(GetGadgetItemText(ID,pos,ColumnID))
          Case #SCL_ColumnType_String
            items()\SortBy_String = GetGadgetItemText(ID,pos,ColumnID)
          Case #SCL_ColumnType_Date
            items()\SortBy_Date = ParseDate(mask$,GetGadgetItemText(ID,pos,ColumnID))
            Debug items()\SortBy_Date
          Case #SCL_ColumnType_Double
            items()\SortBy_Double = ValD(GetGadgetItemText(ID,pos,ColumnID))
          Case #SCL_ColumnType_Word
            items()\SortBy_Word = Val(GetGadgetItemText(ID,pos,ColumnID))
        EndSelect

      Next pos

      ; Sortieren
     
      Select ColumnType
        Case #SCL_ColumnType_Byte
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_Byte),#PB_Byte)
        Case #SCL_ColumnType_Float
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_Float),#PB_Float)
        Case #SCL_ColumnType_Quad
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_Quad),#PB_Quad)
        Case #SCL_ColumnType_Long
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_Long),#PB_Long)
        Case #SCL_ColumnType_String
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_String),#PB_String)
        Case #SCL_ColumnType_Date
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_Long),#PB_Long)
        Case #SCL_ColumnType_Double
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_Double),#PB_Double)
        Case #SCL_ColumnType_Word
          SortStructuredList(items(),direction.b,OffsetOf(SCLListViewStruct\SortBy_Word),#PB_Word)
      EndSelect
     
      ; ListView leeren und neu anzeigen
     

     
      ForEach Items()
        AddGadgetItem(ID,-1,items()\row)
        SetGadgetItemData(id,ListIndex(items()),items()\longdata)
        If items()\BGColor <>-1
          SetGadgetItemColor(ID,ListIndex(items()),#PB_Gadget_BackColor,items()\bgcolor)
        EndIf
       
        If items()\FNTColor <>-1
          SetGadgetItemColor(ID,ListIndex(items()),#PB_Gadget_FrontColor,items()\fntcolor)
        EndIf
      Next
     
    EndProcedure







Tranquil