Page 1 of 1

ListIconGadget Events

Posted: Sat May 17, 2025 2:22 am
by RobertRioja
If I display a ListIconGadget in a form, I can trap the events such as #PB_EventType_LeftClick. But how do I determine the column and row that was clicked?
Thank you,
Robert

Re: ListIconGadget Events

Posted: Sat May 17, 2025 2:46 am
by tua
To get the row, read the help on GetGadgetState()

and to get the column, use this (Windows only):

Code: Select all

  Procedure GetSelectedColumn(ListIcon) 
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      Protected CursorLocation.POINT, HitInfo.LVHITTESTINFO
    
      GetCursorPos_(CursorLocation)
      MapWindowPoints_(0, GadgetID(ListIcon), CursorLocation, 1)             
      Hitinfo\pt\x = CursorLocation\x
      HitInfo\pt\y = CursorLocation\y
      SendMessage_(GadgetID(ListIcon), #LVM_SUBITEMHITTEST, 0, HitInfo)
      ProcedureReturn HitInfo\iSubItem  
    CompilerEndIf
  EndProcedure  

Re: ListIconGadget Events

Posted: Sun May 18, 2025 2:36 am
by RobertRioja
Thanks for your reply.

GetGadgetState() only returns the row if you click on column 0. Else it returns -1.
But I read up on LVHITTESTINFO and learned that iSubItem returns the column and iItem returns the row.

I am trying to produce a gadget that behaves like a spreadsheet, where you can click on an item and change it at will. Do you know of any way to do this? Maybe someone has already done it.

Thank you,
Robert

Re: ListIconGadget Events

Posted: Sun May 18, 2025 3:28 am
by tua
Not so - no idea what you did wrong, but as you see here, GetGadgetState() works as advertised:

Code: Select all

 Procedure ListIconClick()
  Debug "Row: " + Str(GetGadgetState(1))
EndProcedure  

If OpenWindow(0, 0, 0, 500, 200, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1, 5, 5, 480, 190, "Name", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(1, 1, "Address", 350)
  AddGadgetColumn(1, 2, "Age", 60)
  AddGadgetItem(1, -1, "Harry Rannit"   + Chr(10) + "12 Parliament Way, Battle Street, By the Bay" + Chr(10) + "55")
  AddGadgetItem(1, -1, "Ginger Brokeit" + Chr(10) + "130 PureBasic Road, BigTown, CodeCity" + Chr(10) + "27")
  ;
  BindGadgetEvent(1, @ListIconClick())
  Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
And yes, this is doable - but not without leaving the comfort of using PB only. On Windows that means diving into WinAPI; other people will have to speak on how to do this with Cocoa on MacOS and whatever graphics system PB uses on Linux if you require x-platform ...

Check this out - looks promising:
https://backups.rsbasic.de/GridExModule.pbi

Re: ListIconGadget Events

Posted: Sun May 18, 2025 4:35 am
by RobertRioja
I figured it out. It only works if you use #PB_ListIcon_FullRowSelect when you create the ListIconGadget.

I will look into the GridExModule.

Thank you,
Robert

Re: ListIconGadget Events

Posted: Sun May 18, 2025 7:59 am
by Shardik
I already posted this cross-platform example to get row and column of a clicked cell more than 10 years ago. That example also contains the function GetSelectedColumn() to get the clicked column.

A cross-platform example from this year to get the clicked header column I posted here. In that posting I also linked to the above example:
Shardik wrote:Therefore you may try out this cross-platform example which displays the row and column of a clicked cell in a ListIconGadget.

Re: ListIconGadget Events

Posted: Sun May 18, 2025 12:11 pm
by RASHAD
Hi RobertRioja
I did the next snippet long time back using virtual ListIcon for speed
1- Load 350000 row in no time
2- You can edit any cell
3- Sort items by clicking the header item
4- With drop down menu you can save
5- You can print
6- You can search
7- You can add or delete any item
8- You can change the style

And more
Maybe it needs some modification for Windows DPI
Good luck :)

Code: Select all

Procedure ThemesEnabled()
  dll.DLLVERSIONINFO
  dll\cbsize=SizeOf(dll)
  lib=OpenLibrary(#PB_Any,"comctl32.dll")
  If lib
    CallFunction(lib,"DllGetVersion",@dll)
    DLLVersion = dll\dwMajorVersion
    CloseLibrary(lib)
  EndIf
  If DLLVersion = 6
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

If ThemesEnabled() = 0
  MessageRequester("Error","Please Enable Modern them first",#MB_OK|#MB_ICONERROR)
  End
EndIf

#LVSICF_NOINVALIDATEALL = 1
#LVSICF_NOSCROLL = 2
#LVN_ODCACHEHINT = #LVN_FIRST - 13

#HDS_CHECKBOXES          = $0400

#HDF_CHECKBOX            = $0040
#HDF_CHECKED             = $0080

Prototype.i p_PrintWindow(hWnd, hdc, flags)
OpenLibrary(1, "User32.dll")
Global PrintWindow.p_PrintWindow = GetFunction(1, "PrintWindow")
Global start,finish,selno

Structure Licon Align 4 ;#PB_Structure_AlignC
  index.i 
  imgID.i
  item1.s
  item2.f
  item3.s
EndStructure

Global NewList myItems.licon() ,NewList state() ,Dim ssort(5,1)
Global oldproc,oldliCB ,styleflag,header, header_h,sort ,editflag ,row,col,crow,ccol,rowed,coled 
Global cont1,start,finish,brush,chkcol ,chkno,popt1,sopt1
Global HitInfo.LVHITTESTINFO ,cbox.HDITEM,titem ,dpix.d,dpiy.d

titem = 350000

ExamineDesktops()
olddesktop = DesktopWidth(0)
dpix = DesktopResolutionX()
dpiy = DesktopResolutionY()

cbox\mask = #HDI_FORMAT 
cbox\fmt = #HDF_CHECKBOX | #HDF_STRING | #HDF_BITMAP_ON_RIGHT

sort = 1
brush=CreateSolidBrush_($CCFFFF) 

ssort(1,0) = OffsetOf(Licon\index)
ssort(1,1) = TypeOf(Licon\index)
ssort(3,0) = OffsetOf(Licon\item1)
ssort(3,1) = TypeOf(Licon\item1)
ssort(4,0) = OffsetOf(Licon\item2)
ssort(4,1) = TypeOf(Licon\item2)
ssort(5,0) = OffsetOf(Licon\item3)
ssort(5,1) = TypeOf(Licon\item3)


Procedure SaveListIconGadget(Gadget)
  StandardFile$ = "C:\Licontest.txt" 
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = SaveFileRequester("Please choose file to save", StandardFile$, Pattern$, Pattern)
  If File$
    If GetGadgetState(sopt1) = 1
      finish = titem
    EndIf
    OpenFile(0,File$)
    For item = start To finish
      SelectElement(myItems(),item)
      WriteStringN(0,Str(myItems()\index)+"  "+myItems()\item1+"  "+StrD(myItems()\item2)+"  "+myItems()\item3,#PB_UTF8 )
    Next
    CloseFile(0)
    MessageRequester("Information", "You have selected following file:"+Chr(10)+File$, 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0) 
  EndIf
EndProcedure

Procedure PrintListIconGadget (Gadget)
  ColumnCount = SendMessage_(Header, #HDM_GETITEMCOUNT, 0, 0)
  RowCount = SendMessage_(GadgetID(Gadget),#LVM_GETITEMCOUNT, 0, 0)
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, RowCount - 1, #True)
  For CC = 0 To ColumnCount - 1
    SendMessage_(GadgetID(gadget), #LVM_SETCOLUMNWIDTH,CC,#LVSCW_AUTOSIZE_USEHEADER & #LVSCW_AUTOSIZE)
  Next
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, 0, #True)
  header_h = 35
  SetWindowTheme_(header, "", "")
  SetGadgetColor(gadget,#PB_Gadget_LineColor,0)
  
  x = GadgetX(gadget)
  y = GadgetY(gadget)
  w = GadgetWidth(gadget)
  h = GadgetHeight(gadget)  
  SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT, RowCount - 1,r.RECT)
  NoPages = RowCount/30
  SetGadgetState(gadget,-1)
  PrintRequester()  
  If StartPrinting("ListIcon")
    SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0,start*1000)
    ResizeGadget(gadget,x,y,r\right-12,1025)
    CreateImage(1,r\right-12,1025, 24)
    If GetGadgetState(popt1) = 1
      start = 0
      finish = RowCount
    EndIf         
    For sc = start To finish
      ShowScrollBar_(GadgetID(gadget),#SB_BOTH,0)
      hdc = StartDrawing(ImageOutput(1))
      If hdc
        If sc >= start And sc <= finish
          PrintWindow(GadgetID(gadget), hdc, 0)
        EndIf
        StopDrawing()
      EndIf            
      If StartDrawing(PrinterOutput())
        DrawImage(ImageID(1), 400, 400 ,ImageWidth(1)*6,ImageHeight(1)*6)
        If sc < finish
          NewPrinterPage()
        EndIf    
        StopDrawing()
      EndIf      
      InvalidateRect_(GadgetID(gadget),0,#True)
      SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0,1000)
    Next
    StopPrinting()
  EndIf
  If IsImage(1)
    FreeImage(1)
  EndIf
  ResizeGadget(gadget,x,y,w,h)
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, 0, #True)
  SetGadgetColor(gadget,#PB_Gadget_LineColor,#PB_Default)
  SetWindowTheme_(header, "", 0)
EndProcedure

Procedure Hheight(hWnd, uMsg, wParam, lParam)
  result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #HDM_LAYOUT
      *hdlayout.HD_LAYOUT = lParam
      If *hdlayout\prc <> 0
        *rect.RECT = *hdlayout\prc
        *rect\top = header_h
      EndIf
      If *hdlayout\pwpos <> 0
        *windowpos.WINDOWPOS = *hdlayout\pwpos
        *windowpos\cy = header_h
      EndIf          
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure liCB(hWnd, uMsg, wParam, lParam)
  Protected hdi.hd_item
  result = CallWindowProc_(oldliCB, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lparam
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            text$=GetGadgetItemText(0, -1, *pnmcd\dwItemSpec)
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+1
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
            If *pnmcd\dwItemSpec&1
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Blue)
            Else
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Red)
            EndIf
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf 
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf      
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure winCB(hWnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg 
      ;     Case #WM_CTLCOLORSTATIC
      ;       Select GetProp_(lParam, "PB_ID")
      ;         Case opt1,opt2,opt3
      ;           SetBkMode_(wParam,#TRANSPARENT)
      ;           SetTextColor_(wParam,$FFFFFF)
      ;           ProcedureReturn Bkgcolor_1        
      ;       EndSelect
      
    Case #WM_PRINTCLIENT         ;Transparent Trackbars windows 7 to 10
      Result = 0  
      
    Case #WM_NOTIFY
      *pnmh.NMHEADER = lParam
      ;       If *pnmh\hdr\hwndFrom = header
      ;         If *pnmh\iItem = 0
      ;           ProcedureReturn 1            
      ;         EndIf
      ;       EndIf         
      Select *pnmh\hdr\code
        Case #NM_CUSTOMDRAW
          *LVCDHeader.NMLVCUSTOMDRAW = lParam 
          Select *LVCDHeader\nmcd\dwDrawStage    ;               
            Case #CDDS_PREPAINT
            Case #CDDS_ITEMPREPAINT
              result = #CDRF_NOTIFYSUBITEMDRAW            
            Case #CDDS_SUBITEMPREPAINT
              Row = *LVCDHeader\nmcd\dwItemSpec 
              Col = *LVCDHeader\iSubItem
              If Row & 1 And styleflag = 1 
                If  GetDlgItem_(hwnd,wParam) = GadgetID(0)
                  *LVCDHeader\clrTextBk = $BAEEE8 
                EndIf
              EndIf                           
              result = #CDRF_DODEFAULT 
          EndSelect
          
        Case #HDN_ITEMCHANGED
          If editflag = 1
            r.RECT\top = coled
            r.RECT\left = #LVIR_BOUNDS
            SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, rowed, r)
            If coled = 0
              r\left+trimx + 2
              r\right = r\left +  SendMessage_(GadgetID(0),#LVM_GETCOLUMNWIDTH,0,0)
            EndIf 
            MoveWindow_(GadgetID(100),r\left+xed,r\top+yed,r\right-r\left,r\bottom-r\top,1)
            SetFocus_(GadgetID(100))        
          EndIf
          
        Case #HDN_DIVIDERDBLCLICK
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE)     
          EndIf 
          editflag = 0
          
        Case #LVN_ODCACHEHINT
          result = 0
          
          ;         Case #LVN_ODFINDITEM
          ;           result = -1
          
        Case #LVN_GETDISPINFO                ;
          *pnmlvdi.NMLVDISPINFO = lParam
          row = *pnmlvdi\item\iItem
          col = *pnmlvdi\item\iSubItem
          If col = 0 And *pnmlvdi\item\mask & #LVIF_STATE
            *pnmlvdi\item\stateMask = #LVIS_STATEIMAGEMASK
            If SelectElement(state(),myItems()\index)
              If state() = 0 And chkcol = 0
                *pnmlvdi\item\state = 1<<12               
              Else
                *pnmlvdi\item\state = 2<<12
              EndIf
            EndIf
          EndIf
          If SelectElement(myItems(), row) <> 0    
            If *pnmlvdi\item\mask & #LVIF_IMAGE And *pnmlvdi\item\iSubItem = 2
              *pnmlvdi\item\mask & #LVIF_IMAGE
              *pnmlvdi\item\iImage = PeekI(@myItems()\imgID)
            EndIf
            If *pnmlvdi\item\mask & #LVIF_TEXT           
              Select *pnmlvdi\item\iSubItem
                Case 1
                  PokeS(*pnmlvdi\item\pszText ,Str(PeekI(@myItems()\index)))
                Case 3
                  PokeS(*pnmlvdi\item\pszText , PeekS(@myItems()\item1),-1, #PB_Unicode)
                Case 4
                  PokeS(*pnmlvdi\item\pszText ,StrF(PeekF(@myItems()\item2)))
                Case 5
                  PokeS(*pnmlvdi\item\pszText , PeekS(@myItems()\item3),-1, #PB_Unicode)
              EndSelect
            EndIf
          EndIf
          
        Case #LVN_BEGINSCROLL
          editflag = 0
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE)     
          EndIf 
          
        Case #LVN_COLUMNCLICK ;Click Header item
          SendMessage_(GadgetID(0), #LVM_HITTEST, 0, @HitInfo)
          *nmlv.NM_LISTVIEW = lParam
          sortcol = *nmlv\iSubItem
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE) 
          EndIf
          If sortcol <> 0 And sortcol <> 2
            SortStructuredList(myItems(),sort, ssort(sortcol,0), ssort(sortcol,1))
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW | #RDW_ERASE)            
            
            cbox\fmt = #HDF_CHECKBOX | #HDF_STRING
            SendMessage_(Header, #HDM_SETITEM, 1, @cbox) 
            For index = 0 To 5
              cbox\fmt = #HDF_STRING
              SendMessage_(Header, #HDM_SETITEM, index, @cbox) 
            Next
            
            sort ! 1
            If sort = 0
              cbox\fmt = #HDF_STRING | #HDF_SORTUP 
            Else
              cbox\fmt = #HDF_STRING | #HDF_SORTDOWN 
            EndIf
            SendMessage_(Header, #HDM_SETITEM, sortcol, @cbox)
            cbox\fmt = #HDF_CHECKBOX
            SendMessage_(Header, #HDM_SETITEM, 0, @cbox)
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW | #RDW_ERASE )           
          EndIf      
          
        Case #NM_DBLCLK  ;LV Cell Double Click
          Hitinfo\pt\x = WindowMouseX(0)
          HitInfo\pt\y = WindowMouseY(0) - GadgetY(0)
          SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, @HitInfo)
          rowed = hitinfo\iItem
          coled = hitinfo\iSubItem
          r.RECT\top = coled
          r.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, rowed, r)
          If coled > 2
            SetParent_(GadgetID(100),GadgetID(0))
            ShowWindow_(GadgetID(100),#SW_SHOW)
            MoveWindow_(GadgetID(100),r\left+xed,r\top+yed,r\right-r\left,r\bottom-r\top,1)
            SetGadgetText(100,GetGadgetItemText(0,rowed,coled))
            SetFocus_(GadgetID(100))
            editflag = 1   
          Else
            If IsWindowVisible_(GadgetID(100))
              SetParent_(GadgetID(100),0)
              ShowWindow_(GadgetID(100),#SW_HIDE)   
            EndIf
          EndIf
          
        Case #NM_CLICK ;LV Row Click
          Hitinfo\pt\x = WindowMouseX(0)
          HitInfo\pt\y = WindowMouseY(0) - GadgetY(0)
          SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, @HitInfo)
          crow = Hitinfo\iItem
          ccol = Hitinfo\iSubItem
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE	)    
          EndIf
          SelectElement(state(), myItems()\index)
          If ccol = 0
            If state() = 0
              state() = 1
              selno + 1
            Else
              state() = 0
              selno - 1
            EndIf
          EndIf
          SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,crow,crow)
      EndSelect
      
    Case #WM_SIZE
      If IsWindowVisible_(GadgetID(100))
        SetParent_(GadgetID(100),0)
        ShowWindow_(GadgetID(100),#SW_HIDE	)    
      EndIf
      MoveWindow_(GadgetID(0),10*dpix,10*dpiy,(WindowWidth(0)-20)*dpix,(WindowHeight(0)-45)*dpiy,1)
      MoveWindow_(GadgetID(2),10*dpix,(WindowHeight(0)-30)*dpiy,120*dpix,24*dpiy,1)
      
    Case #WM_EXITSIZEMOVE
      If IsWindowVisible_(GadgetID(cont1))
        ResizeGadget(cont1,(WindowWidth(0)/2-125)*dpix,(WindowHeight(0)/2-90)*dpiy,250*dpix,180*dpiy)
      EndIf
      
  EndSelect
  ProcedureReturn result
EndProcedure

LoadFont(0,"Tahoma",12)
LoadFont(1,"consolas",16,#PB_Font_Bold )

If OpenWindow(0, 0, 0, 700*dpix, 450*dpiy, "Virtual ListIconGadget", #PB_Window_SystemMenu |  #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  
  If CreatePopupImageMenu(0, #PB_Menu_ModernLook)
    MenuItem(1, "Add before")
    MenuItem(2, "Get Full Text")
    MenuItem(3, "Delete")
    MenuBar()
    MenuItem(4, "Save")
    MenuItem(5, "Print")
    MenuBar()
    MenuItem(6, "Find")
    MenuItem(7, "Scroll to")
    MenuItem(10, "Quit")
  EndIf
  
  SetWindowCallback(@winCB())
  ListIconGadget(0,10*dpix,10*dpiy,680*dpix,390*dpiy,"*",30,#LVS_OWNERDATA| #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect |#PB_ListIcon_MultiSelect| #PB_ListIcon_CheckBoxes)
  SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE , #LVS_EX_SUBITEMIMAGES, #LVS_EX_SUBITEMIMAGES)
  SetGadgetFont(0,FontID(0))
  AddGadgetColumn(0,2,"Index",70)
  AddGadgetColumn(0,3,"Image",80)
  AddGadgetColumn(0,4,"TEST2",150)
  AddGadgetColumn(0,5,"TEST3",150)
  AddGadgetColumn(0,6,"TEST4",150)
  
  ButtonGadget(2,10*dpix,415*dpiy,120*dpix,24*dpiy,"List Style")
  SetGadgetFont(2,FontID(0))
  li = ImageList_Create_(32,32,#ILC_COLOR32| #ILC_MASK, 0, titem)
  
  file$ = "Shell32.dll"
  nimg = ExtractIconEx_(file$, -1, 0 ,0, 0)
  
  Dim sicon(nimg)
  ExtractIconEx_(file$, 0, 0 ,sicon(), nimg)
  
  For icon = 0 To nimg
    ImageList_AddIcon_(li,sicon(icon))
  Next
  
  FreeArray(sicon())
  
  SendMessage_(GadgetID(0), #LVM_SETIMAGELIST, #LVSIL_SMALL, li)
  
  header_h = 45
  Header = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)
  SetWindowLongPtr_(Header, #GWL_STYLE, GetWindowLongPtr_(Header, #GWL_STYLE) | #HDS_CHECKBOXES)
  SendMessage_(header,#HDM_SETBITMAPMARGIN,-2,0)
  SendMessage_(header,#WM_SETFONT,FontID(0),0)
  SendMessage_(Header, #HDM_SETITEM, 0, @cbox)
  
  oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())
  ;oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, titem, #LVSICF_NOINVALIDATEALL| #LVSICF_NOSCROLL)
  
  For i = 0 To titem
    AddElement(state())
    AddElement(myItems())
    myItems()\index = i  
    myItems()\imgID = i
    myItems()\item1 = "PureBasic " + Str(i)
    myItems()\item2 = Random(titem)/14
    myItems()\item3 = "TEST3 " + Str(i)
  Next
  
  StringGadget(100,0,0,0,0,"")
  SetGadgetFont(100,FontID(1))
  SetParent_(GadgetID(100),GadgetID(0))
  
  ;****************** Save LI ***************************
  cont2 = ContainerGadget(#PB_Any,WindowWidth(0)/2-125,WindowHeight(0)/2-90,250,180,#PB_Container_Flat )
  SetGadgetColor(cont2,#PB_Gadget_BackColor,$BCBCBD)
  ;FrameGadget(#PB_Any,2,2,GadgetWidth(cont1)-5,GadgetHeight(cont1)-5,"",#PB_Frame_Flat)
  sopt1 = OptionGadget(#PB_Any,10,10,100,18,"All LI :")
  SetGadgetState(sopt1,1)
  ; spt2 = OptionGadget(#PB_Any,10,40,100,18,"Pages         :")
  sopt2 = OptionGadget(#PB_Any,10,40,100,18,"Selected     :")
  stx1 = TextGadget(#PB_Any,20,65,100,24," From Row :")
  SetGadgetColor(stx1,#PB_Gadget_BackColor,$BCBCBD)
  fromp = SpinGadget(#PB_Any,160,65,80,24,0,1000,#PB_Spin_Numeric)
  SetGadgetState(fromp,0)
  stx2 = TextGadget(#PB_Any,20,90,100,24," To Row       :")
  SetGadgetColor(stx2,#PB_Gadget_BackColor,$BCBCBD)
  stop = SpinGadget(#PB_Any,160,90,80,24,1,1000,#PB_Spin_Numeric)
  SetGadgetState(stop,0)
  sokb = ButtonGadget(#PB_Any,10,145,60,24,"Save")
  scancelb = ButtonGadget(#PB_Any,80,145,60,24,"Cancel")
  CloseGadgetList()
  HideGadget(cont2,1)
  ;***********************************************************
  
  ;****************** Print LI ***************************
  cont1 = ContainerGadget(#PB_Any,WindowWidth(0)/2-125,WindowHeight(0)/2-90,250,180,#PB_Container_Flat )
  SetGadgetColor(cont1,#PB_Gadget_BackColor,$BCBCBD)
  ;FrameGadget(#PB_Any,2,2,GadgetWidth(cont1)-5,GadgetHeight(cont1)-5,"",#PB_Frame_Flat)
  popt1 = OptionGadget(#PB_Any,10,10,100,18,"Document :")
  SetGadgetState(popt1,1)
  popt2 = OptionGadget(#PB_Any,10,40,100,18,"Pages         :")
  popt3 = OptionGadget(#PB_Any,10,120,100,18,"Selected     :")
  ptx1 = TextGadget(#PB_Any,20,65,100,24," From page :")
  SetGadgetColor(ptx1,#PB_Gadget_BackColor,$BCBCBD)
  pfromp = SpinGadget(#PB_Any,160,65,80,24,0,1000,#PB_Spin_Numeric)
  SetGadgetState(pfromp,0)
  ptx2 = TextGadget(#PB_Any,20,90,100,24," To page       :")
  SetGadgetColor(ptx2,#PB_Gadget_BackColor,$BCBCBD)
  ptop = SpinGadget(#PB_Any,160,90,80,24,1,1000,#PB_Spin_Numeric)
  SetGadgetState(ptop,0)
  pokb = ButtonGadget(#PB_Any,10,145,60,24,"Print")
  pcancelb = ButtonGadget(#PB_Any,80,145,60,24,"Cancel")
  CloseGadgetList()
  HideGadget(cont1,1)
  ;***********************************************************
  
  ;********************** Find Window ************************
  ;***********************************************************
  
  ;********************** Scroll To **************************
  ;***********************************************************
  AddKeyboardShortcut(0,#PB_Shortcut_Return,50)
  AddKeyboardShortcut(0,#PB_Shortcut_Escape,60)
  ;AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_A,70)
  
  styleflag = 1        
  SetGadgetColor(0,#PB_Gadget_BackColor,$DEFEFE)
  oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
  InvalidateRect_(GadgetID(0),0,1)  
  Repeat
    Select WaitWindowEvent()
        
      Case  #PB_Event_CloseWindow
        If IsLibrary(1)
          CloseLibrary(1)
        EndIf
        Quit = 1
        
      Case #WM_LBUTTONUP
        HdItem.HDITEM
        HdItem\mask = #HDI_FORMAT
        SendMessage_(Header, #HDM_GETITEM, 0, @HdItem) 
        If HdItem\mask & #HDI_FORMAT And HdItem\fmt & #HDF_CHECKED
          chkcol = 1
          chkno = 1
        Else
          chkcol = 0
          chkno = 0
        EndIf
        
      Case #WM_RBUTTONDOWN
        ;If chkno = 1 Or selno > 1       
        ;MessageRequester("Error","More than one item selected not suppoted",#MB_OK|#MB_ICONERROR)
        ;Else
        DisplayPopupMenu(0, WindowID(0)) 
        ;EndIf     
        
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1  ;Add
            If SelectElement(myItems(), GetGadgetState(0)-1) <> 0
              titem + 1              
              AddElement(myItems())
              AddElement(state())
              myItems()\imgID = 0
              myItems()\index = titem
              myItems()\item1 = "PureBasic " + Str(titem)
              myItems()\item2 = Random(titem)/14
              myItems()\item3 = "TEST3 " + Str(titem)
              RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
            EndIf
            
          Case 2  ;Get full text
            draw = GetGadgetState(0)
            SelectElement(myItems(),draw)
            Debug Str(myItems()\index)+"  "+myItems()\item1+"  "+StrD(myItems()\item2)+"  "+myItems()\item3
            
          Case 3  ;Delete        
            draw = GetGadgetState(0)
            SetGadgetState(0,-1)
            SelectElement(myItems(),draw)
            DeleteElement(myItems())  
            ;SelectElement(state(), draw)                  
            ;DeleteElement(state())            
            RemoveGadgetItem(0,draw)
            titem - 1
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
            
          Case 4
            DisableGadget(0,1)
            HideGadget(cont2,0)
            ResizeGadget(cont2,WindowWidth(0)/2-125,WindowHeight(0)/2-90,250,180)
            
          Case 5  ;Print
            DisableGadget(0,1)
            HideGadget(cont1,0)
            ResizeGadget(cont1,WindowWidth(0)/2-125,WindowHeight(0)/2-90,250,180)
            
          Case 6  ;Find
            Input$ = InputRequester("Find", "Please make your input:", "")
            If Input$ > ""
              frow = 0
              Repeat 
                ForEach myItems()       ; Process all the elements...
                  input1$ = myItems()\item1
                  input2$ = StrF(myItems()\item2)
                  input3$ = myItems()\item3
                  If (FindString(input1$,Input$) > 0 Or FindString(input2$,Input$) > 0 Or FindString(input3$,Input$) > 0) And myItems()\index > frow
                    frow = myItems()\index
                    SendMessage_(GadgetID(0), #LVM_GETITEMRECT, frow-1, r.RECT) 
                    SendMessage_(GadgetID(0), #LVM_SCROLL, 0, r\top)
                    SetGadgetItemState(0,frow,#PB_ListIcon_Selected)
                    If frow > 0
                      Result = MessageRequester("Info","Found at Index :"+Str(frow)+#CRLF$+"Next find ?",#MB_YESNO|#MB_ICONINFORMATION)
                      If Result = #PB_MessageRequester_Yes
                        nomore = frow
                      Else
                        Break 
                      EndIf
                    EndIf
                  EndIf               
                Next                      
              Until Result = #PB_MessageRequester_No Or frow = nomore
              MessageRequester("Info","Finished",#MB_OK|#MB_ICONINFORMATION)
            Else
              MessageRequester("Info","Nothing to find",#MB_OK|#MB_ICONINFORMATION)          
            EndIf
            
          Case 7  ;Scroll to
                  ;SendMessage_(GadgetID(0),#LVM_ENSUREVISIBLE,100000,1)
            SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT, 99999, r.RECT) 
            SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0, r\top)
            
          Case 10  ;Quit
            If IsLibrary(1)
              CloseLibrary(1)
            EndIf                    
            End        
            
          Case 50 ;Return to accept
            If GetActiveGadget() = 100
              SelectElement(myItems(), rowed)
              edit$ = GetGadgetText(100)
              Select coled
                Case 3
                  myItems()\item1 = edit$
                Case 4
                  myItems()\item2 = ValF(edit$)
                Case 5
                  myItems()\item3 = edit$
              EndSelect
              ;RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
              If IsWindowVisible_(GadgetID(100))
                SetParent_(GadgetID(100),0)
                ShowWindow_(GadgetID(100),#SW_HIDE)   
              EndIf
              SetGadgetText(100,"")
              editflag = 0
            EndIf
            
          Case 60 ;Esc to dismiss
            If GetActiveGadget() = 100
              If IsWindowVisible_(GadgetID(100))
                SetParent_(GadgetID(100),0)
                ShowWindow_(GadgetID(100),#SW_HIDE)     
              EndIf
              SetGadgetText(100,"")
              editflag = 0
            EndIf
            
            ;         Case 70 ;Select all
            ;           HitInfo.LVHITTESTINFO
            ;           SendMessage_(GadgetID(0), #LVM_HITTEST, 0, @HitInfo)
            ;           SetGadgetItemState(0, HitInfo\iItem, #PB_ListIcon_Selected)
            ;           selno =10000000
            
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            draw = myItems()\index
            
          Case 2
            styleflag ! 1
            If styleflag = 0                    
              SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, 0)
              SetGadgetColor(0,#PB_Gadget_BackColor,$0)
              SetGadgetColor(0,#PB_Gadget_FrontColor,$FFFFFF)
            Else          
              SetGadgetColor(0,#PB_Gadget_BackColor,$DEFEFE)
              SetGadgetColor(0,#PB_Gadget_FrontColor,#PB_Default)
              oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
            EndIf
            InvalidateRect_(GadgetID(0),0,1)
            
          Case sfrom
            start = GetGadgetState(sfromp)
            
          Case stop
            finish = GetGadgetState(stop)
            
          Case sokb            ;Save
            HideGadget(cont2,1)
            DisableGadget(0,0)          
            SaveListIconGadget(0)
            
          Case scancelb
            HideGadget(cont2,1)
            DisableGadget(0,0)
            
          Case pfromp  ;From Page
            start = GetGadgetState(pfromp)
            
          Case ptop  ;To Page
            finish = GetGadgetState(ptop)
            
          Case pokb  ;Print
            HideGadget(cont1,1)
            DisableGadget(0,0)          
            PrintListIconGadget(0)
            
          Case pcancelb  ;Cancel printing
            HideGadget(cont1,1)
            DisableGadget(0,0)
        EndSelect
    EndSelect
  Until Quit = 1
  If IsLibrary(1)
    CloseLibrary(1)
  EndIf
EndIf
Edit : Fixed the save procedure
you can design the tabs then you can save the file as CSV :D

Re: ListIconGadget Events

Posted: Sun May 18, 2025 3:15 pm
by RASHAD
Previous post updated for save
Have fun

Re: ListIconGadget Events

Posted: Mon May 19, 2025 12:09 pm
by RASHAD
New edition :)
A lot of modifications
Have fun

Code: Select all


#LVSICF_NOINVALIDATEALL = 1
#LVSICF_NOSCROLL = 2
#LVN_ODCACHEHINT = #LVN_FIRST - 13

#HDS_CHECKBOXES          = $0400

#HDF_CHECKBOX            = $0040
#HDF_CHECKED             = $0080

Prototype.i p_PrintWindow(hWnd, hdc, flags)
OpenLibrary(1, "User32.dll")
Global PrintWindow.p_PrintWindow = GetFunction(1, "PrintWindow")
Global start,finish,selno

Structure Licon Align 4 ;#PB_Structure_AlignC
  index.i 
  imgID.i
  item1.s
  item2.f
  item3.s
EndStructure

Global NewList myItems.licon() ,NewList state() ,Dim ssort(5,1)
Global oldproc,oldliCB ,styleflag,header, header_h,sort ,editflag ,row,col,crow,ccol,rowed,coled 
Global start,finish,brush,chkcol ,chkno,popt1,sopt1
Global HitInfo.LVHITTESTINFO ,cbox.HDITEM,titem ,dpix.d,dpiy.d

titem = 350000

ExamineDesktops()
olddesktop = DesktopWidth(0)
dpix = DesktopResolutionX()
dpiy = DesktopResolutionY()

cbox\mask = #HDI_FORMAT 
cbox\fmt = #HDF_CHECKBOX | #HDF_STRING | #HDF_BITMAP_ON_RIGHT

sort = 1
brush=CreateSolidBrush_($CCFFFF) 

ssort(1,0) = OffsetOf(Licon\index)
ssort(1,1) = TypeOf(Licon\index)
ssort(3,0) = OffsetOf(Licon\item1)
ssort(3,1) = TypeOf(Licon\item1)
ssort(4,0) = OffsetOf(Licon\item2)
ssort(4,1) = TypeOf(Licon\item2)
ssort(5,0) = OffsetOf(Licon\item3)
ssort(5,1) = TypeOf(Licon\item3)


Procedure SaveListIconGadget(Gadget)
  StandardFile$ = "C:\Licontest.txt" 
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = SaveFileRequester("Please choose file to save", StandardFile$, Pattern$, Pattern)
  If File$
    If GetGadgetState(sopt1) = 1
      finish = titem
    EndIf
    OpenFile(0,File$)
    For item = start To finish
      SelectElement(myItems(),item)
      WriteStringN(0,Str(myItems()\index)+"  "+myItems()\item1+"  "+StrD(myItems()\item2)+"  "+myItems()\item3,#PB_UTF8 )
    Next
    CloseFile(0)
    MessageRequester("Information", "You have selected following file:"+Chr(10)+File$, 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0) 
  EndIf
EndProcedure

Procedure PrintListIconGadget (Gadget)
  ColumnCount = SendMessage_(Header, #HDM_GETITEMCOUNT, 0, 0)
  RowCount = SendMessage_(GadgetID(Gadget),#LVM_GETITEMCOUNT, 0, 0)
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, RowCount - 1, #True)
  For CC = 0 To ColumnCount - 1
    SendMessage_(GadgetID(gadget), #LVM_SETCOLUMNWIDTH,CC,#LVSCW_AUTOSIZE_USEHEADER & #LVSCW_AUTOSIZE)
  Next
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, 0, #True)
  header_h = 35
  SetWindowTheme_(header, "", "")
  SetGadgetColor(gadget,#PB_Gadget_LineColor,0)
  
  x = GadgetX(gadget)
  y = GadgetY(gadget)
  w = GadgetWidth(gadget)
  h = GadgetHeight(gadget)  
  SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT, RowCount - 1,r.RECT)
  NoPages = RowCount/30
  SetGadgetState(gadget,-1)
  PrintRequester()  
  If StartPrinting("ListIcon")
    SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0,start*1000)
    ResizeGadget(gadget,x,y,r\right-12,1025)
    CreateImage(1,r\right-12,1025, 24)
    If GetGadgetState(popt1) = 1
      start = 0
      finish = RowCount
    EndIf         
    For sc = start To finish
      ShowScrollBar_(GadgetID(gadget),#SB_BOTH,0)
      hdc = StartDrawing(ImageOutput(1))
      If hdc
        If sc >= start And sc <= finish
          PrintWindow(GadgetID(gadget), hdc, 0)
        EndIf
        StopDrawing()
      EndIf            
      If StartDrawing(PrinterOutput())
        DrawImage(ImageID(1), 400, 400 ,ImageWidth(1)*6,ImageHeight(1)*6)
        If sc < finish
          NewPrinterPage()
        EndIf    
        StopDrawing()
      EndIf      
      InvalidateRect_(GadgetID(gadget),0,#True)
      SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0,1000)
    Next
    StopPrinting()
  EndIf
  If IsImage(1)
    FreeImage(1)
  EndIf
  ResizeGadget(gadget,x,y,w,h)
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, 0, #True)
  SetGadgetColor(gadget,#PB_Gadget_LineColor,#PB_Default)
  SetWindowTheme_(header, "", 0)
EndProcedure

Procedure Hheight(hWnd, uMsg, wParam, lParam)
  result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #HDM_LAYOUT
      *hdlayout.HD_LAYOUT = lParam
      If *hdlayout\prc <> 0
        *rect.RECT = *hdlayout\prc
        *rect\top = header_h
      EndIf
      If *hdlayout\pwpos <> 0
        *windowpos.WINDOWPOS = *hdlayout\pwpos
        *windowpos\cy = header_h
      EndIf          
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure liCB(hWnd, uMsg, wParam, lParam)
  Protected hdi.hd_item
  result = CallWindowProc_(oldliCB, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lparam
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            text$=GetGadgetItemText(0, -1, *pnmcd\dwItemSpec)
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+1
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
            If *pnmcd\dwItemSpec&1
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Blue)
            Else
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Red)
            EndIf
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf 
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf      
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure winCB(hWnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg 
      ;     Case #WM_CTLCOLORSTATIC
      ;       Select GetProp_(lParam, "PB_ID")
      ;         Case opt1,opt2,opt3
      ;           SetBkMode_(wParam,#TRANSPARENT)
      ;           SetTextColor_(wParam,$FFFFFF)
      ;           ProcedureReturn Bkgcolor_1        
      ;       EndSelect
      
    Case #WM_PRINTCLIENT         ;Transparent Trackbars windows 7 to 10
      Result = 0  
      
    Case #WM_NOTIFY
      *pnmh.NMHEADER = lParam
      ;       If *pnmh\hdr\hwndFrom = header
      ;         If *pnmh\iItem = 0
      ;           ProcedureReturn 1            
      ;         EndIf
      ;       EndIf         
      Select *pnmh\hdr\code
        Case #NM_CUSTOMDRAW
          *LVCDHeader.NMLVCUSTOMDRAW = lParam 
          Select *LVCDHeader\nmcd\dwDrawStage    ;               
            Case #CDDS_PREPAINT
            Case #CDDS_ITEMPREPAINT
              result = #CDRF_NOTIFYSUBITEMDRAW            
            Case #CDDS_SUBITEMPREPAINT
              Row = *LVCDHeader\nmcd\dwItemSpec 
              Col = *LVCDHeader\iSubItem
              If Row & 1 And styleflag = 1 
                If  GetDlgItem_(hwnd,wParam) = GadgetID(0)
                  *LVCDHeader\clrTextBk = $BAEEE8 
                EndIf
              EndIf                           
              result = #CDRF_DODEFAULT 
          EndSelect
          
        Case #HDN_ITEMCHANGED
          If editflag = 1
            r.RECT\top = coled
            r.RECT\left = #LVIR_BOUNDS
            SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, rowed, r)
            If coled = 0
              r\left+trimx + 2
              r\right = r\left +  SendMessage_(GadgetID(0),#LVM_GETCOLUMNWIDTH,0,0)
            EndIf 
            MoveWindow_(GadgetID(100),r\left+xed,r\top+yed,r\right-r\left,r\bottom-r\top,1)
            SetFocus_(GadgetID(100))        
          EndIf
          
        Case #HDN_DIVIDERDBLCLICK
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE)     
          EndIf 
          editflag = 0
          
        Case #LVN_ODCACHEHINT
          result = 0
          
          ;         Case #LVN_ODFINDITEM
          ;           result = -1
          
        Case #LVN_GETDISPINFO                ;
          *pnmlvdi.NMLVDISPINFO = lParam
          row = *pnmlvdi\item\iItem
          col = *pnmlvdi\item\iSubItem
          If col = 0 And *pnmlvdi\item\mask & #LVIF_STATE
            *pnmlvdi\item\stateMask = #LVIS_STATEIMAGEMASK
            If SelectElement(state(),myItems()\index)
              If state() = 0 And chkcol = 0
                *pnmlvdi\item\state = 1<<12               
              Else
                *pnmlvdi\item\state = 2<<12
              EndIf
            EndIf
          EndIf
          If SelectElement(myItems(), row) <> 0    
            If *pnmlvdi\item\mask & #LVIF_IMAGE And *pnmlvdi\item\iSubItem = 2
              *pnmlvdi\item\mask & #LVIF_IMAGE
              *pnmlvdi\item\iImage = PeekI(@myItems()\imgID)
            EndIf
            If *pnmlvdi\item\mask & #LVIF_TEXT           
              Select *pnmlvdi\item\iSubItem
                Case 1
                  PokeS(*pnmlvdi\item\pszText ,Str(PeekI(@myItems()\index)))
                Case 3
                  PokeS(*pnmlvdi\item\pszText , PeekS(@myItems()\item1),-1, #PB_Unicode)
                Case 4
                  PokeS(*pnmlvdi\item\pszText ,StrF(PeekF(@myItems()\item2)))
                Case 5
                  PokeS(*pnmlvdi\item\pszText , PeekS(@myItems()\item3),-1, #PB_Unicode)
              EndSelect
            EndIf
          EndIf
          
        Case #LVN_BEGINSCROLL
          editflag = 0
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE)     
          EndIf 
          
        Case #LVN_COLUMNCLICK ;Click Header item
          SendMessage_(GadgetID(0), #LVM_HITTEST, 0, @HitInfo)
          *nmlv.NM_LISTVIEW = lParam
          sortcol = *nmlv\iSubItem
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE) 
          EndIf
          If sortcol <> 0 And sortcol <> 2
            SortStructuredList(myItems(),sort, ssort(sortcol,0), ssort(sortcol,1))
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW | #RDW_ERASE)            
            
            cbox\fmt = #HDF_CHECKBOX | #HDF_STRING
            SendMessage_(Header, #HDM_SETITEM, 1, @cbox) 
            For index = 0 To 5
              cbox\fmt = #HDF_STRING
              SendMessage_(Header, #HDM_SETITEM, index, @cbox) 
            Next
            
            sort ! 1
            If sort = 0
              cbox\fmt = #HDF_STRING | #HDF_SORTUP 
            Else
              cbox\fmt = #HDF_STRING | #HDF_SORTDOWN 
            EndIf
            SendMessage_(Header, #HDM_SETITEM, sortcol, @cbox)
            cbox\fmt = #HDF_CHECKBOX
            SendMessage_(Header, #HDM_SETITEM, 0, @cbox)
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW | #RDW_ERASE )           
          EndIf      
          
        Case #NM_DBLCLK  ;LV Cell Double Click
          Hitinfo\pt\x = WindowMouseX(0)
          HitInfo\pt\y = WindowMouseY(0) - GadgetY(0)
          SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, @HitInfo)
          rowed = hitinfo\iItem
          coled = hitinfo\iSubItem
          r.RECT\top = coled
          r.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, rowed, r)
          If coled > 2
            SetParent_(GadgetID(100),GadgetID(0))
            ShowWindow_(GadgetID(100),#SW_SHOW)
            MoveWindow_(GadgetID(100),r\left+xed,r\top+yed,r\right-r\left,r\bottom-r\top,1)
            SetGadgetText(100,GetGadgetItemText(0,rowed,coled))
            SetFocus_(GadgetID(100))
            editflag = 1   
          Else
            If IsWindowVisible_(GadgetID(100))
              SetParent_(GadgetID(100),0)
              ShowWindow_(GadgetID(100),#SW_HIDE)   
            EndIf
          EndIf
          
        Case #NM_CLICK ;LV Row Click
          Hitinfo\pt\x = WindowMouseX(0)
          HitInfo\pt\y = WindowMouseY(0) - GadgetY(0)
          SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, @HitInfo)
          crow = Hitinfo\iItem
          ccol = Hitinfo\iSubItem
          If IsWindowVisible_(GadgetID(100))
            SetParent_(GadgetID(100),0)
            ShowWindow_(GadgetID(100),#SW_HIDE	)    
          EndIf
          SelectElement(state(), myItems()\index)
          If ccol = 0
            If state() = 0
              state() = 1
              selno + 1
            Else
              state() = 0
              selno - 1
            EndIf
          EndIf
          SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,crow,crow)
      EndSelect
      
    Case #WM_SIZE
      If IsWindowVisible_(GadgetID(100))
        SetParent_(GadgetID(100),0)
        ShowWindow_(GadgetID(100),#SW_HIDE	)    
      EndIf
      MoveWindow_(GadgetID(0),10*dpix,10*dpiy,(WindowWidth(0)-20)*dpix,(WindowHeight(0)-45)*dpiy,1)
      MoveWindow_(GadgetID(2),10*dpix,(WindowHeight(0)-30)*dpiy,120*dpix,24*dpiy,1)
      
      ;     Case #WM_EXITSIZEMOVE
      ;       If IsWindowVisible_(WindowID(3))
      ;         ResizeWindow(3,(WindowWidth(0)/2-125)*dpix,(WindowHeight(0)/2-90)*dpiy,250*dpix,180*dpiy)
      ;       EndIf
      
  EndSelect
  ProcedureReturn result
EndProcedure

LoadFont(0,"Tahoma",12)
LoadFont(1,"consolas",16,#PB_Font_Bold )

If OpenWindow(0, 0, 0, 700*dpix, 450*dpiy, "Virtual ListIconGadget", #PB_Window_SystemMenu |  #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  
  If CreatePopupImageMenu(0)
    MenuItem(1, "Add before           ")
    MenuItem(2, "Get Full Text       ")
    MenuItem(3, "Delete")
    MenuBar()
    MenuItem(4, "Save")
    MenuItem(5, "Print")
    MenuBar()
    MenuItem(6, "Find")
    MenuItem(7, "Scroll to")
    MenuItem(10, "Quit")
  EndIf
  
  SetWindowCallback(@winCB())
  ListIconGadget(0,10*dpix,10*dpiy,680*dpix,390*dpiy,"*",30,#LVS_OWNERDATA| #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect |#PB_ListIcon_MultiSelect| #PB_ListIcon_CheckBoxes)
  SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE , #LVS_EX_SUBITEMIMAGES, #LVS_EX_SUBITEMIMAGES)
  SetGadgetFont(0,FontID(0))
  AddGadgetColumn(0,2,"Index",70)
  AddGadgetColumn(0,3,"Image",80)
  AddGadgetColumn(0,4,"TEST2",150)
  AddGadgetColumn(0,5,"TEST3",150)
  AddGadgetColumn(0,6,"TEST4",150)
  
  ButtonGadget(2,10*dpix,415*dpiy,120*dpix,24*dpiy,"List Style")
  SetGadgetFont(2,FontID(0))
  li = ImageList_Create_(32,32,#ILC_COLOR32| #ILC_MASK, 0, titem)
  
  file$ = "Shell32.dll"
  nimg = ExtractIconEx_(file$, -1, 0 ,0, 0)
  
  Dim sicon(nimg)
  ExtractIconEx_(file$, 0, 0 ,sicon(), nimg)
  
  For icon = 0 To nimg
    ImageList_AddIcon_(li,sicon(icon))
  Next
  
  FreeArray(sicon())
  
  SendMessage_(GadgetID(0), #LVM_SETIMAGELIST, #LVSIL_SMALL, li)
  
  header_h = 45
  Header = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)
  SetWindowLongPtr_(Header, #GWL_STYLE, GetWindowLongPtr_(Header, #GWL_STYLE) | #HDS_CHECKBOXES)
  SendMessage_(header,#HDM_SETBITMAPMARGIN,-2,0)
  SendMessage_(header,#WM_SETFONT,FontID(0),0)
  SendMessage_(Header, #HDM_SETITEM, 0, @cbox)
  
  oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())
  ;oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, titem, #LVSICF_NOINVALIDATEALL| #LVSICF_NOSCROLL)
  
  For i = 0 To titem
    AddElement(state())
    AddElement(myItems())
    myItems()\index = i  
    myItems()\imgID = i
    myItems()\item1 = "PureBasic " + Str(i)
    myItems()\item2 = Random(titem)/14
    myItems()\item3 = "TEST3 " + Str(i)
  Next
  
  StringGadget(100,0,0,0,0,"")
  SetGadgetFont(100,FontID(1))
  SetParent_(GadgetID(100),GadgetID(0))
  
  ;****************** Save LI ***************************
  OpenWindow(1,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,180,"",#WS_BORDER|#PB_Window_BorderLess,WindowID(0))  
  UseGadgetList(WindowID(1))
  FrameGadget(#PB_Any,2,2,WindowWidth(1)-4,WindowHeight(1)-4,"",#PB_Frame_Flat)
  sopt1 = OptionGadget(#PB_Any,10,10,100,18,"All LI :")
  SetGadgetState(sopt1,1)
  ; spt2 = OptionGadget(#PB_Any,10,40,100,18,"Pages         :")
  sopt2 = OptionGadget(#PB_Any,10,40,100,18,"Selected     :")
  stx1 = TextGadget(#PB_Any,20,65,100,24," From Row  :")
  ;SetGadgetColor(stx1,#PB_Gadget_BackColor,$BCBCBD)
  fromp = SpinGadget(#PB_Any,160,65,80,24,0,1000,#PB_Spin_Numeric)
  SetGadgetState(fromp,0)
  stx2 = TextGadget(#PB_Any,20,90,100,24," To Row       :")
  ;SetGadgetColor(stx2,#PB_Gadget_BackColor,$BCBCBD)
  stop = SpinGadget(#PB_Any,160,90,80,24,1,1000,#PB_Spin_Numeric)
  SetGadgetState(stop,0)
  sokb = ButtonGadget(#PB_Any,10,145,60,24,"Save")
  scancelb = ButtonGadget(#PB_Any,80,145,60,24,"Cancel")
  HideWindow(1,1)
  ;***********************************************************
  
  ;****************** Print LI ***************************
  OpenWindow(2,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,180,"",#WS_BORDER|#PB_Window_BorderLess,WindowID(0))
  UseGadgetList(WindowID(2))
  FrameGadget(#PB_Any,2,2,WindowWidth(2)-4,WindowHeight(2)-4,"",#PB_Frame_Flat)
  popt1 = OptionGadget(#PB_Any,10,10,100,18,"Document :")
  SetGadgetState(popt1,1)
  popt2 = OptionGadget(#PB_Any,10,40,100,18,"Pages         :")
  popt3 = OptionGadget(#PB_Any,10,120,100,18,"Selected     :")
  ptx1 = TextGadget(#PB_Any,20,65,100,24," From page :")
  ;SetGadgetColor(ptx1,#PB_Gadget_BackColor,$BCBCBD)
  pfromp = SpinGadget(#PB_Any,160,65,80,24,0,1000,#PB_Spin_Numeric)
  SetGadgetState(pfromp,0)
  ptx2 = TextGadget(#PB_Any,20,90,100,24," To page       :")
  ;SetGadgetColor(ptx2,#PB_Gadget_BackColor,$BCBCBD)
  ptop = SpinGadget(#PB_Any,160,90,80,24,1,1000,#PB_Spin_Numeric)
  SetGadgetState(ptop,0)
  pokb = ButtonGadget(#PB_Any,10,145,60,24,"Print")
  pcancelb = ButtonGadget(#PB_Any,80,145,60,24,"Cancel")
  HideWindow(2,1)
  ;***********************************************************
  
  UseGadgetList(WindowID(0))
  
  ;********************** Find Window ************************
  ;***********************************************************
  
  ;********************** Scroll To **************************
  ;***********************************************************
  AddKeyboardShortcut(0,#PB_Shortcut_Return,50)
  AddKeyboardShortcut(0,#PB_Shortcut_Escape,60)
  ;AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_A,70)
  
  styleflag = 1        
  SetGadgetColor(0,#PB_Gadget_BackColor,$DEFEFE)
  oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
  InvalidateRect_(GadgetID(0),0,1)  
  Repeat
    Select WaitWindowEvent()
        
      Case  #PB_Event_CloseWindow
        If IsLibrary(1)
          CloseLibrary(1)
        EndIf
        Quit = 1
        
      Case #WM_LBUTTONUP
        HdItem.HDITEM
        HdItem\mask = #HDI_FORMAT
        SendMessage_(Header, #HDM_GETITEM, 0, @HdItem) 
        If HdItem\mask & #HDI_FORMAT And HdItem\fmt & #HDF_CHECKED
          chkcol = 1
          chkno = 1
        Else
          chkcol = 0
          chkno = 0
        EndIf
        
      Case #WM_RBUTTONDOWN
        ;SetActiveGadget(-1)
        DisplayPopupMenu(0, WindowID(0))
        
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1  ;Add
            If SelectElement(myItems(), GetGadgetState(0)-1) <> 0
              titem + 1              
              AddElement(myItems())
              AddElement(state())
              myItems()\imgID = 0
              myItems()\index = titem
              myItems()\item1 = "PureBasic " + Str(titem)
              myItems()\item2 = Random(titem)/14
              myItems()\item3 = "TEST3 " + Str(titem)
              RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
            EndIf
            
          Case 2  ;Get full text
            draw = GetGadgetState(0)
            SelectElement(myItems(),draw)
            Debug Str(myItems()\index)+"  "+myItems()\item1+"  "+StrD(myItems()\item2)+"  "+myItems()\item3
            
          Case 3  ;Delete        
            draw = GetGadgetState(0)
            SetGadgetState(0,-1)
            SelectElement(myItems(),draw)
            DeleteElement(myItems())  
            ;SelectElement(state(), draw)                  
            ;DeleteElement(state())            
            RemoveGadgetItem(0,draw)
            titem - 1
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
            
          Case 4
            HideWindow(1,0)
            ResizeWindow(1,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,180)
            
          Case 5  ;Print
            HideWindow(2,0)
            ResizeWindow(1,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,180)
            
          Case 6  ;Find
            Input$ = InputRequester("Find", "Please make your input:", "")
            If Input$ > ""
              frow = 0
              Repeat 
                ForEach myItems()       ; Process all the elements...
                  input1$ = myItems()\item1
                  input2$ = StrF(myItems()\item2)
                  input3$ = myItems()\item3
                  If (FindString(input1$,Input$) > 0 Or FindString(input2$,Input$) > 0 Or FindString(input3$,Input$) > 0) And myItems()\index > frow
                    frow = myItems()\index
                    SendMessage_(GadgetID(0), #LVM_GETITEMRECT, frow-1, r.RECT) 
                    SendMessage_(GadgetID(0), #LVM_SCROLL, 0, r\top)
                    SetGadgetItemState(0,frow,#PB_ListIcon_Selected)
                    If frow > 0
                      Result = MessageRequester("Info","Found at Index :"+Str(frow)+#CRLF$+"Next find ?",#MB_YESNO|#MB_ICONINFORMATION)
                      If Result = #PB_MessageRequester_Yes
                        nomore = frow
                      Else
                        Break 
                      EndIf
                    EndIf
                  EndIf               
                Next                      
              Until Result = #PB_MessageRequester_No Or frow = nomore
              MessageRequester("Info","Finished",#MB_OK|#MB_ICONINFORMATION)
            Else
              MessageRequester("Info","Nothing to find",#MB_OK|#MB_ICONINFORMATION)          
            EndIf
            
          Case 7  ;Scroll to
                  ;SendMessage_(GadgetID(0),#LVM_ENSUREVISIBLE,100000,1)
            SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT, 99999, r.RECT) 
            SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0, r\top)
            
          Case 10  ;Quit
            If IsLibrary(1)
              CloseLibrary(1)
            EndIf                    
            End        
            
          Case 50 ;Return to accept
            If GetActiveGadget() = 100
              SelectElement(myItems(), rowed)
              edit$ = GetGadgetText(100)
              Select coled
                Case 3
                  myItems()\item1 = edit$
                Case 4
                  myItems()\item2 = ValF(edit$)
                Case 5
                  myItems()\item3 = edit$
              EndSelect
              ;RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
              If IsWindowVisible_(GadgetID(100))
                SetParent_(GadgetID(100),0)
                ShowWindow_(GadgetID(100),#SW_HIDE)   
              EndIf
              SetGadgetText(100,"")
              editflag = 0
            EndIf
            
          Case 60 ;Esc to dismiss
            If GetActiveGadget() = 100
              If IsWindowVisible_(GadgetID(100))
                SetParent_(GadgetID(100),0)
                ShowWindow_(GadgetID(100),#SW_HIDE)     
              EndIf
              SetGadgetText(100,"")
              editflag = 0
            EndIf
            
            ;         Case 70 ;Select all
            ;           HitInfo.LVHITTESTINFO
            ;           SendMessage_(GadgetID(0), #LVM_HITTEST, 0, @HitInfo)
            ;           SetGadgetItemState(0, HitInfo\iItem, #PB_ListIcon_Selected)
            ;           selno =10000000
            
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            draw = myItems()\index
            
          Case 2
            styleflag ! 1
            If styleflag = 0                    
              SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, 0)
              SetGadgetColor(0,#PB_Gadget_BackColor,$0)
              SetGadgetColor(0,#PB_Gadget_FrontColor,$FFFFFF)
            Else          
              SetGadgetColor(0,#PB_Gadget_BackColor,$DEFEFE)
              SetGadgetColor(0,#PB_Gadget_FrontColor,#PB_Default)
              oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
            EndIf
            InvalidateRect_(GadgetID(0),0,1)
            
          Case sfrom
            start = GetGadgetState(sfromp)
            
          Case stop
            finish = GetGadgetState(stop)
            
          Case sokb            ;Save
            HideWindow(1,1)            
            DisableGadget(0,0)          
            SaveListIconGadget(0)
            
          Case scancelb
            HideWindow(1,1)
            DisableGadget(0,0)
            
          Case pfromp  ;From Page
            start = GetGadgetState(pfromp)
            
          Case ptop  ;To Page
            finish = GetGadgetState(ptop)
            
          Case pokb  ;Print
            HideWindow(2,1)
            DisableGadget(0,0)          
            PrintListIconGadget(0)
            
          Case pcancelb  ;Cancel printing
            HideWindow(2,1)
            DisableGadget(0,0)
        EndSelect
    EndSelect
  Until Quit = 1
  If IsLibrary(1)
    CloseLibrary(1)
  EndIf
EndIf


Re: ListIconGadget Events

Posted: Mon May 19, 2025 4:10 pm
by RobertRioja
Tua: Thank you for your replies. It was very useful and got me started on the right road.

Shardik: Thank you for your example. This was very useful also.

Rashad: I am working with your code. It looks great !!! I am thinking of turning it into a Module, and separate it from the demo code. Once I do it, I will post it. Thank you.

Robert

Re: ListIconGadget Events

Posted: Tue May 20, 2025 7:53 am
by RASHAD
Hi
Added LoadData() to populate the ListIcon() from previously Saved data file
Bug fixed correspondingly
Still very fast (350000 row 4 items each) :)

Code: Select all


#LVSICF_NOINVALIDATEALL = 1
#LVSICF_NOSCROLL = 2
#LVN_ODCACHEHINT = #LVN_FIRST - 13

#HDS_CHECKBOXES          = $0400

#HDF_CHECKBOX            = $0040
#HDF_CHECKED             = $0080

Prototype.i p_PrintWindow(hWnd, hdc, flags)
OpenLibrary(1, "User32.dll")
Global PrintWindow.p_PrintWindow = GetFunction(1, "PrintWindow")
Global start,finish,selno

Structure Licon Align 4 ;#PB_Structure_AlignC
  index.i 
  imgID.i
  item1.s
  item2.f
  item3.s
EndStructure

Global NewList myItems.licon() ,NewList state() ,Dim ssort(5,1)
Global oldproc,oldliCB ,styleflag,header, header_h,sort ,editflag ,row,col,crow,ccol,rowed,coled 
Global start,finish,brush,chkcol ,chkno,popt1,sopt1
Global HitInfo.LVHITTESTINFO ,cbox.HDITEM,titem ,dpix.d,dpiy.d

titem = 350000

ExamineDesktops()
olddesktop = DesktopWidth(0)
dpix = DesktopResolutionX()
dpiy = DesktopResolutionY()

cbox\mask = #HDI_FORMAT 
cbox\fmt = #HDF_CHECKBOX | #HDF_STRING | #HDF_BITMAP_ON_RIGHT

sort = 1
brush=CreateSolidBrush_($CCFFFF) 

ssort(1,0) = OffsetOf(Licon\index)
ssort(1,1) = TypeOf(Licon\index)
ssort(3,0) = OffsetOf(Licon\item1)
ssort(3,1) = TypeOf(Licon\item1)
ssort(4,0) = OffsetOf(Licon\item2)
ssort(4,1) = TypeOf(Licon\item2)
ssort(5,0) = OffsetOf(Licon\item3)
ssort(5,1) = TypeOf(Licon\item3)

Procedure LoadData()
  StandardFile$ = "C:\*.txt" 
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
  If File$
    ReadFile(0,File$)
    ReadStringFormat(0)
    While Eof(0) = 0
      AddElement(state())
      AddElement(myItems())
      txt$ = ReadString(0,#PB_UTF8)
      result$ = StringField(txt$, 1, ";")
      myItems()\index = Val(result$)
      result$ = StringField(txt$, 2, ";")
      myItems()\item1 = result$     
      result$ = StringField(txt$, 3, ";")
      myItems()\item2 = ValF(result$)
      result$ = StringField(txt$, 4, ";")
      myItems()\item3 = result$
    Wend
    CloseFile(0)
    MessageRequester("Information", "You have selected following file:"+Chr(10)+File$, 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0) 
  EndIf
EndProcedure

Procedure SaveListIconGadget(Gadget)
  StandardFile$ = "C:\Licontest.txt" 
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = SaveFileRequester("Please choose file to save", StandardFile$, Pattern$, Pattern)
  If File$
    If GetGadgetState(sopt1) = 1
      finish = titem
    EndIf
    OpenFile(0,File$)
    For item = start To finish
      SelectElement(myItems(),item)
      WriteStringN(0,Str(myItems()\index)+";"+myItems()\item1+";"+StrD(myItems()\item2)+";"+myItems()\item3,#PB_UTF8 )
      If GetAsyncKeyState_(#VK_ESCAPE) & $8000 = $8000
        Break
      EndIf
    Next
    CloseFile(0)
    MessageRequester("Information", "You have selected following file:"+Chr(10)+File$, 0)
  Else
    MessageRequester("Information", "The requester was canceled.", 0) 
  EndIf
EndProcedure

Procedure PrintListIconGadget (Gadget)
  ColumnCount = SendMessage_(Header, #HDM_GETITEMCOUNT, 0, 0)
  RowCount = SendMessage_(GadgetID(Gadget),#LVM_GETITEMCOUNT, 0, 0)
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, RowCount - 1, #True)
  For CC = 0 To ColumnCount - 1
    SendMessage_(GadgetID(gadget), #LVM_SETCOLUMNWIDTH,CC,#LVSCW_AUTOSIZE_USEHEADER & #LVSCW_AUTOSIZE)
  Next
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, 0, #True)
  header_h = 35
  SetWindowTheme_(header, "", "")
  SetGadgetColor(gadget,#PB_Gadget_LineColor,0)
  
  x = GadgetX(gadget)
  y = GadgetY(gadget)
  w = GadgetWidth(gadget)
  h = GadgetHeight(gadget)  
  SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT, RowCount - 1,r.RECT)
  NoPages = RowCount/30
  SetGadgetState(gadget,-1)
  PrintRequester()  
  If StartPrinting("ListIcon")
    SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0,start*1000)
    ResizeGadget(gadget,x,y,r\right-12,1025)
    CreateImage(1,r\right-12,1025, 24)
    If GetGadgetState(popt1) = 1
      start = 0
      finish = RowCount
    EndIf         
    For sc = start To finish
      ShowScrollBar_(GadgetID(gadget),#SB_BOTH,0)
      hdc = StartDrawing(ImageOutput(1))
      If hdc
        If sc >= start And sc <= finish
          PrintWindow(GadgetID(gadget), hdc, 0)
        EndIf
        StopDrawing()
      EndIf            
      If StartDrawing(PrinterOutput())
        DrawImage(ImageID(1), 400, 400 ,ImageWidth(1)*6,ImageHeight(1)*6)
        If sc < finish
          NewPrinterPage()
        EndIf    
        StopDrawing()
      EndIf      
      InvalidateRect_(GadgetID(gadget),0,#True)
      SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0,1000)
      If GetAsyncKeyState_(#VK_ESCAPE) & $8000 = $8000
        Break
      EndIf
    Next
    StopPrinting()
  EndIf
  If IsImage(1)
    FreeImage(1)
  EndIf
  ResizeGadget(gadget,x,y,w,h)
  SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE, 0, #True)
  SetGadgetColor(gadget,#PB_Gadget_LineColor,#PB_Default)
  SetWindowTheme_(header, "", 0)
EndProcedure

Procedure Hheight(hWnd, uMsg, wParam, lParam)
  result = CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #HDM_LAYOUT
      *hdlayout.HD_LAYOUT = lParam
      If *hdlayout\prc <> 0
        *rect.RECT = *hdlayout\prc
        *rect\top = header_h
      EndIf
      If *hdlayout\pwpos <> 0
        *windowpos.WINDOWPOS = *hdlayout\pwpos
        *windowpos\cy = header_h
      EndIf          
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure liCB(hWnd, uMsg, wParam, lParam)
  Protected hdi.hd_item
  result = CallWindowProc_(oldliCB, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lparam
      If *pnmh\code = #NM_CUSTOMDRAW
        *pnmcd.NMCUSTOMDRAW = lparam
        Select *pnmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            text$=GetGadgetItemText(0, -1, *pnmcd\dwItemSpec)
            If *pnmcd\uItemState & #CDIS_SELECTED
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH|#DFCS_PUSHED)
              *pnmcd\rc\left+2 : *pnmcd\rc\top+1
            Else
              DrawFrameControl_(*pnmcd\hdc, *pnmcd\rc, #DFC_BUTTON, #DFCS_BUTTONPUSH)
            EndIf
            *pnmcd\rc\bottom-1 : *pnmcd\rc\right-1
            SetBkMode_(*pnmcd\hdc,#TRANSPARENT)
            If *pnmcd\dwItemSpec&1
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Blue)
            Else
              FillRect_(*pnmcd\hdc, *pnmcd\rc, brush)
              SetTextColor_(*pnmcd\hdc, #Red)
            EndIf
            If *pnmcd\rc\right>*pnmcd\rc\left
              DrawText_(*pnmcd\hdc, @text$, Len(text$), *pnmcd\rc, #DT_CENTER|#DT_VCENTER|#DT_SINGLELINE|#DT_END_ELLIPSIS)
            EndIf 
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf      
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure winCB(hWnd, uMsg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select uMsg 
      ;     Case #WM_CTLCOLORSTATIC
      ;       Select GetProp_(lParam, "PB_ID")
      ;         Case opt1,opt2,opt3
      ;           SetBkMode_(wParam,#TRANSPARENT)
      ;           SetTextColor_(wParam,$FFFFFF)
      ;           ProcedureReturn Bkgcolor_1        
      ;       EndSelect
      
    Case #WM_PRINTCLIENT         ;Transparent Trackbars windows 7 to 10
      Result = 0  
      
    Case #WM_NOTIFY
      *pnmh.NMHEADER = lParam
      ;       If *pnmh\hdr\hwndFrom = header
      ;         If *pnmh\iItem = 0
      ;           ProcedureReturn 1            
      ;         EndIf
      ;       EndIf         
      Select *pnmh\hdr\code
        Case #NM_CUSTOMDRAW
          *LVCDHeader.NMLVCUSTOMDRAW = lParam 
          Select *LVCDHeader\nmcd\dwDrawStage    ;               
            Case #CDDS_PREPAINT
            Case #CDDS_ITEMPREPAINT
              result = #CDRF_NOTIFYSUBITEMDRAW            
            Case #CDDS_SUBITEMPREPAINT
              Row = *LVCDHeader\nmcd\dwItemSpec 
              Col = *LVCDHeader\iSubItem
              If Row & 1 And styleflag = 1 
                If  GetDlgItem_(hwnd,wParam) = GadgetID(0)
                  *LVCDHeader\clrTextBk = $BAEEE8 
                EndIf
              EndIf                           
              result = #CDRF_DODEFAULT 
          EndSelect
          
        Case #HDN_ITEMCHANGED
          If editflag = 1
            r.RECT\top = coled
            r.RECT\left = #LVIR_BOUNDS
            SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, rowed, r)
            If coled = 0
              r\left+trimx + 2
              r\right = r\left +  SendMessage_(GadgetID(0),#LVM_GETCOLUMNWIDTH,0,0)
            EndIf
            HideGadget(100,1)        
          EndIf
          
        Case #HDN_DIVIDERDBLCLICK
          If IsWindowVisible_(GadgetID(100))
            ShowWindow_(GadgetID(100),#SW_HIDE)     
          EndIf 
          editflag = 0
          
        Case #LVN_ODCACHEHINT
          result = 0
          
          ;         Case #LVN_ODFINDITEM
          ;           result = -1
          
        Case #LVN_GETDISPINFO                ;
          *pnmlvdi.NMLVDISPINFO = lParam
          row = *pnmlvdi\item\iItem
          col = *pnmlvdi\item\iSubItem
          If col = 0 And *pnmlvdi\item\mask & #LVIF_STATE
            *pnmlvdi\item\stateMask = #LVIS_STATEIMAGEMASK
            If SelectElement(state(),myItems()\index)
              If state() = 0 And chkcol = 0
                *pnmlvdi\item\state = 1<<12               
              Else
                *pnmlvdi\item\state = 2<<12
              EndIf
            EndIf
          EndIf
          If SelectElement(myItems(), row) <> 0    
            If *pnmlvdi\item\mask & #LVIF_IMAGE And *pnmlvdi\item\iSubItem = 2
              *pnmlvdi\item\mask & #LVIF_IMAGE
              *pnmlvdi\item\iImage = PeekI(@myItems()\imgID)
            EndIf
            If *pnmlvdi\item\mask & #LVIF_TEXT           
              Select *pnmlvdi\item\iSubItem
                Case 1
                  PokeS(*pnmlvdi\item\pszText ,Str(PeekI(@myItems()\index)))
                Case 3
                  PokeS(*pnmlvdi\item\pszText , PeekS(@myItems()\item1),-1, #PB_Unicode)
                Case 4
                  PokeS(*pnmlvdi\item\pszText ,StrF(PeekF(@myItems()\item2)))
                Case 5
                  PokeS(*pnmlvdi\item\pszText , PeekS(@myItems()\item3),-1, #PB_Unicode)
              EndSelect
            EndIf
          EndIf
          
        Case #LVN_BEGINSCROLL
          editflag = 0
          If IsWindowVisible_(GadgetID(100))
            ShowWindow_(GadgetID(100),#SW_HIDE)     
          EndIf 
          
        Case #LVN_COLUMNCLICK ;Click Header item
          SendMessage_(GadgetID(0), #LVM_HITTEST, 0, @HitInfo)
          *nmlv.NM_LISTVIEW = lParam
          sortcol = *nmlv\iSubItem
          If IsWindowVisible_(GadgetID(100))
            ShowWindow_(GadgetID(100),#SW_HIDE) 
          EndIf
          If sortcol <> 0 And sortcol <> 2
            SortStructuredList(myItems(),sort, ssort(sortcol,0), ssort(sortcol,1))
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW | #RDW_ERASE)            
            
            cbox\fmt = #HDF_CHECKBOX | #HDF_STRING
            SendMessage_(Header, #HDM_SETITEM, 1, @cbox) 
            For index = 0 To 5
              cbox\fmt = #HDF_STRING
              SendMessage_(Header, #HDM_SETITEM, index, @cbox) 
            Next
            
            sort ! 1
            If sort = 0
              cbox\fmt = #HDF_STRING | #HDF_SORTUP 
            Else
              cbox\fmt = #HDF_STRING | #HDF_SORTDOWN 
            EndIf
            SendMessage_(Header, #HDM_SETITEM, sortcol, @cbox)
            cbox\fmt = #HDF_CHECKBOX
            SendMessage_(Header, #HDM_SETITEM, 0, @cbox)
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW | #RDW_ERASE )           
          EndIf      
          
        Case #NM_DBLCLK  ;LV Cell Double Click
          Hitinfo\pt\x = WindowMouseX(0)
          HitInfo\pt\y = WindowMouseY(0) - GadgetY(0)
          SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, @HitInfo)
          rowed = hitinfo\iItem
          coled = hitinfo\iSubItem
          r.RECT\top = coled
          r.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, rowed, r)
          If coled > 2
            ShowWindow_(GadgetID(100),#SW_SHOW)
            MoveWindow_(GadgetID(100),r\left+16,r\top+16,r\right-r\left,r\bottom-r\top,1)
            SetGadgetText(100,GetGadgetItemText(0,rowed,coled))
            SetFocus_(GadgetID(100))
            editflag = 1   
          Else
            If IsWindowVisible_(GadgetID(100))
              ShowWindow_(GadgetID(100),#SW_HIDE)   
            EndIf
          EndIf
          
        Case #NM_CLICK ;LV Row Click
          Hitinfo\pt\x = WindowMouseX(0)
          HitInfo\pt\y = WindowMouseY(0) - GadgetY(0)
          SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, @HitInfo)
          crow = Hitinfo\iItem
          ccol = Hitinfo\iSubItem
          If IsWindowVisible_(GadgetID(100))
            ShowWindow_(GadgetID(100),#SW_HIDE	)    
          EndIf
          SelectElement(state(), myItems()\index)
          If ccol = 0
            If state() = 0
              state() = 1
              selno + 1
            Else
              state() = 0
              selno - 1
            EndIf
          EndIf
          SendMessage_(GadgetID(0), #LVM_REDRAWITEMS ,crow,crow)
      EndSelect
      
    Case #WM_SIZE,#WM_MOVE
      If IsWindowVisible_(GadgetID(100))
        ShowWindow_(GadgetID(100),#SW_HIDE	)    
      EndIf
      MoveWindow_(GadgetID(0),10*dpix,10*dpiy,(WindowWidth(0)-20)*dpix,(WindowHeight(0)-45)*dpiy,1)
      MoveWindow_(GadgetID(2),10*dpix,(WindowHeight(0)-30)*dpiy,120*dpix,24*dpiy,1)
      If IsWindow(1) And IsWindowVisible_(WindowID(1))      
        ResizeWindow(1,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,210)
      EndIf
      If IsWindow(2) And IsWindowVisible_(WindowID(2))        
        ResizeWindow(2,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,210)
      EndIf
      
      ;     Case #WM_EXITSIZEMOVE
      ;       If IsWindowVisible_(WindowID(3))
      ;         ResizeWindow(3,(WindowWidth(0)/2-125)*dpix,(WindowHeight(0)/2-90)*dpiy,250*dpix,180*dpiy)
      ;       EndIf
      
  EndSelect
  ProcedureReturn result
EndProcedure

LoadFont(0,"Tahoma",14)
;LoadFont(1,"consolas",16,#PB_Font_Bold )

If OpenWindow(0, 0, 0, 700*dpix, 450*dpiy, "Virtual ListIconGadget", #PB_Window_SystemMenu |  #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  
  If CreatePopupImageMenu(0)
    MenuItem(1, "Add before           ")
    MenuItem(2, "Get Full Text       ")
    MenuItem(3, "Delete")
    MenuBar()
    MenuItem(4, "Save")
    MenuItem(5, "Print")
    MenuBar()
    MenuItem(6, "Find")
    MenuItem(7, "Scroll to")
    MenuItem(10, "Quit")
  EndIf
  
  ListIconGadget(0,10*dpix,10*dpiy,680*dpix,390*dpiy,"*",30,#LVS_OWNERDATA| #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect |#PB_ListIcon_MultiSelect| #PB_ListIcon_CheckBoxes)
  SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE , #LVS_EX_SUBITEMIMAGES, #LVS_EX_SUBITEMIMAGES)
  SetGadgetFont(0,FontID(0))
  AddGadgetColumn(0,2,"Index",70)
  AddGadgetColumn(0,3,"Image",80)
  AddGadgetColumn(0,4,"TEST2",150)
  AddGadgetColumn(0,5,"TEST3",150)
  AddGadgetColumn(0,6,"TEST4",150)
  
  ButtonGadget(2,10*dpix,415*dpiy,120*dpix,24*dpiy,"List Style")
  SetGadgetFont(2,FontID(0))
  li = ImageList_Create_(32,32,#ILC_COLOR32| #ILC_MASK, 0, titem)
  
  file$ = "Shell32.dll"
  nimg = ExtractIconEx_(file$, -1, 0 ,0, 0)
  
  Dim sicon(nimg)
  ExtractIconEx_(file$, 0, 0 ,sicon(), nimg)
  
  For icon = 0 To nimg
    ImageList_AddIcon_(li,sicon(icon))
  Next
  
  FreeArray(sicon())
  
  SendMessage_(GadgetID(0), #LVM_SETIMAGELIST, #LVSIL_SMALL, li)
  
  header_h = 45
  Header = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)
  SetWindowLongPtr_(Header, #GWL_STYLE, GetWindowLongPtr_(Header, #GWL_STYLE) | #HDS_CHECKBOXES)
  SendMessage_(header,#HDM_SETBITMAPMARGIN,-2,0)
  SendMessage_(header,#WM_SETFONT,FontID(0),0)
  SendMessage_(Header, #HDM_SETITEM, 0, @cbox)
  
  oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, titem, #LVSICF_NOINVALIDATEALL| #LVSICF_NOSCROLL)
  
  LoadData()
  
  ;   For i = 0 To titem
  ;     AddElement(state())
  ;     AddElement(myItems())
  ;     myItems()\index = i  
  ;     myItems()\imgID = i
  ;     myItems()\item1 = "PureBasic " + Str(i)
  ;     myItems()\item2 = Random(titem)/14
  ;     myItems()\item3 = "TEST3 " + Str(i)
  ;   Next  
  
  SetWindowCallback(@winCB())
  
  StringGadget(100,0,0,0,0,"")
  SetGadgetFont(100,FontID(0))
  SetGadgetColor(100,#PB_Gadget_FrontColor,$0000FF)
  
  ;****************** Save LI ***************************
  OpenWindow(1,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,210,"",#WS_BORDER|#PB_Window_BorderLess,WindowID(0))  
  UseGadgetList(WindowID(1))
  FrameGadget(#PB_Any,2,2,WindowWidth(1)-4,WindowHeight(1)-4,"",#PB_Frame_Flat)
  sopt1 = OptionGadget(#PB_Any,10,10,100,18,"All LI :")
  SetGadgetState(sopt1,1)
  ; spt2 = OptionGadget(#PB_Any,10,40,100,18,"Pages         :")
  sopt2 = OptionGadget(#PB_Any,10,40,100,18,"Selected     :")
  stx1 = TextGadget(#PB_Any,20,65,100,24," From Row  :")
  ;SetGadgetColor(stx1,#PB_Gadget_BackColor,$BCBCBD)
  fromp = SpinGadget(#PB_Any,160,65,80,24,0,1000,#PB_Spin_Numeric)
  SetGadgetState(fromp,0)
  stx2 = TextGadget(#PB_Any,20,90,100,24," To Row       :")
  ;SetGadgetColor(stx2,#PB_Gadget_BackColor,$BCBCBD)
  stop = SpinGadget(#PB_Any,160,90,80,24,1,1000,#PB_Spin_Numeric)
  SetGadgetState(stop,0)
  sokb = ButtonGadget(#PB_Any,10,145,60,24,"Save")
  scancelb = ButtonGadget(#PB_Any,80,145,60,24,"Cancel")  
  struncate = TextGadget(#PB_Any,2,180,250,24,"Escape to truncate",#SS_CENTER|#SS_CENTERIMAGE)
  SetGadgetColor(struncate,#PB_Gadget_FrontColor ,$0000FF)  
  HideWindow(1,1)
  ;***********************************************************
  
  ;****************** Print LI ***************************
  OpenWindow(2,WindowX(0)+WindowWidth(0)/2-125,WindowY(0)+WindowHeight(0)/2-90,250,210,"",#WS_BORDER|#PB_Window_BorderLess,WindowID(0))
  UseGadgetList(WindowID(2))
  FrameGadget(#PB_Any,2,2,WindowWidth(2)-4,WindowHeight(2)-4,"",#PB_Frame_Flat)
  popt1 = OptionGadget(#PB_Any,10,10,100,18,"Document :")
  SetGadgetState(popt1,1)
  popt2 = OptionGadget(#PB_Any,10,40,100,18,"Pages         :")
  popt3 = OptionGadget(#PB_Any,10,120,100,18,"Selected     :")
  ptx1 = TextGadget(#PB_Any,20,65,100,24," From page :")
  ;SetGadgetColor(ptx1,#PB_Gadget_BackColor,$BCBCBD)
  pfromp = SpinGadget(#PB_Any,160,65,80,24,0,1000,#PB_Spin_Numeric)
  SetGadgetState(pfromp,0)
  ptx2 = TextGadget(#PB_Any,20,90,100,24," To page       :")
  ;SetGadgetColor(ptx2,#PB_Gadget_BackColor,$BCBCBD)
  ptop = SpinGadget(#PB_Any,160,90,80,24,1,1000,#PB_Spin_Numeric)
  SetGadgetState(ptop,0)
  pokb = ButtonGadget(#PB_Any,10,145,60,24,"Print")
  pcancelb = ButtonGadget(#PB_Any,80,145,60,24,"Cancel")
  ptruncate = TextGadget(#PB_Any,2,180,250,24,"Escape to truncate",#SS_CENTER|#SS_CENTERIMAGE)
  SetGadgetColor(ptruncate,#PB_Gadget_FrontColor ,$0000FF)
  HideWindow(2,1)
  ;***********************************************************
  
  UseGadgetList(WindowID(0))
  
  ;********************** Find Window ************************
  ;***********************************************************
  
  ;********************** Scroll To **************************
  ;***********************************************************
  AddKeyboardShortcut(0,#PB_Shortcut_Return,50)
  AddKeyboardShortcut(0,#PB_Shortcut_Escape,60)
  ;AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_A,70)
  
  styleflag = 1        
  SetGadgetColor(0,#PB_Gadget_BackColor,$DEFEFE)
  oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
  InvalidateRect_(GadgetID(0),0,1)  
  Repeat
    Select WaitWindowEvent()
        
      Case  #PB_Event_CloseWindow
        If IsLibrary(1)
          CloseLibrary(1)
        EndIf
        Quit = 1
        
      Case #WM_LBUTTONUP
        HdItem.HDITEM
        HdItem\mask = #HDI_FORMAT
        SendMessage_(Header, #HDM_GETITEM, 0, @HdItem) 
        If HdItem\mask & #HDI_FORMAT And HdItem\fmt & #HDF_CHECKED
          chkcol = 1
          chkno = 1
        Else
          chkcol = 0
          chkno = 0
        EndIf
        
      Case #WM_RBUTTONDOWN
        ;SetActiveGadget(-1)
        DisplayPopupMenu(0, WindowID(0))
        
      Case #PB_Event_Menu
        Select EventMenu()
          Case 1  ;Add
            If SelectElement(myItems(), GetGadgetState(0)-1) <> 0
              titem + 1              
              AddElement(myItems())
              AddElement(state())
              myItems()\imgID = 0
              myItems()\index = titem
              myItems()\item1 = "PureBasic " + Str(titem)
              myItems()\item2 = Random(titem)/14
              myItems()\item3 = "TEST3 " + Str(titem)
              RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
            EndIf
            
          Case 2  ;Get full text
            draw = GetGadgetState(0)
            SelectElement(myItems(),draw)
            Debug Str(myItems()\index)+"  "+myItems()\item1+"  "+StrD(myItems()\item2)+"  "+myItems()\item3
            
          Case 3  ;Delete        
            draw = GetGadgetState(0)
            SetGadgetState(0,-1)
            SelectElement(myItems(),draw)
            DeleteElement(myItems())  
            ;SelectElement(state(), draw)                  
            ;DeleteElement(state())            
            RemoveGadgetItem(0,draw)
            titem - 1
            RedrawWindow_(GadgetID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
            
          Case 4
            HideWindow(1,0)
            
          Case 5  ;Print
            HideWindow(2,0)
            
          Case 6  ;Find
            Input$ = InputRequester("Find", "Please make your input:", "")
            If Input$ > ""
              frow = 0
              Repeat 
                ForEach myItems()       ; Process all the elements...
                  input1$ = myItems()\item1
                  input2$ = StrF(myItems()\item2)
                  input3$ = myItems()\item3
                  If (FindString(input1$,Input$) > 0 Or FindString(input2$,Input$) > 0 Or FindString(input3$,Input$) > 0) And myItems()\index > frow
                    frow = myItems()\index
                    SendMessage_(GadgetID(0), #LVM_GETITEMRECT, frow-1, r.RECT) 
                    SendMessage_(GadgetID(0), #LVM_SCROLL, 0, r\top)
                    SetGadgetItemState(0,frow,#PB_ListIcon_Selected)
                    If frow > 0
                      Result = MessageRequester("Info","Found at Index :"+Str(frow)+#CRLF$+"Next find ?",#MB_YESNO|#MB_ICONINFORMATION)
                      If Result = #PB_MessageRequester_Yes
                        nomore = frow
                      Else
                        Break 
                      EndIf
                    EndIf
                  EndIf               
                Next                      
              Until Result = #PB_MessageRequester_No Or frow = nomore
              MessageRequester("Info","Finished",#MB_OK|#MB_ICONINFORMATION)
            Else
              MessageRequester("Info","Nothing to find",#MB_OK|#MB_ICONINFORMATION)          
            EndIf
            
          Case 7  ;Scroll to
                  ;SendMessage_(GadgetID(0),#LVM_ENSUREVISIBLE,100000,1)
            SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT, 99999, r.RECT) 
            SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0, r\top)
            
          Case 10  ;Quit
            If IsLibrary(1)
              CloseLibrary(1)
            EndIf                    
            End        
            
          Case 50 ;Return to accept
            If GetActiveGadget() = 100
              SelectElement(myItems(), rowed)
              edit$ = GetGadgetText(100)
              Select coled
                Case 3
                  myItems()\item1 = edit$
                Case 4
                  myItems()\item2 = ValF(edit$)
                Case 5
                  myItems()\item3 = edit$
              EndSelect
              ;RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW| #RDW_ERASE)
              If IsWindowVisible_(GadgetID(100))
                ShowWindow_(GadgetID(100),#SW_HIDE)   
              EndIf
              SetGadgetText(100,"")
              editflag = 0
            EndIf
            
          Case 60 ;Esc to dismiss
            If GetActiveGadget() = 100
              If IsWindowVisible_(GadgetID(100))
                ShowWindow_(GadgetID(100),#SW_HIDE)     
              EndIf
              SetGadgetText(100,"")
              editflag = 0
            EndIf
            
            ;         Case 70 ;Select all
            ;           HitInfo.LVHITTESTINFO
            ;           SendMessage_(GadgetID(0), #LVM_HITTEST, 0, @HitInfo)
            ;           SetGadgetItemState(0, HitInfo\iItem, #PB_ListIcon_Selected)
            ;           selno =10000000
            
        EndSelect
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            draw = myItems()\index
            
          Case 2
            styleflag ! 1
            If styleflag = 0                    
              SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, 0)
              SetGadgetColor(0,#PB_Gadget_BackColor,$0)
              SetGadgetColor(0,#PB_Gadget_FrontColor,$FFFFFF)
            Else          
              SetGadgetColor(0,#PB_Gadget_BackColor,$DEFEFE)
              SetGadgetColor(0,#PB_Gadget_FrontColor,#PB_Default)
              oldliCB = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @liCB())
            EndIf
            InvalidateRect_(GadgetID(0),0,1)
            
          Case sfrom
            start = GetGadgetState(sfromp)
            
          Case stop
            finish = GetGadgetState(stop)
            
          Case sokb            ;Save           
            DisableGadget(0,0)          
            SaveListIconGadget(0)
            HideWindow(1,1)  
            
          Case scancelb
            HideWindow(1,1)
            DisableGadget(0,0)
            
          Case pfromp  ;From Page
            start = GetGadgetState(pfromp)
            
          Case ptop  ;To Page
            finish = GetGadgetState(ptop)
            
          Case pokb  ;Print        
            DisableGadget(0,0)          
            PrintListIconGadget(0)
            HideWindow(2,1)
            
          Case pcancelb  ;Cancel printing
            HideWindow(2,1)
            DisableGadget(0,0)
        EndSelect
    EndSelect
  Until Quit = 1
  If IsLibrary(1)
    CloseLibrary(1)
  EndIf
EndIf
Edit :Code modified

Re: ListIconGadget Events

Posted: Tue May 20, 2025 8:47 am
by Jacobus
Hi Rashad,
There's a big problem with your printing procedure.
I tried to test it with PrintPDF and requested a single page. The problem is that your procedure ignored it and started printing 2,750 pages!
I couldn't cancel the print job. I had to kill the process in a rather archaic way, via the Task Manager and Services, and finally got rid of it only by pausing the print spooler and then restarting the PC. :shock:
You should rename your procedure "unstoppable printing" or "Panic in Listicon" :mrgreen:
Tested with Windows11, PB6.21B9 x86
Good day!

Re: ListIconGadget Events

Posted: Tue May 20, 2025 10:18 am
by RASHAD
Hi Jacobus :D
Sorry mate
Previous post updated
Escape to Truncate