' BizzyPak - Code Retriever '----------------------------------------------------------------------- ' Looking for elusive code that you know exists in a file but not sure ' which file. Let Retriever find it for you! ' Allowing you to Cut and Paste code from prog to prog! '----------------------------------------------------------------------- ' Retriever looks for code through all files in a nominated Main Folder ' and Sub-Folders of Main Folder '----------------------------------------------------------------------- AUTODEFINE "off" $include "windowssdk.inc" ' Structures TYPE list POINTER nxt INT rec STRING datax ENDTYPE list start list nodes list ref list temp POINTER node ' Definitions DEF win,d1,d2:DIALOG DEF keyfile,foldfile:FILE DEF IsKeyChanged,IsFoldChanged:INT DEF SearchPaths,FindStr,FndStr$,IBString:STRING DEF nDir,nDirFin:INT DEF hSearch:INT DEF notify,rec,ret:INT DEF hi,lo:INT ' Constants CONST FILE_ATTRIBUTE_DIRECTORY = 0x00000010 SETID "LB_RESETCONTENT", 388 SETID "LB_FINDSTRING", 399 SETID "CB_RESETCONTENT", 331 SETID "EM_SETSEL", 177 SETID "EM_LIMITTEXT", 197 SETID "EN_CHANGE", 768 SETID "WM_COPY", 769 SETID "LBN_DBLCLICK", 2 SETID "LBN_SELCHANGE", 1 ' Main WINDOW object CREATEDIALOG win,0,0,504,300,0x80C80080|@MINBOX,0,"Keyword File Retriever",&mainwin CONTROL win,@STATIC,"Main Folder to Start Search",10,5,137,14,0x5000010B,11 CONTROL win,@COMBOBOX,"",146,2,347,80,0x50800602,12 CONTROL win,@STATIC,"Text to Search For",10,36,94,13,0x5000010B,13 CONTROL win,@EDIT,"",103,32,200,19,0x50810080,14 CONTROL win,@BUTTON,"Begin Search",395,36,98,27,0x50010000,15 CONTROL win,@STATIC,"Search Words List",10,61,93,14,0x5000010B,16 CONTROL win,@LISTBOX,"1",10,77,188,173,0x50A10140|@CTLISTSTANDARD,17 CONTROL win,@STATIC,"List of Files Found",209,61,611,15,0x5000010B,18 CONTROL win,@LISTBOX,"",209,77,284,173,0x50B10140|@CTLISTNOTIFY,29 CONTROL win,@LISTBOX,"",209,77,284,173,0x50B10140|@CTLISTNOTIFY,19 CONTROL win,@BUTTON,"Show",335,36,48,27,0x50010000,20 CONTROL win,@EDIT,"",10,256,483,19,0x50800880,21 CONTROL win,@BUTTON,"Exit",1,24,21,11,0x40080001,100 ' DIALOG WINDOW FOR Keyword List management CREATEDIALOG d1,0,0,367,184,0x80C00080,0,"Manage Keyword List",&KeywordHandler CONTROL d1,@LISTBOX,"",10,20,160,152,0x50B00142,1 CONTROL d1,@STATIC,"Keywords",10,5,51,14,0x5000010B,2 CONTROL d1,@STATIC,"New Keyword",192,5,70,17,0x5000010B,3 CONTROL d1,@EDIT,"",192,21,165,20,0x50810080,4 CONTROL d1,@BUTTON,"Add New Keyword",192,59,160,25,0x50010001,5 CONTROL d1,@BUTTON,"Delete Selected Keyword",192,104,160,25,0x50010000,6 CONTROL d1,@BUTTON,"Exit",192,149,160,25,0x50010000,7 ' DIALOG WINDOW FOR Search folder management CREATEDIALOG d2,0,0,501,196,0x80C80080,0,"Search Folder Creator",&FolderHandler CONTROL d2,@STATIC,"Search Folder",10,9,72,16,0x5000010B,1 CONTROL d2,@EDIT,"",10,25,377,20,0x50810080,2 CONTROL d2,@STATIC,"Search Folder List",10,51,90,15,0x5000010B,3 CONTROL d2,@LISTBOX,"",10,67,378,118,0x50800140,4 CONTROL d2,@BUTTON,"&Browse",400,25,92,23,0x50010000,5 CONTROL d2,@BUTTON,"Add Folder",400,68,92,23,0x50010001,6 CONTROL d2,@BUTTON,"&Delete Folder",400,105,92,23,0x50010000,7 CONTROL d2,@BUTTON,"E&xit",400,163,92,23,0x50010000,8 'DOMODAL win SHOWDIALOG win WAITUNTIL IsWindowClosed(win) END ' -------------------------------------------------------------------------------------- ' HANDLE MAIN WINDOW EVENTS ' -------------------------------------------------------------------------------------- SUB mainwin(),INT SELECT @MESSAGE CASE @IDCLOSEWINDOW CLOSEDIALOG win CASE @IDMENUPICK SELECT @MENUNUM CASE 4 CLOSEDIALOG win CASE 1 ' Key Words DOMODAL d1 IF (IsKeyChanged = 1) THEN LoadKeyList() CASE 2 ' Folders DOMODAL d2 IF (IsFoldChanged = 1) THEN LoadFolderList() CASE 5 SYSTEM "notepad.exe", GETSTARTPATH + "\\help.txt" ENDSELECT CASE @IDCONTROL IF @CONTROLID = 14 ' Text TO search FOR Edit Box notify = @CODE / 0xFFFF IF notify = @EN_CHANGE FndStr$ = GETCONTROLTEXT(win,14) rec = SENDMESSAGE (win,@LB_FINDSTRING,-1,FndStr$,17) SETSELECTED(win, 17, rec) ENDIF ENDIF IF @CONTROLID = 17 notify = @CODE / 0xFFFF IF notify = @LBN_SELCHANGE ' SELECT Keyword in ListBox ret = GETSELECTED (win, 17) IF(ret <> -1) ' PUT Selected Keyword in Text TO Search FOR Edit Box SETCONTROLTEXT(win, 14, GETSTRING(win, 17, ret)) ENDIF ENDIF IF notify = @LBN_DBLCLICK ' Hide SHOW Button SHOWWINDOW win, @SWHIDE, 20 ' Search Folders and Files ProcessSearch() ENDIF ENDIF IF @CONTROLID = 15 ' Begin Search Button clicked ' Hide SHOW Button SHOWWINDOW win, @SWHIDE, 20 ' Search Folders and Files ProcessSearch() ENDIF IF @CONTROLID = 19 notify = @CODE / 0xFFFF IF notify = @LBN_SELCHANGE ' GET FILE from List of Found Files ret = GETSELECTED (win, 19) IF(ret <> -1) ' Display FILE Path in Edit at Bottom of WINDOW SETCONTROLTEXT (win, 21, GETSTRING(win, 29, ret)) ' Display SHOW Button SHOWWINDOW win, @SWRESTORE, 20 ENDIF ENDIF IF notify = @LBN_DBLCLICK ' show Button Clicked - GET Selected FILE from List of Found Files ret = GETSELECTED (win, 19) IF(ret <> -1) ' SELECT All in 14 - up TO 100 chars long SETFOCUS (win, 14) SENDMESSAGE win,@EM_SETSEL,lo,hi,14 ' Copy TO clipboard SENDMESSAGE win,@WM_COPY,0,0,14 ' Create IBString TO contain Path and FILE Name from Selection made IBString = GETSTRING(win, 29, ret) + GETSTRING(win, 19, ret) ' Run IBasic and open the selected FILE SYSTEM IBString ' Minimise Retriever Program TO Desktop SHOWWINDOW win, @SWMINIMIZED ENDIF ENDIF ENDIF IF @CONTROLID = 20 ' show Button Clicked - GET Selected fiule from List of Found Files ret = GETSELECTED (win, 19) IF(ret <> -1) ' SELECT All in 14 - up TO 100 chars long SETFOCUS (win, 14) SENDMESSAGE win,@EM_SETSEL,lo,hi,14 ' Copy TO clipboard SENDMESSAGE win,@WM_COPY,0,0,14 ' Create IBString TO contain Path and FILE Name from Selection made IBString = GETSTRING(win, 29, ret) + GETSTRING(win, 19, ret) ' Run IBasic and open the selected FILE SYSTEM IBString ' Minimise Retriever Program TO Desktop SHOWWINDOW win, @SWMINIMIZED ENDIF ENDIF CASE @IDINITDIALOG BEGINMENU win MENUTITLE "&File" MENUITEM "&Keywords",0,1 MENUITEM "&Search Folders",0,2 SEPARATOR MENUITEM "&Quit",0,4 ENDMENU BEGININSERTMENU win,1 MENUTITLE "&Help" MENUITEM "&Contents",0,5 ENDMENU SETCONTROLCOLOR win,21,0,RGB(190,190,190) ' Hide the Show Button SHOWWINDOW win, @SWHIDE, 20 ' Hide the path listbox SHOWWINDOW win, @SWHIDE, 29 ' Load Key WORD Search List LoadKeyList() ' Load Search Folder List LoadFolderList() CENTERWINDOW win ' Set 14 TO max length of 100 chars SENDMESSAGE win,@EM_LIMITTEXT,100,0,14 ' set mLong TO selet 100 chars in 14 - note opposite TO MS's Hi Lo ' hi = Start SELECT position - lo = number of chars TO SELECT ? hi = 100 :' ending CHAR pos lo = 0 :' starting CHAR pos ENDSELECT RETURN 0 ENDSUB ' -------------------------------------------------------------------------------------- ' FOLDER - HANDLE DIALOG EVENTS ' -------------------------------------------------------------------------------------- SUB FolderHandler(),INT SELECT @MESSAGE CASE @IDCONTROL SELECT @CONTROLID CASE 5 BrowseFolder() CASE 6 AddFolder() CASE 7 DeleteFolder() CASE 8 SaveFolder() CLOSEDIALOG d2,@IDOK ENDSELECT CASE @IDINITDIALOG CENTERWINDOW d2 IsFoldChanged = 0 LoadFolder() ENDSELECT RETURN 0 ENDSUB ' -------------------------------------------------------------------------------------- SUB LoadFolderList() ' DEF count,x:INT DEF TheFile:STRING DEF buffer:STRING ' Empty Folder Combo ' CLEAR the list box SENDMESSAGE win,@CB_RESETCONTENT,0,0,12 ' Load the Keywords from FILE TheFile = GETSTARTPATH+"Fold.txt" IF (OPENFILE(foldfile,TheFile,"r") = 0) DO IF(READ(foldfile,buffer) = 0) ADDSTRING (win, 12, buffer) ENDIF UNTIL EOF(foldfile) CLOSEFILE foldfile ELSE MessageBeep(0) MESSAGEBOX win, "Search Folder File not opened","File Read Error . . ." ENDIF IsFoldChanged = 0 ENDSUB ' -------------------------------------------------------------------------------------- SUB BrowseFolder() DEF filename,filter,paths:STRING DEF Fnd,pos,loc:INT ' Browse uses the FILEREQUEST TO allow FOR the Main Search Folder TO be selected ' Navigate TO the folder and SELECT any FILE in the Folder. ' Retriever removes the FILE name and uses the Folder. ' ' IF NO FILES in that Folder THEN go TO a SUB Folder under this desired Folder and ' SELECT a FILE - When Path is placed in Search Folder Edit Box simply remove the ' extra SUB Folder TO leave the original Folder ' ' Set Filter filter = "All Files (*.*)|*.*|IBasic Files (*.iwb)|*.iwb||" ' obtain the Path TO the folder and files filename = FILEREQUEST("Select Search Folder",win,1,filter,"txt",0) ' GET path Only Fnd = 1 pos = 1 DO IF (INSTR(filename,"\\",pos) > 0) THEN loc = pos ELSE Fnd = 0 pos++ UNTIL Fnd = 0 'PUT Path in Edit Box FOR Saving Folders paths = LEFT$(filename, loc) SETCONTROLTEXT (d2, 2, paths) ENDSUB ' -------------------------------------------------------------------------------------- SUB AddFolder() DEF buffer:STRING ' GET Text from Edit Box buffer = GETCONTROLTEXT(d2, 2) ' Add Text, IF NOT empty STRING TO ListBox IF(LEN(buffer) > 0) ADDSTRING (d2, 4, buffer) ' CLEAR EditBox SETCONTROLTEXT (d2, 2, "") ' Set IsFoldChanged TO TRUE IsFoldChanged = 1 ENDIF ENDSUB ' -------------------------------------------------------------------------------------- SUB DeleteFolder() DEF sel,count:INT ' GET number of items in ListBox count = GETSTRINGCOUNT (d2, 4) 'GET selected index from listbox IF(count > 0) sel = GETSELECTED (d2, 4) ' DELETE Selected STRING with sel index DELETESTRING (d2, 4, sel) ' Set IsFoldChanged TO TRUE IsFoldChanged = 1 ENDIF ENDSUB ' -------------------------------------------------------------------------------------- SUB SaveFolder() DEF count,x:INT DEF buffer:STRING DEF TheFile:STRING ' Check FOR Changed State of ListBox IF(IsFoldChanged = 1) ' GET number of items in ListBox count = GETSTRINGCOUNT (d2, 4) IF(count > 0) ' Save the Search Folders List TO FILE TheFile = GETSTARTPATH+"Fold.txt" IF (OPENFILE(foldfile,TheFile,"w") = 0) x = 0 DO ' GET line of text from ListBox buffer = GETSTRING(d2, 4, x) WRITE(foldfile,buffer) x = x + 1 UNTIL (x = count) CLOSEFILE foldfile ELSE MessageBeep(0) MESSAGEBOX win, "Search Folder File not Opened","File Open Error . . ." ENDIF ENDIF :' count > 0 ENDIF :' IsFoldChanged = 1 ENDSUB ' -------------------------------------------------------------------------------------- SUB LoadFolder() ' DEF count,x:INT DEF TheFile:STRING DEF buffer:STRING ' Empty Keyword ListBox ' CLEAR the list box SENDMESSAGE d2,@CB_RESETCONTENT,0,0,4 ' Load the Keywords from FILE TheFile = GETSTARTPATH+"Fold.txt" IF (OPENFILE(foldfile,TheFile,"r") = 0) DO IF(READ(foldfile,buffer) = 0) ADDSTRING (d2, 4, buffer) ENDIF UNTIL EOF(foldfile) CLOSEFILE foldfile ELSE MessageBeep(0) MESSAGEBOX win, "Search Folder File not Opened","File Read Error . . ." ENDIF ENDSUB ' -------------------------------------------------------------------------------------- ' KEYWORDS - HANDLE DIALOG EVENTS ' -------------------------------------------------------------------------------------- SUB KeywordHandler(),INT SELECT @MESSAGE CASE @IDCONTROL SELECT @CONTROLID CASE 5 AddKeyword() CASE 6 DeleteKeyword() CASE 7 SaveKeyword() CLOSEDIALOG d1,@IDOK ENDSELECT CASE @IDINITDIALOG CENTERWINDOW d1 IsKeyChanged = 0 LoadKeyword() ENDSELECT RETURN 0 ENDSUB ' -------------------------------------------------------------------------------------- SUB LoadKeyList() ' DEF count,x:INT DEF TheFile:STRING DEF buffer:STRING ' Empty Keyword ListBox ' CLEAR the list box SENDMESSAGE win,@LB_RESETCONTENT,0,0,17 ' Load the Keywords from FILE TheFile = GETSTARTPATH+"Key.txt" IF (OPENFILE(keyfile,TheFile,"r") = 0) DO IF(READ(keyfile,buffer) = 0) ADDSTRING (win, 17, buffer) ENDIF UNTIL EOF(keyfile) CLOSEFILE keyfile ENDIF IsKeyChanged = 0 ENDSUB ' -------------------------------------------------------------------------------------- SUB LoadKeyword() ' DEF count,x:INT DEF TheFile:STRING DEF buffer:STRING ' Empty Keyword ListBox ' CLEAR the list box SENDMESSAGE d1,@LB_RESETCONTENT,0,0,1 ' Load the Keywords from FILE TheFile = GETSTARTPATH+"Key.txt" IF (OPENFILE(keyfile,TheFile,"r") = 0) DO IF(READ(keyfile,buffer) = 0) ADDSTRING (d1, 1, buffer) ENDIF UNTIL EOF(keyfile) CLOSEFILE keyfile ELSE MessageBeep(0) MESSAGEBOX win, "Keyword File not Opened","File Read Error . . ." ENDIF ENDSUB ' -------------------------------------------------------------------------------------- SUB AddKeyword() DEF buffer:STRING ' GET Text from Edit Box buffer = GETCONTROLTEXT(d1, 4) ' Add Text, IF NOT empty STRING TO ListBox IF(LEN(buffer) > 0) ADDSTRING (d1, 1, buffer) ' CLEAR EditBox SETCONTROLTEXT (D1, 4, "") ' Set IsKeyChanged TO TRUE IsKeyChanged = 1 ENDIF SETFOCUS(d1,4) ENDSUB ' -------------------------------------------------------------------------------------- SUB DeleteKeyword() DEF sel,count:INT ' GET number of items in ListBox count = GETSTRINGCOUNT (d1, 1) 'GET selected index from listbox IF(count > 0) sel = GETSELECTED (d1, 1) ' DELETE Selected STRING with sel index DELETESTRING (d1, 1, sel) ' Set IsKeyChanged TO TRUE IsKeyChanged = 1 ENDIF ENDSUB ' -------------------------------------------------------------------------------------- SUB SaveKeyword() DEF count,x:INT DEF buffer:STRING DEF TheFile:STRING ' Check FOR Changed State of ListBox IF(IsKeyChanged = 1) ' GET number of items in ListBox count = GETSTRINGCOUNT (d1, 1) IF(count > 0) ' Save the Keywords TO FILE TheFile = GETSTARTPATH+"key.txt" IF (OPENFILE(keyfile,TheFile,"w") = 0) x = 0 DO ' GET line of text from ListBox buffer = GETSTRING(d1, 1, x) WRITE(keyfile,buffer) x++ UNTIL (x = count) ELSE MessageBeep(0) MESSAGEBOX win, "Keyword File not Opened","File Open Error . . ." ENDIF CLOSEFILE keyfile ENDIF :' count > 0 ENDIF :' IsKeyChanged = 1 ENDSUB ' -------------------------------------------------------------------------------------- ' SEARCH PROCEDURES . . . ' -------------------------------------------------------------------------------------- SUB SearchForFolders() DEF TheFName:STRING DEF DirName:STRING DEF loc, fnd:INT DEF tmpfile:FILE DEF buffer, FindTheText, TxtLine:STRING ' Search FOR SUB Folders hSearch = FINDOPEN(SearchPaths + "*.*") IF (hSearch) DO DirName = FINDNEXT(hSearch) IF (DirName <> ".") & (DirName <> "..") & (DirName <> "") IF (GetFileAttributesA(SearchPaths + DirName) & FILE_ATTRIBUTE_DIRECTORY) ' Go TO the last item in list ' by interating through list UNTIL NULL entry found in node.nxt node = nodes.nxt WHILE node <> NULL node = nodes.nxt ENDWHILE ' Create a NEW item and PUT its address into last node.nxt - found in above node = NEW(list,1) ' Set node POINTER TO address of NEW item nodes.nxt = node ' Add the info TO the NEW Item nodes.rec = nDir nodes.datax = SearchPaths + DirName + "\\" nDir++ ENDIF ENDIF UNTIL DirName = "" FINDCLOSE hSearch ELSE MessageBeep(0) RETURN ENDIF ENDSUB ' -------------------------------------------------------------------------------------- SUB SearchForFiles() DEF TheFName:STRING DEF DirName:STRING DEF loc, fnd:INT DEF tmpfile:FILE DEF buffer, FindTheText, TxtLine:STRING ' ---------------- search Folder FOR *.iba files --------------------- hSearch = FINDOPEN(SearchPaths + FindStr) IF (hSearch) FindTheText = UCASE$(GETCONTROLTEXT(win, 14)) DO TheFName = FINDNEXT(hSearch) ' Open the FILE FOR search FOR the Requested Text in a FILE search ' IF text found add FILE TO List Box fnd = 0 IF(TheFName <> "") IF (OPENFILE(tmpfile,SearchPaths + TheFName, "R") = 0) DO IF(READ(tmpfile,buffer) = 0) IF(LEN(buffer)) TxtLine = UCASE$(buffer) loc = INSTR(TxtLine, FindTheText) IF(loc) THEN fnd = 1 ENDIF ENDIF UNTIL ((EOF(tmpfile)) | (fnd = 1)) IF(fnd) ADDSTRING(win,29,SearchPaths) ADDSTRING(win,19,TheFName) ENDIF CLOSEFILE tmpfile ENDIF ENDIF UNTIL TheFName = "" FINDCLOSE hSearch ENDIF ENDSUB ' -------------------------------------------------------------------------------------- SUB ClearListfiles() DEF x, count:INT ' CLEAR the list box SENDMESSAGE win,@LB_RESETCONTENT,0,0,19 ' CLEAR the list box SENDMESSAGE win,@LB_RESETCONTENT,0,0,29 ENDSUB ' -------------------------------------------------------------------------------------- SUB GetSearchPaths(),INT DEF PathOK, count:INT SearchPaths = GETCONTROLTEXT(win, 12) count = LEN(SearchPaths) IF(count > 0) ' Check SearchPaths FOR '\\' at END IF(RIGHT$(SearchPaths, 1) <> "\\") SearchPaths += "\\" ENDIF ' Set the FILE and Ext TO search FOR FindStr = "*.iwb" ' CXheck IF SearchPaths Folder exists hSearch = FINDOPEN(SearchPaths + "*.*") IF (hSearch) FINDCLOSE hSearch PathOK = 1 ELSE PathOK = 0 MessageBeep(0) MESSAGEBOX win, "Search Folder not Found","Folder Does not Exist - Error . . ." ENDIF ELSE MessageBeep(0) MESSAGEBOX win, "Main Folder to Start Search not Selected","Select Path Error . . ." PathOK = 0 SETFOCUS(win,12) ENDIF RETURN PathOK ENDSUB ' -------------------------------------------------------------------------------------- SUB DeleteLinkList() DEF ref, temp:POINTER ' Set ref POINTER TO first Address in Linked List ref = start.nxt IF(ref) WHILE start.nxt temp = ref ref = start.nxt DELETE temp ENDWHILE ENDIF ' Reset start.NEXT TO 0 (NULL) TO indicate an empty list start.nxt = 0 ' Set node POINTER TO start of empty list node = start ENDSUB ' -------------------------------------------------------------------------------------- SUB ProcessSearch() DEF count:INT DEF PathOK:INT DEF ref:POINTER SETCURSOR (win, @CSWAIT) ' CLEAR List of Files that may have been found from previous Search ClearListFiles() ' GET the Path TO START Search - Check exists PathOK = GetSearchPaths() IF (PathOK) ' Set Beginning of List TO Start - NULL nxt POINTER FOR empty list start.nxt = 0 ' Set POINTER node TO start of List node = start ' Set counters FOR Folders Found and Used nDir = 0 nDirFin = 0 ' Set Go TO LABEL FOR Recursive Calls LABEL procfolder ' CALL SUB TO find Folders SearchForFolders() ' CALL SUB TO find Files SearchForFiles() ' Recursively Search through any SUB Folders that were found ' and find NEW SUB Folders in SUB Folders IF (nDir > 0) ' Set Ref TO the first Address in the Linked List ref = start.nxt ' WHILE number of folders searched are less than Folders and SUB Folders found IF(nDirFin < nDir) ' Check ref FOR NULL - END of Linked List IF(ref) ' MOVE through Linked List UNTIL Folder Number is Located WHILE start.nxt IF (start.rec = nDirFin) ' Found NEXT Folder - GET SearchPaths from Liked List SearchPaths = start.datax ENDIF ' GET NEXT address from Current Object in Linked List ref = start.nxt ENDWHILE ENDIF ' increment nDirFin TO the number of NEXT directory in the Linked List nDirFin++ ' GOTO LABEL TO repeat Folder Search on the SearchPaths obtained from List GOTO procfolder ENDIF ENDIF ' DELETE the Linked List DeleteLinkList() ENDIF ' reset cursor TO DEFAULT SETCURSOR (win, @CSARROW) ENDSUB