#region Top Part //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ // MyCustomLibrary.SearchForm3.cs //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ // v5.2.7.12 05-May-2019 Created and Roughed //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ // v5.2.7.14 12-May-2019 Great Design Stage. // v5.2.8.15 15-May-2019 Comin along nicely! // v5.2.8.16 16-May-2019 EyeOutBug Fixed ++ // v5.2.8.17 18-May Split out from SF1 for // Buttons & getting ready for After-Dialog! // v5.2.8.18 26-May-2019 Worked into SF3: // v5.2.8.19 31-May Mechanisms such as the // PropertyChanged Events & App Detect plus // Tie-ins to Both MyEditor & PrintBlaster. // v5.2.9.19 June 2019, Ready Mods ++ // v5.2.9.20 07-June Integration w/MyEditor! // v5.3.0.21 10-June Brought MySearchType & // SearchCom into SearchForm2, so now // it's MST for the Mutexes AND MySearchType // and SearchForm Class for what was MSC b4. // v5.3.0.21 15-June Getting Serious Now! // v5.3.1.23 25-Jun Coming Together! Rev-1; // v5.3.1.24 03-Jul FindByName2 Mod + Comm. // v5.3.1.25 10-July SearchForm Features plus. // v5.3.3.27 18-Jul-2019 4 way comms. // v5.3.3.28 21-Jul SmesaSearch.cs rockin it // -=[ Design Revision 4 ]=- My Custom Type. // v5.3.4.29 25-Jul-2019 Spelling things out // Class{in-Class{in-Class}}; Custom Types: // v5.3.5.30 30-July ReCoded4 WorkList2 // v5.3.5.31 03-Aug ReCoded4 WorkList2 // v5.4.5.32 07-Aug-2019 Search & Replace. // v5.4.5.33 12-Aug SF4 Split Out & Polish. // v5.4.5.34 18-Aug Sorting things out. // v5.4.6.36 29-Aug Work down testwells & // BreakPoints, Clean and Polish++ // v5.4.7.40 24-Sep-2019 Settling down after // some evolution during tracing & testing. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Security; using System.Threading; using System.Windows.Forms; // Class Aliases using MCD = MyCustomLibrary.Dialogs; using MMF = MyCustomLibrary.MemoryMapper; using MCT = MyCustomLibrary.MyToolbox; // Property Aliases using MCR = MyCustomLibrary.Properties.Resources; using MCS = MyCustomLibrary.Properties.Settings; #endregion Pop Tart //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ namespace MyCustomLibrary { public partial class SearchForm { #region Lower Level / Instrumental Methods #region By Name Method Group // REM: This Method is called from Loops void FindByName1() { const bool calledByMe = false; FindByName1(calledByMe); } // This OverLoad is ONLY directly called // from FindByName2(); & the overload // above. (True only if ME calling.) void FindByName1(bool find2) { Indexes = new Collection(); foreach (var file in MCD.WholeList .Where(file => !string .IsNullOrEmpty(searchBox.Text) && !string.IsNullOrEmpty( file) && File.Exists(file))) { if (wordCheckBox.Checked) WordUp(file); else BasketCase(file); } if ( Indexes != null && Indexes.Count > 0 && !find2) UpdateSelected(); else if (!find2) MessageBox.Show(MCR.Nada); } void UpdateSelected() { var temp = new Collection();// var hole = MCD.WholeList; foreach (var index in Indexes .Where(index => index >= 0 && index < hole.Count)) temp.Add(hole[index]); var t = 0; if (!MCT.P1Running) t = RunBlaster(); MCD.Selected = temp; if (t < 9) { #region Design Note: // Psuedo Property.Changed | // Event, Triggers call | // to: SendSelected(below); v #endregion Design Note: IndexesFound = Indexes;// <-===<< Indexes.Clear(); Validate(); return; } if (!MCT.Testing) return; #region Permanent TestCode MessageBox.Show(string.Format( "{0}{1}{2}{3}{4}", MCR.TimeOut1, // 0 Path.GetFileName( // 1 MCT.GetRoot + MCR.BlasterApp), MCR.TimeOut2, // 2 MCR.UpDate, // 3 "\n\nCycles === " + t)); // 4 #endregion } void SendSelected() { var ct = IndexesFound.Count; if (ct < 1) return; var sl = new Collection(); for (var i = 0; i < ct; ++i) sl.Add(MCD.WholeList[ IndexesFound[i]]); // uses strings now no nums past here! var fn = Application.StartupPath + MCR.Selected; var args = MCD.GetArgs(fn, 0); args[3] = sl; if (!MMF.WriteStrings(args)) MessageBox.Show(MCR.Err10); } static int RunBlaster() { #region testcode UpdateSelected //const string txt = // "Update Selected PB NOT" + // " Running, HIT!"; //MessageBox.Show(txt); #endregion var file = MCT.GetRoot + MCR.BlasterApp; if (!File.Exists(file)) return 9;//\\ var args = new[] { file, MCR.Blaster, MCR.Blaster }; // breakpoint RunBlaster() MCT.RunApp(args); var t = 0; do Thread.Sleep(333); while (!MCT.P1Running && ++t < 9); Thread.Sleep(1212); return t; } void BasketCase(string file) { if (caseCheckBox.Checked) { if (file.Contains(searchBox.Text))// Indexes.Add( MCD.WholeList.IndexOf(file)); } else // case not checked. { if (file.ToLower().Contains( searchBox.Text.ToLower())) Indexes.Add( MCD.WholeList.IndexOf(file)); } } void WordUp(string file) { var fn = Path. GetFileNameWithoutExtension(file); if (string.IsNullOrEmpty(fn)) return; if (wordCheckBox.Checked) { if (searchBox.Text.Contains(fn)) Indexes.Add( MCD.WholeList.IndexOf(file)); } else // word not checked. { if (searchBox.Text.ToLower() .Contains(fn.ToLower())) Indexes.Add( MCD.WholeList.IndexOf(file)); } } #endregion By Name Method Group //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ #region By Content Method Group string[] Lines { get; set; } void ContentOfCurrent(bool solo) { #region Note: Search4 var is reused // it has done it's initial job of // bringing in the search string to // Load. Once SearchForm is loaded // that value becomes searchBox.Text // & we can reuse Search2 (4) as the // filename to pass in at invokation. #endregion if (!solo) return; Search2 = MCD.Current; ContentOfCurrent(); } bool ReadActualFile() { var fn = Search2; if (string.IsNullOrEmpty(fn) || !File.Exists(fn)) return false; try { var test = File.ReadAllLines(fn); if (test.Length < 1) return false; Lines = test; return true; } #region Catches catch (ArgumentException) { return false; } catch (PathTooLongException) { return false; } catch (DirectoryNotFoundException) { return false; } catch (IOException) { return false; } catch (UnauthorizedAccessException) { return false; } catch (NotSupportedException) { return false; } catch (SecurityException) { return false; } #endregion Catches } // This is also called from Loops. void ContentOfCurrent() { if ( MCD.Selected == null || MCD.Selected.Count < 1 || !MCD.IsFile(Search2) || !ReadActualFile() || Lines == null || Lines.Length < 1) return; var file = Get1Record(Search2); if (file == null || file.Line == null || file.Line.Count < 1 || string.IsNullOrEmpty(file.Name)) return; Info.File.Add(file); } // -=[ Updated for Custom Type ]=- // v5.3.5.31 02-Aug-2019 by -JpE- Files Get1Record(string fn) { if (string.IsNullOrEmpty(fn) || !File.Exists(fn)) return null; var fileN = new Files( new Collection()) { Name = fn }; var lines = GetLines(); if ( lines!= null && lines.Star != null && lines.Star.Count > 0 ) fileN.Line.Add(lines); return fileN; } Lines GetLines() { Lines line = null; var c = Lines.Length; for (var y = 0; y < c; ++y) { if (wordCheckBox.Checked) { // breakpoint wordCheckBox.Checked if (string.IsNullOrEmpty( Lines[y]) || !Lines[y].Equals (searchBox.Text)) continue; } else if (string.IsNullOrEmpty(Lines[y]) || !Lines[y].Contains( searchBox.Text) ) continue; var test = FindHits(Lines[y]); if (test == null ||test.Count < 1 ) continue; // Hits Found & Set, So is Y; line = new Lines(test) { LineNumber = y }; } return line;//s; } // v5.4.5.32 07-Aug-2019 Collection FindHits(string line) { var case11 = GetCase(); var search = searchBox.Text; var word12 = wordCheckBox.Checked; if (word12) search = string.Format( " {0} ", search); if (word12 && !line.Contains( search)) return null; var hits = new Collection(); var accu = 0; while (line.Length >= searchBox.Text.Length && line.Contains(search)) { var xCoord = line.IndexOf( search, case11); if (xCoord < 0) continue; // Accumulator: Orig Line Positions. hits.Add(accu += xCoord); if (search.Length > line.Length) break; line = line.Remove( 0, xCoord + search.Length); } return hits; } StringComparison GetCase() { return caseCheckBox.Checked ? StringComparison // case sensitive .InvariantCulture : StringComparison // ignore case .InvariantCultureIgnoreCase; } #endregion By-Content Method Group //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ #endregion Instrumental Low Level Members //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ #region Higher Level Methods ALL use Instr #region Higher Level: Content Method Group.. void ContentOfSelected() { if (MCD.Selected == null || MCD.Selected.Count < 1) return; ProcessContentList(MCD.Selected); } // ^v send Selected list to COC via void ProcessContentList( IEnumerable files) { foreach (var fn in files.Where( fn => !string.IsNullOrEmpty(fn) && File.Exists(fn))) { Search2 = fn; ContentOfCurrent(); } } // Called by both ME & PB as stated; // REM: MCD already arranged it, if; // ME calling edited is MCD.Current; // Selected = Files Open in Editor; // WholeList = if(ME) Favorites.sme; void ContentOfAll() { //Testing(); // Keep if (MCD.WholeList == null || MCD.WholeList.Count < 1) return; SearchAll = true; ProcessContentList(MCD.WholeList); } /* Keep Test Code */ //static void Testing() //{ // // const string // b = "Both", // e = "Editor", // c = "Cancel"; // var s = "Error"; // while (!s.Equals("Cancel")) // { // s = "Blaster"; // var d = Choice(); // switch (d) // { // case 1: s = b; break; // case 2: s = e; break; // case 4: s = c; break; // } // MessageBox.Show( // string.Format("{0} {1}", // "You Selected: ", s)); // } //} #endregion Higher Level: Content-Members //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ #region Higher Level: By-Name Method Group. // Hit only by M.E. Indexes go 2 P.B. as // before, but via FileSystemWatcher, // and we'll also Send an ME-2nd // instance the ones found in Selected: // That will tab to them w/ proven code. void FindByName2() { FindByName1(true); CheckList(); if ( Indexes == null || Indexes.Count < 1) { MessageBox.Show(MCR.Nada); return; } var opn = new Collection(); foreach (var file in from file in MCD.OpenFiles let idx= MCD.WholeList .IndexOf(file)where Indexes.Contains( idx) select file) opn.Add(file); UpdateSelected(); // ^ SendSelected call now in there. if (opn.Count < 1) return; SendOpen2Me(opn); } // Sends filenames of Open with a // Match to a thread of ME.Process static void SendOpen2Me(IList opn) { var fil = Application .StartupPath + MCR.EditorApp; if (opn == null || !File.Exists(fil)) return; opn.Insert(0, fil); var ary = MCT.Collection2Array(opn, 0); MCT.RunApp(ary); } // Checks for anything Open in ME // that's NOT in Managed, & adds it. // Append; Don't mess up the order // of indices as they're relied upon! static void CheckList() { foreach (var file in MCD.OpenFiles .Where(file => !MCD.WholeList .Contains(file))) MCD.WholeList.Add(file); } #endregion Higher Level: By-Name Members. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ #endregion Higher Levels use Instrumentals. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\ } }