Index: stringscan.rb ================================================================== --- stringscan.rb +++ stringscan.rb @@ -14,359 +14,346 @@ require 'tkextlib/tkimg' $platform = Tk.windowingsystem if $platform == 'aqua' - TkPackage.require('windowlist') - TkPackage.require('fullscreen') - require 'tk/tk_mac' + TkPackage.require('windowlist') + TkPackage.require('fullscreen') + require 'tk/tk_mac' end TkPackage.require('regproc') TkPackage.require('machelp') TkPackage.require('softwareupdate') TkPackage.require('xplat') if $platform == 'aqua' - $accelkey = 'Command' + $accelkey = 'Command' else - $accelkey = 'Control' + $accelkey = 'Control' end class StringscanApp -#here we initialize our app class -def initialize - - $dirname = "" - $searchterm = "" - $appname = 'Stringscan' - $appversion = '1.0' - Tk.tk_call('machelp::setAppName', $appname, $appversion) - Tk.tk_call('softwareupdate::setAppName', $appname) - Tk.tk_call('softwareupdate::setVersion', $appname, $appversion) - - bgerror = Tk.install_cmd(proc{ - |*args| - puts args - }) - Tk.ip_eval("proc bgerror {args} {#{bgerror} $args}") - - if $platform == 'aqua' - ##map ruby proc to "odoc" Apple Event - setDir = Tk.install_cmd(proc{ - |*args| - filename=(args[0]).delete('{}') - begin - if File.directory?(filename) - $tbox.configure('state'=>'normal') - $tbox.delete('1.0', 'end') - $tbox.configure('state'=>'disabled') - $lbox.delete(0, 'end') - $dirname = filename - $direntry.value = filename - end - rescue - raise - end - }) - Tk.ip_eval("proc ::tk::mac::OpenDocument {args} {#{setDir} $args}") - Tk.ip_eval("proc ::tk::mac::ShowHelp {} {#{Tk.install_cmd(proc{showHelp})}}") - end - drawgui - Tk.tk_call('regproc::readLic', $appname, $appversion) -end - -#core method; here we search for a string in text files within a directory and display a list of matching files in the listbox -def stringgrep + #here we initialize our app class + def initialize + + $dirname = "" + $searchterm = "" + $appname = 'Stringscan' + $appversion = '1.0' + Tk.tk_call('machelp::setAppName', $appname, $appversion) + Tk.tk_call('softwareupdate::setAppName', $appname) + Tk.tk_call('softwareupdate::setVersion', $appname, $appversion) + + bgerror = Tk.install_cmd(proc{ + |*args| + puts args + }) + Tk.ip_eval("proc bgerror {args} {#{bgerror} $args}") + + if $platform == 'aqua' + ##map ruby proc to "odoc" Apple Event + setDir = Tk.install_cmd(proc{ + |*args| + filename=(args[0]).delete('{}') + begin + if File.directory?(filename) + $tbox.configure('state'=>'normal') + $tbox.delete('1.0', 'end') + $tbox.configure('state'=>'disabled') + $lbox.delete(0, 'end') + $dirname = filename + $direntry.value = filename + end + rescue + raise + end + }) + Tk.ip_eval("proc ::tk::mac::OpenDocument {args} {#{setDir} $args}") + Tk.ip_eval("proc ::tk::mac::ShowHelp {} {#{Tk.install_cmd(proc{showHelp})}}") + end + drawgui + Tk.tk_call('regproc::readLic', $appname, $appversion) + end + + #core method; here we search for a string in text files within a directory and display a list of matching files in the listbox + def stringgrep $root.update - $file_list = [] - $grep_list = [] + $file_list = [] + $grep_list = [] $p.start $bottomlabel.configure('text' => "Searching for \"#{$searchterm}\" in #{$dirname}") - $lbox.delete(0, 'end') + $lbox.delete(0, 'end') $root.update - Find.find("#{$dirname}") do |path| - $file_list << path unless FileTest.directory?(path) - end - for i in $file_list - begin - #we are only reading text files here, not binary. - text = MIME::Types.type_for(i).first.to_s - type = text.split('/')[0] - if type =~ /text/ - f = File.open(i, "r:iso-8859-1:utf-8") - result = f.read - if result =~ /#{$searchterm}/ then - $lbox.insert('end', "#{i}") - f.close - end - end - rescue - #puts "Search term not found.\n" - end + Find.find("#{$dirname}") do |path| + $file_list << path unless FileTest.directory?(path) + end + for i in $file_list + begin + #we are only reading text files here, not binary. + text = MIME::Types.type_for(i).first.to_s + type = text.split('/')[0] + if type =~ /text/ + f = File.open(i, "r:iso-8859-1:utf-8") + result = f.read + if result =~ /#{$searchterm}/ then + $lbox.insert('end', "#{i}") + f.close + end + end + rescue + #puts "Search term not found.\n" + end $p.stop $grep_list = $lbox.get(0, 'end') num = $grep_list.count.to_s $bottomlabel.configure('text' => "Found #{num} matches for \"#{$searchterm}\" in #{$dirname}") -end + end rescue -puts "Directory not found.\n" -puts "Search complete.\n" + puts "Directory not found.\n" + puts "Search complete.\n" end def drawgui - begin - Tk.ip_eval("console hide") - rescue - puts "could not hide console.\n" - end - - #image data - $folderdata = 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAADFBMVEUEBwcEBwcEBwcEBwcNzGmPAAAAAXRSTlMAQObYZgAAAC1JREFUeAFjYEYABgQgXRhCowAyhNEAfmFMQFiYsJX0F6aa5xmxiTIygMQxRQEtWAMvBVlMnAAAAABJRU5ErkJggg==' - - $glassdata = 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AcSAg8sJGRWZAAAAXhJREFUOMutlL9LQlEUxz+WGRHllGNEPyAUWnLWsVYhXNpd+ldC6B/QPyDnoMXNtbnFIRAarLAn+bDU13IuHC/vPm/agQuXy/d93veec+4Bv9gGKkAbGAORrAHQBPLAOn+MAtBVMNdqARlfaEk+minAJ/AOvAEjC973gWeAnvpoCNSAfWAX2AKKQN36eWtRWhoK+grkErRXlvO8S7hjuah6pK2uwE2X6BKYiujFsx5FlfPBmkO0B6Rkf+8JfgZC2Wdd4EjtNzzBcwVzgccKfuIJzgJp2X+7RIfAjyrGkQe4pvTtpIcxUcLOgt7MSZ8bfcUFDWOebMfhvCp9btqzK7NlLspW/36ptjPrAbgDbqUVbQOFOKh++wFwLfCk4WNM9OS2scPGrA/gQODmbCIFnQpspm7TsIdPWqCPIkgJ9AZ4Uk97DFyIq3NgU7R9yf0wrliB5fZMxqI+K7FEnIpLe+5GkvMyK8SxoyArQTXcOA+XvX5SWoL/gP4Cdj2n/+OJ36AAAAAASUVORK5CYII=' - - $folderimage = TkPhotoImage.new(:data => $folderdata) - $glassimage = TkPhotoImage.new(:data => $glassdata) - - $icondata = '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' - $icon = TkPhotoImage.new(:data => $icondata) - - #initialize variables for entry - $dirname = TkVariable.new - $searchterm = TkVariable.new - - #top window and frame - Tk::TkDND::DND - $root = TkRoot.new { - title "Stringscan" - } - - $root.iconphoto_default($icon) - - if $platform == 'aqua' - Tk.tk_call('fullscreen::fullscreen', $root) - end - - #menu - $menubar = TkMenu.new($root) - TkOption.add '*tearOff', 0 - if $platform == 'aqua' - $appmenu = TkSysMenu_Apple.new($menubar) - $menubar.add :cascade, :menu => $appmenu - $appmenu.add :command, :label => 'About Stringscan', :command=> proc{aboutWindow} - $appmenu.add :command, :label => 'License', :command=>proc{getReg} - $appmenu.add :command, :label=>'Check for Updates', :command=>proc{checkUpdate} - $appmenu.add :separator - end - $searchmenu = TkMenu.new($menubar) - $menubar.add :cascade, :menu => $searchmenu, :label => 'Search' - $searchmenu.add :command, :label => 'Choose Directory...', 'accelerator' => "#{$accelkey}+O", :command => proc{choosedir} - $searchmenu.add :command, :label => 'Run Search', 'accelerator' => "#{$accelkey}+R", :command => proc{stringgrep} - if $platform == 'win32' - $searchmenu.add :command, :label => "Exit", :command=>proc{exit}, 'accelerator' => "#{$accelkey}+Q" - end - if $platform == 'aqua' - Tk.tk_call("windowlist::windowMenu", $menubar) - end - $helpmenu = TkSysMenu_Help.new($menubar) - $menubar.add :cascade, :menu => $helpmenu, :label => 'Help' - if $platform != 'aqua' - $helpmenu.add :command, :label=>'Stringscan Help', :command=>proc{ - Tk.tk_call('machelp::userhelp') - } - end - $helpmenu.add :command, :label=>'Contact Code by Kevin', :command=>proc{ - Tk.tk_call('xplat::launch', 'mailto:kw@codebykevin.com?subject=Stringscan') - } - $helpmenu.add :command, :label=>'Web Site', :command=>proc{ - Tk.tk_call('xplat::launch', 'https://www.codebykevin.com/stringscan.html') - } - - if $platform != 'aqua' - $helpmenu.add :command, :label => 'About Stringscan', :command=> proc{aboutWindow} - $helpmenu.add :command, :label => 'License', :command=>proc{getReg} - $helpmenu.add :command, :label=>'Check for Updates', :command=>proc{checkUpdate} - end - $root['menu'] = $menubar - $mainframe = Tk::Tile::Frame.new($root).pack('side' => 'top','fill' => 'both','expand' => 'yes') - - #button frame and buttons - $buttonframe = Tk::Tile::Frame.new($mainframe){padding 2}.pack('side' => 'top','fill' => 'both','expand' => 'no') - choosedirproc = proc{choosedir} - $choosebutton = Tk::Tile::Button.new($buttonframe) { - image $folderimage - takefocus 0 - padding 5 - command choosedirproc - }.pack('side' => 'left','fill' => 'both','expand' => 'no') - Tk::RbWidget::BalloonHelp.new($choosebutton, 'text'=>'Select Directory', 'background'=>'lightyellow', 'relief'=>'solid', 'borderwidth'=>1) - stringgrepProc = proc {stringgrep} - $runbutton = Tk::Tile::Button.new($buttonframe) { - image $glassimage - takefocus 0 - padding 5 - command stringgrepProc - }.pack('side' => 'left','fill' => 'both','expand' => 'no') - Tk::RbWidget::BalloonHelp.new($runbutton, 'text'=>'Run Search', 'background'=>'lightyellow', 'relief'=>'solid', 'borderwidth'=>1) - $sep = Tk::Tile::Separator.new($mainframe) { orient 'horizontal' }.pack('side'=> 'top', 'fill'=>'both') - - #labels and entries - $topframe = Tk::Tile::Frame.new($mainframe){padding 5}.pack('side' => 'top','fill' => 'both','expand' => 'no') - $chooselabel = Tk::Tile::Label.new($topframe) {text "Directory:"}.pack('side' => 'left','fill' => 'both','expand' => 'no') - $direntry = Tk::Tile::Entry.new($topframe) {textvariable $dirname }.pack('side' => 'left','fill' => 'both','expand' => 'no') - $termlabel = Tk::Tile::Label.new($topframe) {text "Search Term:"}.pack('side' => 'left','fill' => 'both','expand' => 'no') - $termentry = Tk::Tile::Entry.new($topframe) {textvariable $searchterm}.pack('side' => 'left','fill' => 'both','expand' => 'no') - $termentry.bind('Return', proc {stringgrep}) - $nextsep = Tk::Tile::Separator.new($mainframe) {orient 'horizontal'}.pack('side'=>'top', 'fill'=>'both') - - #listbox, textbox, scrollbars - $bottomframe = Tk::Frame.new($mainframe).pack('side'=>'bottom','fill' => 'both', 'expand' => 'yes') - $bottomleftframe = Tk::Tile::Frame.new($bottomframe).pack('side'=>'left','fill' => 'both', 'expand' => 'yes') - $listlabel = Tk::Tile::Label.new($bottomleftframe) { - text 'File Name' - style 'TablelistHeader.TLabel' - padding 1 - }.pack('side'=>'top', 'fill'=>'both', 'expand' => 'no') - $lbox = Tk::Listbox.new($bottomleftframe){ - width 50 - height 30 - borderwidth 0 - takefocus 0 - activestyle "none" - exportselection 0 - selectbackground "RoyalBlue1" - selectforeground "white" - dnd_bindtarget('text/uri-list', '', '%D') {|d| - filename=d.join(' ') - begin - if File.directory?(filename) - $tbox.configure('state'=>'normal') - $tbox.delete('1.0', 'end') - $tbox.configure('state'=>'disabled') - $lbox.delete(0, 'end') - $dirname = filename - $direntry.value = filename - end - rescue - raise - end - } - }.pack('side'=>'left','fill' => 'both', 'expand' => 'yes') - $lbox.bind '', proc { - begin - if $lbox.curselection.empty? - puts "No selection in listbox." - else - highlighttext $lbox.get($lbox.curselection[0]) - end - rescue - puts "Cannot get selection in listbox." - end - } - $scrollframe = Tk::Frame.new($bottomleftframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') - $listscroll = Tk::Tile::Scrollbar.new($scrollframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') - $lbox.yscrollbar($listscroll) - $bottomrightframe =Tk::Tile::Frame.new($bottomframe).pack('side'=>'right','fill' => 'both', 'expand' => 'yes') - $tbox = Tk::Text::new($bottomrightframe){ - borderwidth 0.1 - relief 'sunken' - wrap 'word' - highlightcolor 'SlateGray3' - bg 'white' - state 'disabled' - }.pack('side'=>'left','fill' => 'both', 'expand' => 'yes') - $tscrollframe = Tk::Frame.new($bottomrightframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') - $tscroll = Tk::Tile::Scrollbar.new($tscrollframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') - $tbox.yscrollbar($tscroll) - - - $labelframe = Tk::Tile::Frame.new($root).pack('side'=>'bottom', 'fill'=>'both', 'expand' => 'no') - $bottomlabel = Tk::Tile::Label.new($labelframe) {text "No data displayed"}.pack('side' => 'left','fill' => 'both','expand' => 'no') - $p = Tk::Tile::Progressbar.new($labelframe) {orient 'horizontal'; length 200; mode 'indeterminate'}.pack('side' => 'left','fill' => 'both','expand' => 'no') - $bottomsep = Tk::Tile::Separator.new($root) { orient 'horizontal' }.pack('side'=> 'bottom', 'fill'=>'both') - - $root.bind("#{$accelkey}-Q", proc{exit}) - $root.bind("#{$accelkey}-q", proc{exit}) - $root.bind("#{$accelkey}-O", proc{choosedir}) - $root.bind("#{$accelkey}-o", proc{choosedir}) - $root.bind("#{$accelkey}-R", proc{stringgrep}) - $root.bind("#{$accelkey}-r", proc{stringgrep}) - - $lbox.focus + begin + Tk.ip_eval("console hide") + rescue + puts "could not hide console.\n" + end + + #image data + $folderdata = 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAADFBMVEUEBwcEBwcEBwcEBwcNzGmPAAAAAXRSTlMAQObYZgAAAC1JREFUeAFjYEYABgQgXRhCowAyhNEAfmFMQFiYsJX0F6aa5xmxiTIygMQxRQEtWAMvBVlMnAAAAABJRU5ErkJggg==' + + $glassdata = 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AcSAg8sJGRWZAAAAXhJREFUOMutlL9LQlEUxz+WGRHllGNEPyAUWnLWsVYhXNpd+ldC6B/QPyDnoMXNtbnFIRAarLAn+bDU13IuHC/vPm/agQuXy/d93veec+4Bv9gGKkAbGAORrAHQBPLAOn+MAtBVMNdqARlfaEk+minAJ/AOvAEjC973gWeAnvpoCNSAfWAX2AKKQN36eWtRWhoK+grkErRXlvO8S7hjuah6pK2uwE2X6BKYiujFsx5FlfPBmkO0B6Rkf+8JfgZC2Wdd4EjtNzzBcwVzgccKfuIJzgJp2X+7RIfAjyrGkQe4pvTtpIcxUcLOgt7MSZ8bfcUFDWOebMfhvCp9btqzK7NlLspW/36ptjPrAbgDbqUVbQOFOKh++wFwLfCk4WNM9OS2scPGrA/gQODmbCIFnQpspm7TsIdPWqCPIkgJ9AZ4Uk97DFyIq3NgU7R9yf0wrliB5fZMxqI+K7FEnIpLe+5GkvMyK8SxoyArQTXcOA+XvX5SWoL/gP4Cdj2n/+OJ36AAAAAASUVORK5CYII=' + + $folderimage = TkPhotoImage.new(:data => $folderdata) + $glassimage = TkPhotoImage.new(:data => $glassdata) + + $icondata = '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' + $icon = TkPhotoImage.new(:data => $icondata) + #initialize variables for entry + $dirname = TkVariable.new + $searchterm = TkVariable.new + #top window and frame + Tk::TkDND::DND + $root = TkRoot.new { + title "Stringscan" + } + $root.iconphoto_default($icon) + if $platform == 'aqua' + Tk.tk_call('fullscreen::fullscreen', $root) + end + #menu + $menubar = TkMenu.new($root) + TkOption.add '*tearOff', 0 + if $platform == 'aqua' + $appmenu = TkSysMenu_Apple.new($menubar) + $menubar.add :cascade, :menu => $appmenu + $appmenu.add :command, :label => 'About Stringscan', :command=> proc{aboutWindow} + $appmenu.add :command, :label => 'License', :command=>proc{getReg} + $appmenu.add :command, :label=>'Check for Updates', :command=>proc{checkUpdate} + $appmenu.add :separator + end + $searchmenu = TkMenu.new($menubar) + $menubar.add :cascade, :menu => $searchmenu, :label => 'Search' + $searchmenu.add :command, :label => 'Choose Directory...', 'accelerator' => "#{$accelkey}+O", :command => proc{choosedir} + $searchmenu.add :command, :label => 'Run Search', 'accelerator' => "#{$accelkey}+R", :command => proc{stringgrep} + if $platform == 'win32' + $searchmenu.add :command, :label => "Exit", :command=>proc{exit}, 'accelerator' => "#{$accelkey}+Q" + end + if $platform == 'aqua' + Tk.tk_call("windowlist::windowMenu", $menubar) + end + $helpmenu = TkSysMenu_Help.new($menubar) + $menubar.add :cascade, :menu => $helpmenu, :label => 'Help' + if $platform != 'aqua' + $helpmenu.add :command, :label=>'Stringscan Help', :command=>proc{ + Tk.tk_call('machelp::userhelp') + } + end + $helpmenu.add :command, :label=>'Contact Code by Kevin', :command=>proc{ + Tk.tk_call('xplat::launch', 'mailto:kw@codebykevin.com?subject=Stringscan') + } + $helpmenu.add :command, :label=>'Web Site', :command=>proc{ + Tk.tk_call('xplat::launch', 'https://www.codebykevin.com/stringscan.html') + } + + if $platform != 'aqua' + $helpmenu.add :command, :label => 'About Stringscan', :command=> proc{aboutWindow} + $helpmenu.add :command, :label => 'License', :command=>proc{getReg} + $helpmenu.add :command, :label=>'Check for Updates', :command=>proc{checkUpdate} + end + $root['menu'] = $menubar + $mainframe = Tk::Tile::Frame.new($root).pack('side' => 'top','fill' => 'both','expand' => 'yes') + #button frame and buttons + $buttonframe = Tk::Tile::Frame.new($mainframe){padding 2}.pack('side' => 'top','fill' => 'both','expand' => 'no') + choosedirproc = proc{choosedir} + $choosebutton = Tk::Tile::Button.new($buttonframe) { + image $folderimage + takefocus 0 + padding 5 + command choosedirproc + }.pack('side' => 'left','fill' => 'both','expand' => 'no') + Tk::RbWidget::BalloonHelp.new($choosebutton, 'text'=>'Select Directory', 'background'=>'lightyellow', 'relief'=>'solid', 'borderwidth'=>1) + stringgrepProc = proc {stringgrep} + $runbutton = Tk::Tile::Button.new($buttonframe) { + image $glassimage + takefocus 0 + padding 5 + command stringgrepProc + }.pack('side' => 'left','fill' => 'both','expand' => 'no') + Tk::RbWidget::BalloonHelp.new($runbutton, 'text'=>'Run Search', 'background'=>'lightyellow', 'relief'=>'solid', 'borderwidth'=>1) + $sep = Tk::Tile::Separator.new($mainframe) { orient 'horizontal' }.pack('side'=> 'top', 'fill'=>'both') + #labels and entries + $topframe = Tk::Tile::Frame.new($mainframe){padding 5}.pack('side' => 'top','fill' => 'both','expand' => 'no') + $chooselabel = Tk::Tile::Label.new($topframe) {text "Directory:"}.pack('side' => 'left','fill' => 'both','expand' => 'no') + $direntry = Tk::Tile::Entry.new($topframe) {textvariable $dirname }.pack('side' => 'left','fill' => 'both','expand' => 'no') + $termlabel = Tk::Tile::Label.new($topframe) {text "Search Term:"}.pack('side' => 'left','fill' => 'both','expand' => 'no') + $termentry = Tk::Tile::Entry.new($topframe) {textvariable $searchterm}.pack('side' => 'left','fill' => 'both','expand' => 'no') + $termentry.bind('Return', proc {stringgrep}) + $nextsep = Tk::Tile::Separator.new($mainframe) {orient 'horizontal'}.pack('side'=>'top', 'fill'=>'both') + #listbox, textbox, scrollbars + $bottomframe = Tk::Frame.new($mainframe).pack('side'=>'bottom','fill' => 'both', 'expand' => 'yes') + $bottomleftframe = Tk::Tile::Frame.new($bottomframe).pack('side'=>'left','fill' => 'both', 'expand' => 'yes') + $listlabel = Tk::Tile::Label.new($bottomleftframe) { + text 'File Name' + style 'TablelistHeader.TLabel' + padding 1 + }.pack('side'=>'top', 'fill'=>'both', 'expand' => 'no') + $lbox = Tk::Listbox.new($bottomleftframe){ + width 50 + height 30 + borderwidth 0 + takefocus 0 + activestyle "none" + exportselection 0 + selectbackground "RoyalBlue1" + selectforeground "white" + dnd_bindtarget('text/uri-list', '', '%D') {|d| + filename=d.join(' ') + begin + if File.directory?(filename) + $tbox.configure('state'=>'normal') + $tbox.delete('1.0', 'end') + $tbox.configure('state'=>'disabled') + $lbox.delete(0, 'end') + $dirname = filename + $direntry.value = filename + end + rescue + raise + end + } + }.pack('side'=>'left','fill' => 'both', 'expand' => 'yes') + $lbox.bind '', proc { + begin + if $lbox.curselection.empty? + puts "No selection in listbox." + else + highlighttext $lbox.get($lbox.curselection[0]) + end + rescue + puts "Cannot get selection in listbox." + end + } + $scrollframe = Tk::Frame.new($bottomleftframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') + $listscroll = Tk::Tile::Scrollbar.new($scrollframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') + $lbox.yscrollbar($listscroll) + $bottomrightframe =Tk::Tile::Frame.new($bottomframe).pack('side'=>'right','fill' => 'both', 'expand' => 'yes') + $tbox = Tk::Text::new($bottomrightframe){ + borderwidth 0.1 + relief 'sunken' + wrap 'word' + highlightcolor 'SlateGray3' + bg 'white' + state 'disabled' + }.pack('side'=>'left','fill' => 'both', 'expand' => 'yes') + $tscrollframe = Tk::Frame.new($bottomrightframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') + $tscroll = Tk::Tile::Scrollbar.new($tscrollframe).pack('side'=>'right','fill' => 'y', 'expand' => 'no') + $tbox.yscrollbar($tscroll) + $labelframe = Tk::Tile::Frame.new($root).pack('side'=>'bottom', 'fill'=>'both', 'expand' => 'no') + $bottomlabel = Tk::Tile::Label.new($labelframe) {text "No data displayed"}.pack('side' => 'left','fill' => 'both','expand' => 'no') + $p = Tk::Tile::Progressbar.new($labelframe) {orient 'horizontal'; length 200; mode 'indeterminate'}.pack('side' => 'left','fill' => 'both','expand' => 'no') + $bottomsep = Tk::Tile::Separator.new($root) { orient 'horizontal' }.pack('side'=> 'bottom', 'fill'=>'both') + $root.bind("#{$accelkey}-Q", proc{exit}) + $root.bind("#{$accelkey}-q", proc{exit}) + $root.bind("#{$accelkey}-O", proc{choosedir}) + $root.bind("#{$accelkey}-o", proc{choosedir}) + $root.bind("#{$accelkey}-R", proc{stringgrep}) + $root.bind("#{$accelkey}-r", proc{stringgrep}) + + $lbox.focus end #select search directory def choosedir - $tbox.configure('state'=>'normal') - $tbox.delete('1.0', 'end') - $tbox.configure('state'=>'disabled') - $lbox.delete(0, 'end') - $dirname = Tk::chooseDirectory('initialdir'=>Dir.home, 'parent'=>$root) - $direntry.value = $dirname + $tbox.configure('state'=>'normal') + $tbox.delete('1.0', 'end') + $tbox.configure('state'=>'disabled') + $lbox.delete(0, 'end') + $dirname = Tk::chooseDirectory('initialdir'=>Dir.home, 'parent'=>$root) + $direntry.value = $dirname end #read file for display in text widget def highlighttext(file) - $tbox.configure('state'=>'normal') - $tbox.delete('1.0', 'end') - f = open(file, 'rb') - while(!f.eof?) - $tbox.insert('end', f.read(1000)) - end - f.close - $tbox.configure('state'=>'disabled') - $tbox.tag_configure('search', :background=>'yellow') - sethighlight + $tbox.configure('state'=>'normal') + $tbox.delete('1.0', 'end') + f = open(file, 'rb') + while(!f.eof?) + $tbox.insert('end', f.read(1000)) + end + f.close + $tbox.configure('state'=>'disabled') + $tbox.tag_configure('search', :background=>'yellow') + sethighlight end #set highlight color for search term def sethighlight - $tbox.configure('state'=>'normal') - $tbox.tag_remove('search', '0.0', 'end') - return if $searchterm == "" - cur = '1.0' - loop { - cur, len = $tbox.search_with_length("#{$searchterm}", cur, 'end') - break if cur == "" - $tbox.tag_add('search', cur, "#{cur} + #{len} char") - cur = $tbox.index("#{cur} + #{len} char") - } - $tbox.configure('state'=>'disabled') + $tbox.configure('state'=>'normal') + $tbox.tag_remove('search', '0.0', 'end') + return if $searchterm == "" + cur = '1.0' + loop { + cur, len = $tbox.search_with_length("#{$searchterm}", cur, 'end') + break if cur == "" + $tbox.tag_add('search', cur, "#{cur} + #{len} char") + cur = $tbox.index("#{cur} + #{len} char") + } + $tbox.configure('state'=>'disabled') end #about window for app def aboutWindow - Tk::messageBox :type => 'ok', - :message => 'Stringscan: Text Search Tool', - :icon => 'info', :title => 'About Stringscan', - :detail => "Version 1.1\n(c) 2017 WordTech Communications LLC", - :parent => $root + Tk::messageBox :type => 'ok', + :message => 'Stringscan: Text Search Tool', + :icon => 'info', :title => 'About Stringscan', + :detail => "Version 1.1\n(c) 2017 WordTech Communications LLC", + :parent => $root end #check version of installed software def checkUpdate - Tk.tk_call('softwareupdate::setIcon', $icon) - Tk.tk_call('softwareupdate::checkVersion', $appname, $appversion) + Tk.tk_call('softwareupdate::setIcon', $icon) + Tk.tk_call('softwareupdate::checkVersion', $appname, $appversion) end #check version of installed software def getReg - Tk.tk_call('regproc::getReg') + Tk.tk_call('regproc::getReg') end #user help def showHelp - Tk.tk_call('machelp::userhelp') + Tk.tk_call('machelp::userhelp') end - - #end of app class end #run app app = StringscanApp.new Tk.mainloop