How to Resize automatically the ListIconGadget() columns?

Just starting out? Need help? Post your questions and find answers here.
User avatar
charvista
Addict
Addict
Posts: 949
Joined: Tue Sep 23, 2008 11:38 pm
Location: Belgium

How to Resize automatically the ListIconGadget() columns?

Post by charvista »

Hi :)

Is there a native way or a Windows API to get the size of a ListIcon gadget column, so I can resize it programmatically, like if I were double-clicking on the title bar of the gadget between two columns (when the cursor changes to a bidirectional arrow) ?

Here an example to start with, where I would like to resize automatically the columns:

Code: Select all

; Original Author: Karbon
; Date: 15. December 2003
; OS: Windows



; C++ LVCOLUMN structure (https://msdn.microsoft.com/en-us/library/windows/desktop/bb774743%28v=vs.85%29.aspx)
; typedef struct _LVCOLUMN {
;   UINT   mask;
;   int    fmt;
;   int    cx;
;   LPTSTR pszText;
;   int    cchTextMax;
;   int    iSubItem;
; #if (_WIN32_IE >= 0x0300)
;   int    iImage;
;   int    iOrder;
; #endif 
; #if (_WIN32_WINNT >= 0x0600)
;   int    cxMin;
;   int    cxDefault;
;   int    cxIdeal;
; #endif 
; } LVCOLUMN, *LPLVCOLUMN;


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

    ;     Structure LVCOLUMN
    ;       mask.l
    ;       fmt.l
    ;       cx.l
    ;       pszText.s
    ;       cchTextMax.l
    ;       iSubItem.l
    ;       iImage.l
    ;       iOrder.l
    ;     EndStructure


    Procedure SetListIconColumnText(Gadget,ColumnIndex,HeaderText.s)
       
       lvc.LVCOLUMN
       lvc\mask    = #LVCF_TEXT
       lvc\pszText = @HeaderText
       SendMessage_(GadgetID(Gadget),#LVM_SETCOLUMN,ColumnIndex,@lvc)
       
    EndProcedure


    Procedure.s GetListIconColumnText(Gadget,ColumnIndex)
       Protected.s Fill.s=Space(255)
       lvc.LVCOLUMN
       lvc\mask = #LVCF_TEXT
       lvc\pszText = @Fill
       lvc\cchTextMax = 255
       
       SendMessage_(GadgetID(Gadget),#LVM_GETCOLUMN,ColumnIndex,@lvc)
       
       ProcedureReturn PeekS(lvc\pszText)
       
    EndProcedure

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

Procedure zJustifyColumn(Gadget.i,Column.i,Format.i)
    Lvc.LVCOLUMN
    Lvc\mask = #LVCF_FMT
    Select Format
        Case 0
            Lvc\fmt = #LVCFMT_LEFT
        Case 1
            Lvc\fmt = #LVCFMT_CENTER
        Case 2
            Lvc\fmt = #LVCFMT_RIGHT
    EndSelect
    SendMessage_(GadgetID(Gadget), #LVM_SETCOLUMN, Column, @Lvc)
EndProcedure


F1=LoadFont(#PB_Any,"Verdana",10,#PB_Font_Bold)

W=800
H=500
Win=OpenWindow(#PB_Any, 100, 100, W, H, "Justify ListIcon Column (Aligment)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    Lgad=ListIconGadget(#PB_Any, 5, 5, W-10, H-10, "Name", 200, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines)
    AddGadgetColumn(Lgad, 1, "Address", 400)
    AddGadgetColumn(Lgad, 2, "Amount", 170)
    AddGadgetItem(Lgad, -1, "Harry Rannit"+Chr(10)+"12 Parliament Way, Battle Street, By the Bay"+Chr(10)+"4,125.00")
    AddGadgetItem(Lgad, -1, "Ginger Brokeit"+Chr(10)+"130 PureBasic Road, BigTown, CodeCity"+Chr(10)+"12.50")
    AddGadgetItem(Lgad, -1, "René Gängar"+Chr(10)+"78 Harvett Avenue, Hollywood"+Chr(10)+"1,841,422.71")
    SetGadgetFont(Lgad,FontID(F1))
    
    zJustifyColumn(Lgad,1,1)
    zJustifyColumn(Lgad,2,2)
    
    For i=0 To 2
        Debug "Column="+GetListIconColumnText(Lgad,i) + "     Width="+Str(GetGadgetItemAttribute(Lgad,0,#PB_ListIcon_ColumnWidth,i))
    Next i
    
    ;SetGadgetItemAttribute(Lgad,0,#PB_ListIcon_ColumnWidth,250,1)
    
    
    
    Repeat
        Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
    CloseWindow(Win)
Thanks in advance! :)
- Windows 11 Home 64-bit
- PureBasic 6.10 LTS (x64)
- 64 Gb RAM
- 13th Gen Intel(R) Core(TM) i9-13900K 3.00 GHz
- 5K monitor with DPI @ 200%
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4946
Joined: Sun Apr 12, 2009 6:27 am

Re: How to Resize automatically the ListIconGadget() columns

Post by RASHAD »

Hi

Code: Select all

; Original Author: Karbon
; Date: 15. December 2003
; OS: Windows



; C++ LVCOLUMN structure (https://msdn.microsoft.com/en-us/library/windows/desktop/bb774743%28v=vs.85%29.aspx)
; typedef struct _LVCOLUMN {
;   UINT   mask;
;   int    fmt;
;   int    cx;
;   LPTSTR pszText;
;   int    cchTextMax;
;   int    iSubItem;
; #if (_WIN32_IE >= 0x0300)
;   int    iImage;
;   int    iOrder;
; #endif 
; #if (_WIN32_WINNT >= 0x0600)
;   int    cxMin;
;   int    cxDefault;
;   int    cxIdeal;
; #endif 
; } LVCOLUMN, *LPLVCOLUMN;


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

    ;     Structure LVCOLUMN
    ;       mask.l
    ;       fmt.l
    ;       cx.l
    ;       pszText.s
    ;       cchTextMax.l
    ;       iSubItem.l
    ;       iImage.l
    ;       iOrder.l
    ;     EndStructure


    Procedure SetListIconColumnText(Gadget,ColumnIndex, HeaderText.s)
       
       lvc.LVCOLUMN
       lvc\mask    = #LVCF_TEXT
       lvc\pszText = @HeaderText
       SendMessage_(GadgetID(Gadget),#LVM_SETCOLUMN,ColumnIndex, @lvc)
       
    EndProcedure


    Procedure.s GetListIconColumnText(Gadget,ColumnIndex)
       Protected.s Fill.s=Space(255)
       lvc.LVCOLUMN
       lvc\mask = #LVCF_TEXT
       lvc\pszText = @Fill
       lvc\cchTextMax = 255
       
       SendMessage_(GadgetID(Gadget),#LVM_GETCOLUMN,ColumnIndex, @lvc)
       
       ProcedureReturn PeekS(lvc\pszText)
       
    EndProcedure

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

Procedure zJustifyColumn(Gadget.i,Column.i,Format.i)
    Lvc.LVCOLUMN
    Lvc\mask = #LVCF_FMT
    Select Format
        Case 0
            Lvc\fmt = #LVCFMT_LEFT
        Case 1
            Lvc\fmt = #LVCFMT_CENTER
        Case 2
            Lvc\fmt = #LVCFMT_RIGHT
    EndSelect
    SendMessage_(GadgetID(Gadget), #LVM_SETCOLUMN, Column, @Lvc)
EndProcedure


F1=LoadFont(#PB_Any,"Verdana",10,#PB_Font_Bold)

W=800
H=500
Win=OpenWindow(#PB_Any, 100, 100, W, H, "Justify ListIcon Column (Aligment)", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    Lgad=ListIconGadget(#PB_Any, 5, 5, W-10, H-10, "Name", 200, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection| #PB_ListIcon_GridLines)
    AddGadgetColumn(Lgad, 1, "Address", 400)
    AddGadgetColumn(Lgad, 2, "Amount", 170)
    AddGadgetItem(Lgad, -1, "Harry Rannit"+Chr(10)+ "12 Parliament Way, Battle Street, By the Bay"+Chr(10)+"4,125.00")
    AddGadgetItem(Lgad, -1, "Ginger Brokeit"+Chr(10)+ "130 PureBasic Road, BigTown, CodeCity"+Chr(10)+"12.50")
    AddGadgetItem(Lgad, -1, "René Gängar"+Chr(10)+ "78 Harvett Avenue, Hollywood"+Chr(10)+"1,841,422.71")
    SetGadgetFont(Lgad,FontID(F1))
    
    zJustifyColumn(Lgad,1,1)
    zJustifyColumn(Lgad,2,2)
    
    For i=0 To 2
        Debug "Column="+GetListIconColumnText(Lgad,i) + "     Width="+Str(GetGadgetItemAttribute(Lgad,0, #PB_ListIcon_ColumnWidth,i))
        SendMessage_(GadgetID(Lgad), #LVM_SETCOLUMNWIDTH,i,#LVSCW_AUTOSIZE)
    Next i
    
    ;SetGadgetItemAttribute(Lgad,0,#PB_ListIcon_ColumnWidth,250,1)
    
    
    
    Repeat
        Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
    CloseWindow(Win)
Egypt my love
User avatar
charvista
Addict
Addict
Posts: 949
Joined: Tue Sep 23, 2008 11:38 pm
Location: Belgium

Re: How to Resize automatically the ListIconGadget() columns

Post by charvista »

Perfect !
Thank you Rashad !
Have a nice day :D
- Windows 11 Home 64-bit
- PureBasic 6.10 LTS (x64)
- 64 Gb RAM
- 13th Gen Intel(R) Core(TM) i9-13900K 3.00 GHz
- 5K monitor with DPI @ 200%
Num3
PureBasic Expert
PureBasic Expert
Posts: 2812
Joined: Fri Apr 25, 2003 4:51 pm
Location: Portugal, Lisbon
Contact:

Re: How to Resize automatically the ListIconGadget() columns

Post by Num3 »

Code i use, from the Forums:

Code: Select all

Enumeration
  #PB_ListIcon_ColumnLeft
  #PB_ListIcon_ColumnCenter
  #PB_ListIcon_ColumnRight
  #PB_ListIcon_ColumnAutoSize
EndEnumeration

Procedure ListIconColumnAlign(ListIconID, Column, Alignment)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected AlignmentFactor.D
      Protected *CellRenderers
      Protected *Column
      Protected Count
      Protected i
      
      Select Alignment
        Case #PB_ListIcon_ColumnLeft
          AlignmentFactor = 0.0
        Case #PB_ListIcon_ColumnCenter
          AlignmentFactor = 0.5
        Case #PB_ListIcon_ColumnRight
          AlignmentFactor = 1.0
      EndSelect
      
      *Column = gtk_tree_view_get_column_(GadgetID(ListIconID), Column)
      
      If *Column
        gtk_tree_view_column_set_alignment_(*Column, AlignmentFactor)
        If Alignment = #PB_ListIcon_ColumnAutoSize
          gtk_tree_view_column_set_sizing_(*Column, #GTK_TREE_VIEW_COLUMN_AUTOSIZE)
        EndIf
        
        *CellRenderers = gtk_tree_view_column_get_cell_renderers_(*Column)
        
        If *CellRenderers
          Count = g_list_length_(*CellRenderers)
          
          For i = 0 To Count - 1
            g_object_set_double(g_list_nth_data_(*CellRenderers, i), "xalign", AlignmentFactor, #Null)
          Next i         
          
          g_list_free_(*CellRenderers)
        EndIf
      EndIf
    CompilerCase #PB_OS_MacOS
      Protected ColumnID.L
      Protected HeaderDesc.DataBrowserListViewHeaderDesc
      
      If GetDataBrowserTableViewColumnProperty(GadgetID(0), Column, @ColumnID) = 0
        If GetDataBrowserListViewHeaderDesc(GadgetID(0), ColumnID, @HeaderDesc) = 0
          HeaderDesc\FontStyle\Flags = #kControlUseJustMask
          
          Select Alignment
            Case #PB_ListIcon_ColumnLeft
              HeaderDesc\FontStyle\Just = #teFlushLeft
            Case #PB_ListIcon_ColumnCenter
              HeaderDesc\FontStyle\Just = #teCenter
            Case #PB_ListIcon_ColumnRight
              HeaderDesc\FontStyle\Just = #teFlushRight
          EndSelect
          
          SetDataBrowserListViewHeaderDesc(GadgetID(0), ColumnID, @HeaderDesc)
        EndIf
      EndIf
    CompilerCase #PB_OS_Windows
      Protected ListIconColumn.LV_COLUMN
      
      ListIconColumn\mask = #LVCF_FMT
      
      Select Alignment
        Case #PB_ListIcon_ColumnLeft
          ListIconColumn\fmt = #LVCFMT_LEFT
        Case #PB_ListIcon_ColumnCenter
          ListIconColumn\fmt = #LVCFMT_CENTER
        Case #PB_ListIcon_ColumnRight
          ListIconColumn\fmt = #LVCFMT_RIGHT
      EndSelect
      
      SendMessage_(GadgetID(ListIconID), #LVM_SETCOLUMN, Column, @ListIconColumn)
      If Alignment = #PB_ListIcon_ColumnAutoSize
        SendMessage_(GadgetID(ListIconID),#LVM_SETCOLUMNWIDTH,Column,#LVSCW_AUTOSIZE_USEHEADER)
      EndIf
      
      InvalidateRect_(GadgetID(ListIconID), 0, #True)
      
  CompilerEndSelect
EndProcedure
Post Reply