/* This is a replacement for IBCleanUp Written by Bill K. Haesslein Started on 2008-01-16 Completed on 2008-02-23 Compile as a WINDOWS target */ AUTODEFINE "off" $include "windowssdk.inc" $include "commctrl.inc" LVCOLUMN lvFormat lvFormat.mask=LVCF_FMT lvFormat.fmt=LVCFMT_RIGHT INT CountRows,nState,t,r,i,bstate,hFile,lvi,CBmax,CBdirs UINT tfs ISTRING dir[260]=GETSTARTPATH STRING DefDir,TempDir,SelDir,IniFile,GetFile,GetDir STRING CBdir[5] FILE IniFileX CBmax=4 DefDir="No Directory selected" CONST LVM_FIRST=0x1000 CONST LVM_SETEXTENDEDLISTVIEWSTYLE=(LVM_FIRST+54) CONST LVS_EX_FULLROWSELECT=0x020 CONST LVS_EX_CHECKBOXES=0x4 CONST LVS_EX_GRIDLINES=0x1 CONST LVM_GETITEMSTATE=(LVM_FIRST+44) CONST LVIS_STATEIMAGEMASK=0xF000 CONST LVIF_STATE=0x8 CONST LVM_SETITEMSTATE=(LVM_FIRST+43) SETID "LVM_DELETEALLITEMS",4105 SETID "OPENEXISTING",3 SETID "GENERICREAD",0x80000000 CONST D1_LV=1 CONST D1_B1=2 CONST D1_B2=3 CONST D1_ED=4 CONST D1_RB=5 CONST D1_CB=6 TYPE LVITEM UINT mask INT iItem INT iSubItem UINT state UINT stateMask POINTER pszText INT cchTextMax INT iImage UINT lParam INT iIndent INT iGroupId UINT cColumns UINT puColumns ENDTYPE LVITEM lItem CONST WM_USER=0x400 CONST BFFM_SETSELECTION=WM_USER+102 CONST BFFM_INITIALIZED=1 CONST BFFM_VALIDATEFAILED=3 CONST BIF_RETURNFSANCESTORS=8 CONST BIF_RETURNONLYFSDIRS=1 CONST BIF_NEWDIALOGSTYLE=0x40 CONST BIF_DONTGOBELOWDOMAIN=2 CONST BFFM_SELCHANGED=2 'declare types and functions for Browse Folder TYPE BROWSEINFO UINT hwndOwner UINT pidlRoot POINTER pszDisplayName POINTER lpszTitle UINT ulFlags UINT lpfn UINT lParam INT iImage ENDTYPE BROWSEINFO bi DECLARE IMPORT,SHGetPathFromIDList(param1:UINT,param2:UINT),INT DECLARE IMPORT,SHBrowseForFolder(param1:UINT),INT IniFile=GETSTARTPATH+"IWB Cleanup.ini" hFile=CreateFileA(IniFile,@GENERICREAD,0,0,@OPENEXISTING,0,0) CloseHandle(hFile) DIALOG d1 CREATEDIALOG d1,0,0,800,600,0x80C80080,0,"IWB Cleanup",&d1_handler CONTROL d1,@LISTVIEW,"",2,2,794,428,@VSCROLL|0x5080000D,D1_LV CONTROL d1,@COMBOBOX,"",100,448,600,100,0x50A00603,D1_CB CONTROL d1,@RADIOBUTTON,"Search Sub-directories",100,484,200,22,0x50000009,D1_RB CONTROL d1,@BUTTON,"Browse for Files",100,520,150,22,0x50000000,D1_B1 CONTROL d1,@BUTTON,"Delete Ticked Files",550,520,150,22,0x50000000,D1_B2 CONTROL d1,@EDIT,"Give me Files !",100,560,600,22,0x50800800,D1_ED FOR i=1 TO 12 SETFONT d1,"Verdana",12,700,0,i NEXT i lvi=0 tfs=0 CoInitialize(0) DOMODAL d1 CoUninitialize() END SUB d1_handler(),INT SELECT @MESSAGE CASE @IDINITDIALOG CENTERWINDOW d1 SETFONT d1,"Verdana",10,400,0,D1_LV SETFONT d1,"Verdana",8,500,0,D1_RB SETCONTROLCOLOR d1,D1_RB,RGB(0,0,0),RGB(121,150,222) ' Set RadioButton Off SETSTATE d1,D1_RB,0 bstate=0 ' Define ListView SENDMESSAGE d1,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_CHECKBOXES|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT,D1_LV ' Load Headers CONTROLCMD d1,D1_LV,@LVINSERTCOLUMN,0,"File" CONTROLCMD d1,D1_LV,@LVINSERTCOLUMN,1,"Directory" CONTROLCMD d1,D1_LV,@LVINSERTCOLUMN,2,"File Size" ' set column width to Automatic CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,0,100 CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,1,100 CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,2,100 SENDMESSAGE d1.hWnd,0x1001,0,0xF7DFD6,D1_LV 'Set background colour SENDMESSAGE d1.hWnd,0x1024,0,0x000000,D1_LV 'Set text colour SENDMESSAGE d1.hWnd,0x1026,0,0xF7DFD6,D1_LV 'Set text background colour SENDMESSAGE d1,LVM_SETCOLUMN,2,lvFormat,D1_LV 'Set File Size column to align right FOR i=0 TO 4 CBdir[i]="" NEXT i IF (hFile=-1) IF (OPENFILE(IniFileX,IniFile,"W") <> 0) MESSAGEBOX d1,"Unable to write to Ini file","Ini problem" ELSE CBdirs=-1 INSERTSTRING d1,D1_CB,0,DefDir WRITE IniFileX,"1" WRITE IniFileX,DefDir CLOSEFILE IniFileX ENDIF ELSE IF (OPENFILE(IniFileX,IniFile,"R") <> 0) MESSAGEBOX d1,"Unable to read from Ini file","Ini problem" ELSE CBdirs=-2 WHILE (READ(IniFileX,TempDir)=0) CBdirs++ IF (CBdirs=-1) bstate=VAL(TempDir) ELSE CBdir[CBdirs]=TempDir INSERTSTRING d1,D1_CB,0,TempDir ENDIF ENDWHILE CLOSEFILE IniFileX ENDIF ENDIF SETSELECTED d1,D1_CB,0 SelDir=GETSTRING(d1,D1_CB,0) lvi=-1 tfs=0 ' Colour the dialog window CASE WM_CTLCOLORDLG RETURN CreateSolidBrush(RGB(121,150,222)) CASE @IDCLOSEWINDOW CASE& @IDDESTROY ' Write out INI file IF (OPENFILE(IniFileX,IniFile,"W") <> 0) MESSAGEBOX d1,"Unable to write to Ini file","Ini problem" ELSE WRITE IniFileX,LTRIM$(STR$(bstate)) ' get number of rows in Combo Box r=GETSTRINGCOUNT(d1,D1_CB)-1 ' read thru Combo Box and write data to INI file ' done in reverse to make sure when read back in latest is at 0 position FOR i=r TO 0 STEP -1 SelDir=GETSTRING(d1,D1_CB,i) WRITE IniFileX,SelDir NEXT i CLOSEFILE IniFileX ENDIF CASE @IDCONTROL SELECT @CONTROLID CASE D1_B1 IF (FolderRequest(0,"Select Directory...",dir,GETSTARTPATH)) GetDir=dir ENDIF IF LEN(GetDir) SelDir=GETSTRING(d1,D1_CB,0) IF SelDir=DefDir DELETESTRING d1,D1_CB,0 ENDIF FOR i=0 to CBdirs IF GetDir=CBdir[i] DELETESTRING d1,D1_CB,i ENDIF NEXT i ' if > max the delete last IF (CBdirs + 1 > CBmax) DELETESTRING d1,D1_CB,CBmax CBdirs-- ENDIF INSERTSTRING d1,D1_CB,0,GetDir SETSELECTED d1,D1_CB,0 CBdirs++ ' get number of rows in Combo Box FOR i=0 TO CBdirs SelDir=GETSTRING(d1,D1_CB,i) CBdir[i]=SelDir NEXT i SelDir=GetDir ClearLV() ENDIF CASE D1_B2 CountRows=CONTROLCMD(d1,D1_LV,@LVGETCOUNT) - 1 FOR t=0 TO CountRows IF conLVGetCheckState(d1,D1_LV,t) CONTROLCMD d1,D1_LV,@LVGETTEXT,t,0,GetFile,90 CONTROLCMD d1,D1_LV,@LVGETTEXT,t,1,GetDir,250 DELETEFILE(GetDir + "\\" + GetFile) ENDIF NEXT t ' clear listview SENDMESSAGE d1,@LVM_DELETEALLITEMS,0,0,D1_LV CASE D1_CB IF (@NOTIFYCODE=@CBNSELCHANGE) r=GETSTRINGCOUNT(d1,D1_CB) - 1 FOR i=0 TO r IF ISSELECTED(d1,D1_CB,i) SelDir=GETSTRING(d1,D1_CB,i) i=r ENDIF NEXT i ClearLV() ENDIF CASE D1_RB IF bstate SETSTATE(d1,D1_RB,0) bstate=0 ELSE SETSTATE(d1,D1_RB,1) bstate=1 ENDIF ClearLV() ENDSELECT ENDSELECT RETURN 0 ENDSUB SUB ClearLV() ' clear listview SENDMESSAGE d1,@LVM_DELETEALLITEMS,0,0,D1_LV lvi=-1 tfs=0 GetFiles(SelDir) ENDSUB SUB SetCheckState(win:WINDOW,cid:INT,index:INT,ticked:INT) lItem.mask=LVIF_STATE IF ticked THEN ticked=0x2000 ELSE ticked=0x1000 lItem.state=ticked lItem.stateMask=LVIS_STATEIMAGEMASK SENDMESSAGE win,LVM_SETITEMSTATE,index,lItem,cid ENDSUB SUB conLVGetCheckState(win:WINDOW,cid:INT,index:INT),INT 'State image 1 is the unchecked box, and state image 2 is the checked box 'Setting the state image To zero removes the check box altogether nState=(SENDMESSAGE(win,LVM_GETITEMSTATE,index,LVIS_STATEIMAGEMASK,cid))/4096 RETURN (nState=2) ENDSUB SUB GetFiles(ipath:STRING) INT dir,attrib,r UINT hFile,sizehigh,filesize STRING ext,filename,FileSize$ IF (ipath=DefDir) Message(DefDir) RETURN 0 ENDIF bstate=GETSTATE(d1,D1_RB) dir=FINDOPEN(ipath+"*.*") IF (dir) DO filename=FINDNEXT(dir,attrib) IF LEN(filename) IF (attrib & @FILE_DIRECTORY) IF (filename=".") OR (filename="..") r=0 ELSE ' If bstate=1 then process subdirectories IF bstate GetFiles(ipath+filename+"\\") ENDIF ENDIF ELSE ext=FileExtension(filename) IF (ext=".A") OR (ext=".O") OR (ext=".AOUT") hFile=CreateFileA(ipath + filename,@GENERICREAD,0,0,@OPENEXISTING,0,0) IF (hFile <> -1) filesize=GetFileSize(hFile,sizehigh) ENDIF CloseHandle(hFile) FileSize$=USING("###,###,###",filesize) tfs += filesize lvi++ ' Load Fields with data CONTROLCMD d1,D1_LV,@LVINSERTITEM,lvi,filename CONTROLCMD d1,D1_LV,@LVSETTEXT,lvi,1,ipath CONTROLCMD d1,D1_LV,@LVSETTEXT,lvi,2,FileSize$ ' Set Flag on SetCheckState(d1,D1_LV,lvi,1) ' set column width to Automatic CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,0,-1 CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,1,-1 CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,2,-1 ENDIF ENDIF ENDIF UNTIL filename="" FINDCLOSE dir ENDIF FileSize$=USING("###,###,###,###",tfs) SETCONTROLTEXT(d1,D1_ED,STR$(lvi+1) + " Files found, using " + LTRIM$(FileSize$) + " Bytes") IF lvi+1 = 0 CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,0,100 CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,1,100 CONTROLCMD d1,D1_LV,@LVSETCOLWIDTH,2,100 ENDIF ENDSUB SUB FileExtension(filename:STRING),STRING INT n STRING fn,stfn,path fn=LTRIM$(RTRIM$(filename)) Filenpath(fn,stfn,path) IF (INSTR(stfn,".")>0) n=LEN(stfn) WHILE (MID$(stfn,n,1)<>".") n-=1 ENDWHILE RETURN UCASE$(MID$(stfn,n)) ELSE RETURN "" ENDIF RETURN 0 ENDSUB SUB Filenpath(full:STRING,filename:POINTER,path:POINTER) INT n STRING fn fn=LTRIM$(RTRIM$(full)) IF (INSTR(fn,"\\")>0) n=LEN(fn) WHILE (MID$(fn,n,1)<>"\\") n-=1 ENDWHILE #path=LEFT$(fn,n) #filename=MID$(fn,n+1) ELSE #path="" #filename=fn ENDIF ENDSUB SUB FolderRequest(hWnd:UINT,title:POINTER,dir:POINTER,initial:POINTER),INT INT r r=FALSE ISTRING buffer[260] UINT item_list RtlZeroMemory(&bi,LEN(bi)) bi.hwndOwner=hWnd bi.lpszTitle=title bi.ulFlags=BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE|BIF_DONTGOBELOWDOMAIN bi.lpfn=&BrowseFolderCallback bi.lParam=initial ' Display the browser item_list=SHBrowseForFolder(&bi) IF item_list IF SHGetPathFromIDList(item_list,&buffer) #dir=buffer+"\\" r=TRUE ENDIF CoTaskMemFree(item_list) ENDIF RETURN r ENDSUB SUB BrowseFolderCallback(hWnd:UINT,uMsg:UINT,lParam:UINT,lpData:UINT),INT UINT dwStyle ISTRING szText[260] SELECT uMsg CASE BFFM_INITIALIZED ' Set start directory SendMessageA(hWnd,BFFM_SETSELECTION,TRUE,lpData) ' Remove the ? from the caption - optional dwStyle=GetWindowLongA(hWnd,GWL_EXSTYLE) IF (dwStyle & WS_EX_CONTEXTHELP) SetWindowLongA(hWnd,GWL_EXSTYLE,dwStyle||WS_EX_CONTEXTHELP) ENDIF CASE BFFM_SELCHANGED 'optional ' Set the window text to the path szText="\x0" SHGetPathFromIDList(lParam,&szText) SetWindowTextA(hWnd,szText) CASE BFFM_VALIDATEFAILED RETURN 1 ENDSELECT RETURN 0 ENDSUB SUB Message(msg:STRING) MESSAGEBOX(d1,msg,"Error",@MB_OK|@MB_ICONEXCLAMATION) ENDSUB