GlobalAccessSoftware icon

Search and Replace Module Alpha Part-2

GlobalAccessSoftware | PRO | 10/03/19 11:58:45 PM UTC | 0 ⭐ | 881 👁️ | Never ⏰ | []
C# |

10.76 KB

|

None

|

0 👍

/

0 👎

 
#region Top Part
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
// SmesaSearch2.cs from SmesaSearch1
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
// v5.3.4.28 22-July SmesaSearch.cs rockin'
// -=[ 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.34 16-Aug Migrating New Code Here.
// v5.4.6.36 29-Aug Work down testwells &
// BreakPoints, Clean and Polish++
// v5.4.6.37 14-Sep GetFileData2();
// re-re-Designed &
// v5.4.6.38 16-Sep GetFileData2 re-Written.
// v5.4.7.39 24-Sep-2019 Settling down after
// some evolution during tracing & testing.
// v5.4.7.40 01-Oct-2019 Heavy Hacking S&R.
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
 
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
 
// Class Aliases
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using MyCustomLibrary;
using MCD = MyCustomLibrary.Dialogs;
using MMF = MyCustomLibrary.MemoryMapper;
using MCT = MyCustomLibrary.MyToolbox;
using MSF = MyCustomLibrary.SearchForm;
//using MST = MyCustomLibrary.MySearchType;
 
// Property Aliases
using SMR = MyEditor.Properties.Resources;
using SMS = MyEditor.Properties.Settings;
 
#endregion Pop Tart
 
 
namespace MyEditor
{
  public partial class Smesa //  <-==<<
  {
#region GetFileData Method Group
 
    /// <summary> strings to Custom TYPE;
    /// called from the loop body above.
    /// So each record can have multiple
    /// points, or hits, (Therein) i.e.
    /// Occurances of the searchString.
    /// DON'T FORGET TO REMEMBER: EATs
    /// Empty Line Between Saved Records.
    /// Comes setup except for the Files.
    /// reWrite GetFileData and simplify
    /// v5.4.6.38 14-Sep-2019 -JpE-
    /// Okay, so, this...
    /// Method Group written bottom up
    /// Logical inside to outside whereas
    /// Starting from here down is most
    /// readable codewise & Design-Wise.
    /// Structurably, Architecturally:
    /// Our Custom Type(s) & Composits
    /// of other Custom "SearchTypes.cs"
    /// Confered and tied into this also.
    /// The WorkList2 Layer:
    /// </summary>
    /// <param name="bools"> </param>
    /// <param name="texts"> </param>
    /// <param name="readStrings"></param>
    /// <returns></returns>
    static WorkList2 GetFileData(
      IList<string> bools,
      IList<string> texts,
      IList<string> readStrings)
    {
      return
        new WorkList2(
          GetFiles(readStrings)) // <-===<<
          {
            CaseCheck = Convert
              .ToBoolean(bools[0]),
 
            WordCheck = Convert
              .ToBoolean(bools[1]),
 
            FindThis  = texts[0],
            Change2   = texts[1],
          };
    }
    // ><><><><><><><><><><><><><><><><>
 
    static int RedNum{ get; set; }// <-===<<
 
    /// <summary> The Files Layer
    /// Remember that readStrings[0] & [1]
    /// have already been used to define
    /// both CheckBoxes [0] & Search &
    /// Replace strings [1] So, offset by 2.
    /// </summary>
    /// <param name="redStrings"></param>
    /// <returns></returns>
    static Collection<Files>
      GetFiles(IList<string> redStrings)
    {
      RedNum = 1;
      var files = new Collection<Files>();
 
      while (++RedNum < redStrings.Count)
      {
        var r = redStrings[RedNum];
 
        if (string.IsNullOrEmpty(r)
          || r.Equals(MCT.Special)
          ) continue;
 
        var  test = GetFile(redStrings);
        if ( test != null
          && test.Line != null
          && test.Line.Count > 0
          ) files.Add(test);
      }
      return files;
    }
 
    static Files GetFile(
      IList<string> redstrs)
    {
      var named = redstrs[RedNum];
      var lines = GetLines(redstrs);
 
      if (lines == null
        || lines.Count < 1
        || lines[0].Equals(null)
        ) return null;
 
      var t  = new Files(lines)
      { Name = named };
 
      return t;
    }
    // ><><><><><><><><><><><><><><><><><><>
 
    /// <summary> The Lines Layer  (Plural)
    /// </summary>
    /// <param name="readStrings"></param>
    /// <returns></returns>
    static Collection<Lines>
      GetLines(IList<string> readStrings)
    {
      var lines = new Collection<Lines>();
 
      while (++RedNum < readStrings.Count)
      {
        var r = readStrings[RedNum--];
 
        if (string.IsNullOrEmpty(r)
          || r.Equals(MCT.Special)
          )
          break;
 
        var test = GetLine(readStrings);
        if ( test != null
          && test.Star != null
          && test.Star.Count > 0)
            lines.Add(test);
        else 
          break;
      }
      return lines;
    }
 
    /// <summary> The Line Layer (Singular)
    /// </summary>
    /// <param name="redStrings"></param>
    /// <returns></returns>
    static Lines GetLine(
      IList<string> redStrings)
    {
      var hits = GetHits(redStrings);
      if (hits.Count< 2) return null;
 
      var l2 = hits[0];
      hits.RemoveAt(0);
 
      var line = new Lines(hits)
      { LineNumber = l2 };
 
      return line;
    } // ><><><><><><><><><><><><><><><><><>
 
