Code archives/File Utilities/Search Tool
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Windows search tool that actually works | |||||
Framework maxgui.drivers Import brl.eventqueue Import "search.bmx" Import "PathEdit.bmx" AppTitle="Search Tool" Global window:TGadget=CreateWindow(AppTitle,0,0,600,400,,WINDOW_TITLEBAR|WINDOW_STATUS|WINDOW_RESIZABLE|WINDOW_CENTER) Local panel:TGadget=CreatePanel(0,0,182,400,window) SetGadgetLayout panel,1,0,1,0 Local x:Int=2 Local y:Int=2 Global Gadget_Token:TGadget Global Gadget_Folder:TGadget Global Gadget_Extensions:TGadget Global Gadget_Search:TGadget Global Gadget_Results:TGadget Global Gadget_Recursive:TGadget Global Gadget_Contents:TGadget Global Gadget_CaseSensitive:TGadget CreateLabel("Search for:",x,y,120,16,panel) y:+16 Gadget_Token=CreateTextField(x,y,180,18,panel) y:+22 ActivateGadget Gadget_Token CreateLabel("File extensions:",x,y,180,16,panel) y:+16 Gadget_Extensions=CreateTextField(x,y,180,18,panel) y:+22 CreateLabel("In folder:",x,y,180,16,panel) y:+16 Gadget_Folder=CreatePathEdit(x,y,180,18,panel,PATHEDIT_DIR|PATHEDIT_READONLY) y:+22 Gadget_Recursive=CreateButton("Search subfolders",x,y,180,18,panel,BUTTON_CHECKBOX) SetButtonState Gadget_Recursive,1 y:+22 Gadget_Contents=CreateButton("Search file contents",x,y,180,18,panel,BUTTON_CHECKBOX) y:+22 Gadget_CaseSensitive=CreateButton("Case-sensitive",x,y,180,18,panel,BUTTON_CHECKBOX) y:+22 Gadget_Search=CreateButton("Search",x,y,180,26,panel,BUTTON_OK) y=2 Gadget_Results=CreateListBox(x+180,y,window.ClientWidth()-x-(x+180),window.ClientHeight()-2*y,window) SetGadgetLayout Gadget_Results,1,1,1,1 'SearchFolder:String[](path:String,token:String,extensions:String[]=Null,options:Int=SEARCH_RECURSIVE,results:String[]=Null) Global popupmenu:TGadget=CreateMenu("",0,Null) CreateMenu("Open file",0,popupmenu) CreateMenu("Open containing folder",0,popupmenu) Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_MENUACTION Select String(GadgetText(TGadget(EventSource()))) Case "Open file" OpenURL String(EventExtra()) Case "Open containing folder" OpenURL ExtractDir(String(EventExtra())) EndSelect Case EVENT_GADGETMENU Select EventSource() Case Gadget_Results PopupWindowMenu window,popupmenu,GadgetItemExtra(Gadget_results,EventData()) EndSelect Case EVENT_GADGETACTION Select EventSource() Case Gadget_Results OpenURL String(GadgetItemExtra(Gadget_results,EventData())) Case Gadget_Search Local results:String[] Local path:String Local token:String Local extensions:String[] Local options:Int Local n:Int ClearGadgetItems(Gadget_Results) If ButtonState(Gadget_Recursive) options=options|SEARCH_RECURSIVE If ButtonState(Gadget_Contents) options=options|SEARCH_CONTENTS If ButtonState(Gadget_CaseSensitive) options=options|SEARCH_CASESENSITIVE path=GadgetText(Gadget_Folder) token=GadgetText(Gadget_Token) extensions=GadgetText(Gadget_Extensions).split(",") For n=0 To extensions.length-1 extensions[n]=extensions[n].Trim() Next If extensions.length=1 If extensions[0]="" extensions=Null EndIf SetStatusText window,"Searching..." results=SearchFolder(path,token,extensions,options) SetStatusText window,results.length+" files found" For n=0 To results.length-1 AddGadgetItem Gadget_Results,StripDir(results[n]),0,-1,results[n],results[n] Next ActivateGadget Gadget_Results EndSelect EndSelect Forever |
Comments
| ||
PathEdit.bmx:SuperStrict Import MaxGui.Drivers Import brl.retro Import "FileRequester.bmx" Rem Local window:TGadget window=CreateWindow("pathedit Example",40,40,320,240) Local label:TGadget Local pathedit:TPathEdit Local x:Int=4,y:Int=4 label=CreateLabel("Pick File:",x,y,60,18,window) SetGadgetLayout label,1,0,1,0 pathedit=CreatePathEdit(x+60,y,200,20,window,PATHEDIT_FILE|PATHEDIT_STRIPDIR|PATHEDIT_CHOICES) SetGadgetLayout pathedit,1,1,1,0 While True WaitEvent Print CurrentEvent.ToString() Select EventID() Case EVENT_WINDOWCLOSE End End Select Wend EndRem '------------------------------------------------------------------- Const PATHEDIT_FILE:Int=0 Const PATHEDIT_DIR:Int=1 Const PATHEDIT_STRIPDIR:Int=2 Const PATHEDIT_CHOICES:Int=4 Const PATHEDIT_READONLY:Int=8 Type TPathEdit Extends TProxygadget Field panel:TGadget Field textfield:TGadget Field button:TGadget Field style:Int Field extensions:String="All Files:*" Field value:String Field choices:TMap Field folder:String Method Cleanup() RemoveHook(EmitEventHook,EventHook,Self) Super.cleanup() EndMethod Method InsertItem:Int(index%,text$,tip$,icon%,extra:Object,flags%) Return textfield.InsertItem(index,text,tip,icon,extra,flags) EndMethod Method GetText$() Return textfield.GetText() EndMethod Method SetText:Int(text$) If PATHEDIT_CHOICES & style If Not choices choices=New TMap EndIf If Not choices.valueforkey(text) choices.insert(text,text) ClearGadgetItems(textfield) For Local key:String=EachIn choices.keys() AddGadgetItem(textfield,key) Next EndIf EndIf value=text Return textfield.SetText(text) EndMethod Method SetTextColor(r:Int,g:Int,b:Int) Local gadget:TGadget Super.SetTextColor(r,g,b) textfield.SetTextColor(r,g,b) button.SetTextColor(r,g,b) EndMethod Method SetColor(r:Int,g:Int,b:Int) Local gadget:TGadget Super.SetColor(r,g,b) textfield.SetColor(r,g,b) button.SetColor(r,g,b) EndMethod Function Create:TPathEdit(x:Int,y:Int,width:Int,height:Int,group:TGadget,style:Int=0) Local pathedit:TPathEdit pathedit=New TPathEdit pathedit.panel=CreatePanel(x,y,width,height,group) If PATHEDIT_CHOICES & style If PATHEDIT_READONLY & style pathedit.textfield=CreateComboBox(0,0,pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel) Else pathedit.textfield=CreateComboBox(0,0,pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel,COMBOBOX_EDITABLE) EndIf ?win32 SendMessageA(QueryGadget(pathedit.textfield,QUERY_HWND),CB_SETITEMHEIGHT,-1,height); ? Else pathedit.textfield=CreateTextField(0,0,pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel) EndIf SetGadgetLayout pathedit.textfield,1,1,1,1 pathedit.style=style pathedit.button=CreateButton("...",pathedit.panel.ClientWidth()-pathedit.panel.ClientHeight(),0,pathedit.panel.ClientHeight(),pathedit.panel.ClientHeight(),pathedit.panel) SetGadgetLayout pathedit.button,0,1,1,1 pathedit.setproxy(pathedit.panel) SetGadgetFilter(pathedit.textfield,Filter,pathedit) AddHook(EmitEventHook,EventHook,pathedit) Return pathedit EndFunction Function Filter:Int(event:TEvent,context:Object) Local pathedit:TPathEdit=TPathEdit(context) If PATHEDIT_READONLY & pathedit.style Return 0 Else Return 1 EndIf EndFunction Function EventHook:Object(id:Int,data:Object,context:Object) Local event:TEvent Local pathedit:TPathEdit event=TEvent(data) If event pathedit=TPathEdit(context) If pathedit Select event.id Case EVENT_GADGETLOSTFOCUS If event.source=pathedit.textfield Local text$ text=GadgetText(pathedit.textfield) If text<>pathedit.value pathedit.value=text EmitEvent CreateEvent(EVENT_GADGETACTION,pathedit,0,0,0,0,text) EndIf Return Null EndIf Case EVENT_GADGETACTION Select event.source Case pathedit.textfield 'If PATHEDIT_CHOICES And pathedit.style ' Local text:String ' text=GadgetText(pathedit.textfield) ' If text<>pathedit.value ' pathedit.value=text ' EmitEvent CreateEvent(EVENT_GADGETACTION,pathedit,0,0,0,0,text) ' EndIf 'EndIf Return Null Case pathedit.button Local file:String If PATHEDIT_DIR & pathedit.style file=RequestDir("Select Folder",GadgetText(pathedit.textfield)) Else file=GadgetText(pathedit.textfield) If file="" If pathedit.folder file=pathedit.folder+"\" EndIf Else If PATHEDIT_STRIPDIR & pathedit.style file=pathedit.folder+"\"+file EndIf EndIf file=RequestFile("Open File",pathedit.extensions,0,file) If file pathedit.folder=ExtractDir(file) EndIf If PATHEDIT_STRIPDIR & pathedit.style file=StripDir(file) EndIf EndIf If file If file<>pathedit.value pathedit.value=file SetGadgetText pathedit,file EmitEvent CreateEvent(EVENT_GADGETACTION,pathedit,0,0,0,0,file) EndIf EndIf Return Null EndSelect EndSelect EndIf EndIf Return data EndFunction EndType Rem bbdoc: EndRem Function CreatePathEdit:TPathEdit(x:Int,y:Int,width:Int,height:Int,group:TGadget,flags:Int=0) Return Tpathedit.Create(x,y,width,height,group,flags) EndFunction Rem bbdoc: EndRem Function SetPathEditExtensions(pathedit:TPathEdit,extensions:String) pathedit.extensions=extensions EndFunction |
| ||
search.bmx:SuperStrict Import brl.filesystem 'Import brl.standardio Rem Local file:String Local results:String[] results=SearchFolder(AppDir,"GCStackTop",["bmx"],SEARCH_RECURSIVE|SEARCH_CONTENTS) If results Print results.length+" search results found:" For file=EachIn results Print file Next EndIf EndRem Const SEARCH_RECURSIVE:Int=1 Const SEARCH_CONTENTS:Int=2 Const SEARCH_CASESENSITIVE:Int=4 Function SearchFolder:String[](path:String,token:String,extensions:String[]=Null,options:Int=SEARCH_RECURSIVE,results:String[]=Null) Local dir:String[],ext:String,n:Int,i:Int If path.Trim()="" path=CurrentDir() dir=LoadDir(path) If Not dir Return results If Not results results=New String[0] For n=0 To dir.length-1 Select FileType(path+"/"+dir[n]) Case 1 If extensions ext=ExtractExt(dir[n]) If Not (SEARCH_CASESENSITIVE & options) ext=ext.tolower() EndIf For i=0 To extensions.length-1 If extensions[i]=ext If SearchFile(path+"/"+dir[n],token,options) results=results[..results.length+1] results[results.length-1]=path+"/"+dir[n] EndIf Exit EndIf Next Else If SearchFile(path+"/"+dir[n],token,options) results=results[..results.length+1] results[results.length-1]=path+"/"+dir[n] EndIf EndIf Case 2 If (SEARCH_RECURSIVE & options) results=SearchFolder(path+"/"+dir[n],token,extensions,options,results) EndIf 'If Not (SEARCH_CONTENTS & options) If Not extensions If SearchFile(path+"/"+dir[n],token,options) results=results[..results.length+1] results[results.length-1]=path+"/"+dir[n] EndIf EndIf EndSelect Next Return results EndFunction Function SearchFile:Int(path:String,token:String,options:Int=0) Local stream:TStream,s:String Local spath:String If Not (SEARCH_CASESENSITIVE & options) token=token.tolower() EndIf spath=path If Not (SEARCH_CASESENSITIVE & options) spath=spath.tolower() EndIf spath=StripAll(spath) If spath.contains(token) Return True If (SEARCH_CONTENTS & options) stream=ReadFile(path) If Not stream Return False While Not stream.Eof() s=stream.ReadLine() If Not (SEARCH_CASESENSITIVE & options) s=s.tolower() EndIf If s.contains(token) stream.close() Return True EndIf Wend stream.close() 'Else ' If Not (SEARCH_CASESENSITIVE & options) ' path=path.tolower() ' EndIf ' path=StripDir(path) ' If path.contains(token) Return True EndIf Return False EndFunction |
| ||
FileRequester:Strict Import brl.system Import brl.standardio Import pub.win32 Import maxgui.maxgui Private Extern "win32" Function GetOpenFileNameA:Int(of:Byte Ptr) Function GetSaveFileNameA:Int(of:Byte Ptr) Function CommDlgExtendedError:Int() Function GetDlgItem(hDlg:Int,nIDDlgItem:Int) Function GetParent:Int(hwnd:Int) Function SetWindowTextA(hwnd:Int,text$z) EndExtern Public 'requestfileex("Open file") 'GCCollect() 'End '-------------------------------------------------- 'Examples '-------------------------------------------------- Rem 'Print RequestFile("Open Sesame","All Files:*;My File Format (*.mff):mff;Windows Bitmap (*.bmp):bmp",0,"c:/") Print RequestFileEx("Open Sesame","All Files:*;My File Format (*.mff):mff;Windows Bitmap (*.bmp):bmp",1,"c:/",Null,Hook,"&Options") Function Hook() Notify "Your stuff goes here." EndFunction EndRem '-------------------------------------------------- ' '-------------------------------------------------- Rem '======================================================================= 'Original unmolested version used for testing '======================================================================= Function RequestFile$(text$,exts$="",save_flag=False,path$="") Local result Local of:OPENFILENAME Local file$,dir$ 'Fix path path=path.Replace( "/","\" ) Local i=path.FindLast( "\" ) If i<>-1 dir=path[..i] file=path[i+1..] Else file=path EndIf 'Calculate extension string Local ext$,defext,p,q p=path.Find(".") If (p>-1) ext=","+path[p+1..].toLower()+"," Local exs$=exts.toLower() exs=exs.Replace(":",":,") exs=exs.Replace(";",",;") p=exs.find(ext) If p>-1 Local q=-1 defext=1 While True q=exs.find(";",q+1) If q>p Exit If q=-1 defext=0;Exit defext:+1 Wend EndIf EndIf If exts If exts.Find(":")=-1 exts="Files~0*."+exts Else exts=exts.Replace(":","~0*.") EndIf exts=exts.Replace(";","~0") exts=exts.Replace(",",";*.")+"~0" EndIf of=New OPENFILENAME of.lpstrTitle=text.tocstring() of.lpstrInitialDir=dir.tocstring() of.lpstrFilter=exts.tocstring() 'Flags of.Flags=OFN_HIDEREADONLY|OFN_NOCHANGEDIR If save_flag of.lpstrDefExt=of.lpstrFilter of.Flags:|OFN_OVERWRITEPROMPT Else of.Flags:|OFN_FILEMUSTEXIST EndIf 'Return string array Local lpstrFile:Byte[4096] of.lpstrFile=lpstrFile of.nMaxFile=4095 Local cs:Byte Ptr cs=file.tocstring() MemCopy lpstrFile,cs,file.length MemFree cs If save_flag result=GetSaveFileNameA(of) Else result=GetOpenFileNameA(of) EndIf MemFree of.lpstrTitle MemFree of.lpstrInitialDir MemFree of.lpstrFilter If result Return String.FromCString(lpstrFile) EndFunction '======================================================================= ' '======================================================================= EndRem '======================================================================= 'Whored out version '======================================================================= Function RequestFile$(text$,exts$="",save_flag=False,path$="",owner:TGadget=Null,hook()=Null,helpbuttontext$="Help") Rem Local parent:TGadget Local s:String parent=owner While parent DisableGadget(parent) parent=GadgetGroup(parent) Wend s=RequestFile(text,exts,save_flag,path) parent=owner While parent EnableGadget(parent) parent=GadgetGroup(parent) Wend If owner ActivateGadget(owner) Return s EndRem Local result Local of:OPENFILENAME Local file:String,dir:String Local parent:TGadget owner=GadgetWindow(ActiveGadget()) parent=owner If parent For Local gadget:TGadget=EachIn parent.kids If GadgetClass(gadget)=GADGET_WINDOW DisableGadget gadget Next EndIf While parent DisableGadget(parent) parent=GadgetGroup(parent) Wend 'Fix path path=path.Replace( "/","\" ) Local i=path.FindLast( "\" ) If i<>-1 dir=path[..i] file=path[i+1..] Else file=path EndIf 'Calculate extension string Local ext$,defext,p,q p=path.Find(".") If (p>-1) ext=","+path[p+1..].toLower()+"," Local exs$=exts.toLower() exs=exs.Replace(":",":,") exs=exs.Replace(";",",;") p=exs.find(ext) If p>-1 Local q=-1 defext=1 While True q=exs.find(";",q+1) If q>p Exit If q=-1 defext=0;Exit defext:+1 Wend EndIf EndIf If exts If exts.Find(":")=-1 exts="Files~0*."+exts Else exts=exts.Replace(":","~0*.") EndIf exts=exts.Replace(";","~0") exts=exts.Replace(",",";*.")+"~0" EndIf of=New OPENFILENAME of.lpstrTitle=text.tocstring() of.lpstrInitialDir=dir.tocstring() of.lpstrFilter=exts.tocstring() If owner of.hwndowner=QueryGadget(owner,QUERY_HWND) EndIf 'Flags of.Flags=OFN_HIDEREADONLY|OFN_NOCHANGEDIR If save_flag of.lpstrDefExt=of.lpstrFilter of.Flags:|OFN_OVERWRITEPROMPT Else of.Flags:|OFN_FILEMUSTEXIST EndIf 'Add hook If hook RequestFileHook=hook RequestFileHelpButtonText=helpbuttontext of.lpfnHook=lpfnHook of.Flags:|OFN_EXPLORER|OFN_ENABLEHOOK|OFN_SHOWHELP EndIf 'Return string array Local lpstrFile:Byte[4096] Local cs:Byte Ptr If file cs=file.tocstring() MemCopy lpstrFile,cs,file.length EndIf of.lpstrFile=lpstrFile of.nMaxFile=4095 If save_flag result=GetSaveFileNameA(of) Else result=GetOpenFileNameA(of) EndIf If result file=String.FromCString(lpstrFile) Else file="" EndIf MemFree cs MemFree of.lpstrTitle MemFree of.lpstrInitialDir MemFree of.lpstrFilter parent=owner For Local gadget:TGadget=EachIn parent.kids If GadgetClass(gadget)=GADGET_WINDOW EnableGadget gadget Next While parent EnableGadget(parent) parent=GadgetGroup(parent) Wend If owner ActivateGadget(owner) Return file EndFunction Private Function GadgetWindow:TGadget(gadget:TGadget) While gadget If GadgetClass(gadget)=GADGET_WINDOW Return gadget gadget=GadgetGroup(gadget) Wend Return Null EndFunction Public '======================================================================= ' ****ing Windows Madness '======================================================================= Private Global RequestFileHook() Global RequestFileHelpButtonText$ Function lpfnHook:Int(hwnd:Int,uMsg:Int,lp:Int,pData:Byte Ptr) "win32" Local hdlg:Int Const CDN_HELP=-605 Select uMsg Case WM_INITDIALOG hdlg=GetDlgItem(GetParent(hwnd),$040e) SetWindowTextA(hdlg,RequestFileHelpButtonText) Case WM_NOTIFY If pData<>Null Local o:OFNOTIFY=New OFNOTIFY MemCopy Varptr o.hwndFrom,pData,12 If o.code=CDN_HELP hwnd=GetParent(hwnd) EnableWindow(hwnd,0) RequestFileHook() EnableWindow hwnd,1 SetFocus hwnd EndIf EndIf EndSelect Return 0 EndFunction Type NMHDR Field hwndFrom:Int Field idFrom:Int Field code:Int EndType Type OFNOTIFY Extends NMHDR Field lpOFN:Byte Ptr Field pszFile:Byte Ptr EndType Const OFN_READONLY =$00000001 Const OFN_OVERWRITEPROMPT =$00000002 Const OFN_HIDEREADONLY =$00000004 Const OFN_NOCHANGEDIR =$00000008 Const OFN_SHOWHELP =$00000010 Const OFN_ENABLEHOOK =$00000020 Const OFN_ENABLETEMPLATE =$00000040 Const OFN_ENABLETEMPLATEHANDLE =$00000080 Const OFN_NOVALIDATE =$00000100 Const OFN_ALLOWMULTISELECT =$00000200 Const OFN_EXTENSIONDIFFERENT =$00000400 Const OFN_PATHMUSTEXIST =$00000800 Const OFN_FILEMUSTEXIST =$00001000 Const OFN_CREATEPROMPT =$00002000 Const OFN_SHAREAWARE =$00004000 Const OFN_NOREADONLYRETURN =$00008000 Const OFN_NOTESTFILECREATE =$00010000 Const OFN_NONETWORKBUTTON =$00020000 Const OFN_NOLONGNAMES =$00040000 Const OFN_EXPLORER =$00080000 Const OFN_NODEREFERENCELINKS =$00100000 Const OFN_LONGNAMES =$00200000 Const CDERR_DIALOGFAILURE =$FFFF Const CDERR_FINDRESFAILURE =$0006 Const CDERR_INITIALIZATION =$0002 Const CDERR_LOADRESFAILURE =$0007 Const CDERR_LOADSTRFAILURE =$0005 Const CDERR_LOCKRESFAILURE =$0008 Const CDERR_MEMALLOCFAILURE =$0009 Const CDERR_MEMLOCKFAILURE =$000A Const CDERR_NOHINSTANCE =$0004 Const CDERR_NOHOOK =$000B Const CDERR_NOTEMPLATE =$0003 Const CDERR_REGISTERMSGFAIL =$000C Const CDERR_STRUCTSIZE =$0001 Const FNERR_BUFFERTOOSMALL =$3003 Const FNERR_INVALIDFILENAME =$3002 Const FNERR_SUBCLASSFAILURE =$3001 Type OPENFILENAME Field lStructSize:Int=88 Field hwndOwner:Int Field hInstance:Int=0 Field lpstrFilter:Byte Ptr' File filter Field lpstrCustomFilter:Byte Ptr Field nMaxCustFilter:Int=0 Field nFilterIndex:Int=0 Field lpstrFile:Byte Ptr Field nMaxFile:Int Field lpstrFileTitle:Byte Ptr'[4096] Field nMaxFileTitle=4095 Field lpstrInitialDir:Byte Ptr'start directory Field lpstrTitle:Byte Ptr' Dialog title Field Flags:Int=0 Field nFileOffset:Short Field nFileExtension:Short Field lpstrDefExt:Byte Ptr Field lCustData:Int Field lpfnHook:Byte Ptr=Null' Callback function Field lpTemplateName:Byte Ptr Field pvReserved:Byte Ptr' not sure if from here on is needed Field dwReserved:Int Field FlagsEx:Int EndType Public 'C++ stuff: Rem typedef struct tagOFN { DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCTSTR lpstrFilter; LPTSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPTSTR lpstrFile; DWORD nMaxFile; LPTSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCTSTR lpstrInitialDir; LPCTSTR lpstrTitle; DWORD Flags; WORD nFileOffset; WORD nFileExtension; LPCTSTR lpstrDefExt; LPARAM lCustData; LPOFNHOOKPROC lpfnHook; LPCTSTR lpTemplateName; #If (_WIN32_WINNT >= =$0500) void * pvReserved; DWORD dwReserved; DWORD FlagsEx; #EndIf ' (_WIN32_WINNT >= =$0500) } OPENFILENAME, *LPOPENFILENAME; EndRem |
Code Archives Forum