$MAIN AUTODEFINE "OFF" $include "windowssdk.inc" $include "commctrl.inc" $include "shlobj.inc" ENUM screen s1=1000 e1 lv1 b1 b2 b3 ENDENUM DEF path[260]:ISTRING DEF ext,fmt,lines,oefont,text:STRING DEF d1:DIALOG DEF l,lv,total,x:INT DEF itext[512]:ISTRING DEF lvFormat:LVCOLUMN oefont="Courier New" /* My zero slashed fonts Andale Mono Consolas DejaVu Sans Mono Inconsolata PComm Session Roboto Mono Roboto Mono Medium Share Tech Mono Tahoma Slashed */ fmt="###,###,###" ext="IWB" total=0 CREATEDIALOG d1,0,0,550,600,0x80C80080,0,"Lines in Files",&Handler_d1 CONTROL d1,@STATIC,"Extension:",10,16,92,25,0,s1 CONTROL d1,@EDIT,ext,114,12,40,26,@TABSTOP|ES_UPPERCASE,e1 CONTROL d1,@BUTTON,"Search",180,10,80,25,0x50010001,b1 CONTROL d1,@BUTTON,"Reset",280,10,80,25,0x50010001,b2 CONTROL d1,@BUTTON,"Exit",380,10,80,25,0x50010001,b3 CONTROL d1,@LISTVIEW,"",10,70,530,525,@LVSREPORT|@LVSSHOWSELALWAYS|@HSCROLL|@VSCROLL|@BORDER,lv1 CoInitialize(NULL) :'For SHBrowseForFolder+BIF_NEWDIALOGSTYLE DOMODAL d1 END SUB Handler_d1(),INT SELECT @CLASS CASE @IDCLOSEWINDOW CASE& @IDDESTROY CoUninitialize() CLOSEDIALOG d1,@IDOK CASE @IDINITDIALOG CENTERWINDOW d1 SETFONT d1,oefont,12,400,0,s1 SETFONT d1,oefont,12,400,0,e1 SETFONT d1,oefont,12,400,0,lv1 SETFONT d1,oefont,12,400,0,b1 SETFONT d1,oefont,12,400,0,b2 SETFONT d1,oefont,12,400,0,b3 SETCONTROLCOLOR d1,b1,RGB(255,255,255),RGB(230,025,230) SETCONTROLCOLOR d1,b2,RGB(255,255,255),RGB(000,000,255) SETCONTROLCOLOR d1,b3,RGB(255,255,255),RGB(255,000,000) SETCONTROLNOTIFY(d1,e1,1,1) CONTROLCMD d1,e1,@EDSETLIMITTEXT,3 SENDMESSAGE d1,0x1024,0,RGB(000,000,000),lv1 'Text colour SENDMESSAGE d1,0x1026,0,RGB(201,192,218),lv1 'Background SENDMESSAGE d1,0x1001,0,RGB(255,255,255),lv1 'Gridlines SENDMESSAGE d1,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_LABELTIP,lv1 CONTROLCMD d1,lv1,@LVINSERTCOLUMN,0,"Lines" CONTROLCMD d1,lv1,@LVINSERTCOLUMN,1,"File Name" FOR lv=0 TO 25 CONTROLCMD d1,lv1,@LVINSERTITEM,0,"99,999,999" CONTROLCMD d1,lv1,@LVSETTEXT,0,1,"File Name"+STR$(lv) NEXT lv CONTROLCMD d1,lv1,@LVSETCOLWIDTH,0,130 CONTROLCMD d1,lv1,@LVSETCOLWIDTH,1,-2 SETFOCUS d1,e1 lvFormat.mask=LVCF_FMT lvFormat.fmt=LVCFMT_RIGHT SendMessage(d1,LVM_SETCOLUMN,0,lvFormat,lv1) CASE @IDCONTROL SELECT @CONTROLID ' search edit1 field extension CASE e1 SELECT @NOTIFYCODE CASE @ENSETFOCUS CONTROLCMD d1,e1,@EDSETSELECTION,0,-1 CASE @ENENTERKEY 'GetFolder() FolderRequest(0,"Select Folder",path,GETSTARTPATH,0x441) path+="\\*.iwb" MESSAGEBOX 0,path,"Path 1" PrintDir(path) CASE @ENTABKEY 'GetFolder() FolderRequest(0,"Select Folder",path,GETSTARTPATH,0x441) path+="\\*.iwb" MESSAGEBOX 0,path,"Path 2" PrintDir(path) ENDSELECT ' Search button CASE b1 'GetFolder() FolderRequest(0,"Select Folder",path,GETSTARTPATH,0x441) path+="\\*.iwb" MESSAGEBOX 0,path,"Path 3" PrintDir(path) ' Reset button CASE b2 itext="" total=0 ' Exit button CASE b3 itext+=USING(fmt,total)+" Total\n" CopyStringToClipboard(d1.hwnd,itext) CLOSEDIALOG d1,@IDCANCEL ' Listbox CASE lv1 IF @NOTIFYCODE=@NMCLICK x=SendMessage(d1,LVM_GETSELECTIONMARK,0,0,lv1) CONTROLCMD(d1,lv1,@LVGETTEXT,x,0,lines) CONTROLCMD(d1,lv1,@LVGETTEXT,x,1,text) itext+=lines+" "+text+"\n" total+=VAL(lines) ENDIF ENDSELECT ENDSELECT RETURN 0 ENDSUB SUB PrintDir(path:STRING) DEF attrib, count, dir:INT DEF filename,line_in:STRING DEF ifile:FILE 'Delete listview data SENDMESSAGE d1,LVM_DeleteAllItems,0,0,lv1 lv=-1 dir = FINDOPEN(path) IF(dir) DO filename = FINDNEXT(dir,attrib) IF len(filename) IF attrib & @FILE_DIRECTORY ELSE IF (filename <> "") count=0 IF (OPENFILE(ifile,path+filename,"R")=0) WHILE (READ(ifile,line_in) = 0) count++ ENDWHILE CLOSEFILE ifile ENDIF line_in=USING(fmt,count) l=LEN(line_in) IF l<11 THEN line_in=SPACE$(11-l)+line_in lv++ CONTROLCMD d1,lv1,@LVINSERTITEM,lv,line_in CONTROLCMD d1,lv1,@LVSETTEXT,lv,1,filename ENDIF ENDIF ENDIF 'the exit case is when there are no more entries in the current directory UNTIL filename = "" FINDCLOSE dir ENDIF ENDSUB SUB CopyStringToClipboard(INT hwnd, string text) UINT handle = GlobalAlloc(GHND, LEN(text) + 1) POINTER lock = GlobalLock(handle) memcpy(lock, text, LEN(text) + 1) GlobalUnlock(handle) OpenClipboard(hwnd) EmptyClipboard() SetClipboardData(CF_TEXT, handle) CloseClipboard() GlobalFree(handle) 'note: this line is not present in any example at all but I'm pretty sure that its absence will produce a memory leak :/ ENDSUB SUB FolderRequest(hWnd:uint, title:pointer, dir:pointer, initial:pointer, flags:uint),int DEF r = FALSE:INT DEF buffer[261]:ISTRING DEF item_list:UINT BROWSEINFO bi RtlZeroMemory(&bi, LEN(bi)) bi.hwndOwner = hWnd bi.lpszTitle = title bi.ulFlags = flags IF flags = 0 THEN bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_DONTGOBELOWDOMAIN bi.lpfn = &BrowseFolderCallback bi.lParam = initial ' Display the browser. item_list = SHBrowseForFolder(&bi) MESSAGEBOX 0,"Create","Item_List" IF item_list IF SHGetPathFromIDList(item_list, &buffer) MESSAGEBOX 0,"Use","Item_List" #dir = buffer + "\\" r = TRUE ENDIF CoTaskMemFree(item_list) ENDIF RETURN r ENDSUB SUB BrowseFolderCallback(hWnd:uint, uMsg:uint, lParam:uint, lpData:uint),int SELECT uMsg CASE BFFM_INITIALIZED ' Set start directory SendMessageA( hWnd, BFFM_SETSELECTION, TRUE, lpData ) CASE BFFM_VALIDATEFAILED RETURN 1 ENDSELECT RETURN 0 ENDSUB