    /// <summary> The "hits" Layer (inner)
    /// The so-called X Coordinates of
    /// the scheme, The Start Position
    /// of The FOUND string, allowing
    /// for more than 1 per line, etc. 
    /// </summary>
    /// <param name="redStrings"></param>
    /// <returns></returns>
    static Collection<int> GetHits(
      IList<string> redStrings)
    {
      var hits = new Collection<int>();
 
      while (++RedNum < redStrings.Count)
      {
        var red = redStrings[RedNum];
 
        if (string.IsNullOrEmpty(red)
          || red.Equals(MCT.Special)
          || !red.Contains(","))
        { --RedNum; break; }
        
        var ints =
          redStrings[RedNum].Split(',');
        if (ints.Length < 2) return null;
 
        foreach (var n in ints)
        {
          try { hits.Add(
            Convert.ToInt32(n)); }
          catch (FormatException) { break; }
          catch(OverflowException){ break; }
        }
      }
      return hits;
    } 
#endregion GetFileData Methods reWritten
    //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
 
 
#region Search & Replace Tracking
 
    void FindNextMatch()
    {
      // testwell &/or FindNextMatch
      Tracker =
        GetRtbCoords( // & Adjust WorkList.File.Lines to active RTB.Lines really fast!
          Track2Next()); // <-= Take Guesses... ^
 
      SetSelectedText();
    }
 
    // Highlight this Find in Editor.
    void SetSelectedText()
    {
      // testwell SetSelected();
      var tab = GetTabNum(
        WorkList.File[Tracker.File].Name);//
      var rtb = GetRtB(tab);
 
      if (tab < 0 || rtb == null
        || rtb.Lines.Length < 1) return;
 
      rtb.SelectionStart =
        rtb.GetCharIndexFromPosition(
          new Point(
 
          WorkList // Y
            .File[Tracker.File]
            .Line[Tracker.Line]
            .LineNumber,
 
          WorkList // X
            .File[Tracker.File]
            .Line[Tracker.Line]
            .Star[Tracker.Star]));
 
      rtb.SelectionLength =
        WorkList.FindThis.Length;
    }
 
 
    /**************************************/
    //halt: Heavy Construction, Bridge Out!
    /**************************************/
 
    
    // Actual Tracking adjusts WorkList
    // Lines and Starts, to actual real
    // time numerations when needed.
    // Updates WorkList.Files[x].Line
    // & Star(ts), to rtb.Lines real fast.
    // Uses a lot of existing code so that
    // is a definite perk & good news
    // for testing, as that's proven code.
    P3D GetRtbCoords(P3D p)
    {
      // testwell design GRC
      var rtb = GetRtB(GetTabNum(
        WorkList.File[p.File].Name));
      var lns =
        WorkList.File[p.File].Line;
 
      // hack: Evolve in Trace.
      RedNum  = -1; // As indexer.
      var cls = GetLines(rtb.Lines);
      if (cls == null // Collection of Lines
        ||cls.Count < 1
        ||cls.Equals(lns)) return p;
      var fil = new Files(cls); // 1 file.
      var pos =
        WorkList.File.IndexOf(fil);
        WorkList.File.RemoveAt(pos);
        WorkList.File.Insert(pos, fil);
      //develop: calibration ^ may be needed.
      TrackTo = GetTrackMax();
      return AdjustTracker(fil);
    }
 
    // Now align Tracker with new
    // WorkList.File[p.File].Lines.
    P3D AdjustTracker(Files fls) // 1 file.
    {
      // design hack testwell AdjustTracker
      var p3 = new P3D();
 
      foreach (var ln in fls.Line)
      {
        var p1 = p3.Line;
        var nm = ln.LineNumber;
        var st = ln.Star;
 
        wait what?
 
      }
 
      return p3;
    }
 
    // Set Tracker to the NEXT
    // Matching Block's P3D location ahead.
    // (if any) REM: All Zero on FindFirst();
    P3D Track2Next()
    {
      // testwell design Track2Next()
      var trakWas = Tracker;
      var trackTo = new P3D();
 
      // hack Track2Next(next find)
      return trackTo;
    }
    /*  Design Note:
       ************** 
       Okay, so it needs to use Tracker to
       keep track of where we were in the
       WorkList, and increment to the next
       record in the current WorkList on
       demand from "remote" commands.
     */
 
    RichTextBox GetRtB(int tab)
    {
      return
        TabControl.TabPages[tab]
        .Controls[_index] as RichTextBox;
    }
 
    static int GetTabNum(string fn)
    {
      // testwell GetTabNum();
      if (string.IsNullOrEmpty(fn)
        || !SMS.Default
          .FileNames.Contains(fn)
        || !File.Exists(fn)) return -1;
 
      return
        SMS.Default
          .FileNames.IndexOf(fn);
    }
 
    // Ta-da! Easy with Custom Types!
    void ReplaceSelection()
    {
      // testwell ReplaceCurrentSelection
      var rtb = GetRtB(GetTabNum(WorkList
        .File[Tracker.File].Name));
      if (rtb == null || rtb.Lines == null
        ||rtb.Lines.Length < 1) return;
      var tst = rtb.Lines[Tracker.Line];
      if (!tst.Contains(
        WorkList.FindThis)) return;
 
      // halt what do these contain after?
      var len = WorkList.FindThis.Length;
      var fst = tst.Substring(
        0, Tracker.Star + len);
      var lst = tst.Substring(
        Tracker.Star + len);
 
      // Evolve as needed.
      fst = fst.Replace(WorkList
        .FindThis, WorkList.Change2);
 
      rtb.Lines[Tracker.Line] = fst + lst;
    }
#endregion Search And Replace Tracking
    //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
 
 
  }
}

Comments