#region AppCode5 Part-3 v4.7.5.10 Jun 05 17 /* This was way easier than I thought it would be, * (Except finally learning that a HybridDictionary * is not Serializable to XML and storing it as a * String Collection, flipping between Key & Value on the fly.) * Sure shows what you can do with situational awareness * of and reuse of existing code and so forth. * v4.7.4.07 Jun 04 2017 * (c) 2011 - 2031 by John P. Edwards * Final Debug and Test v4.7.5.10 Jun 05 2017 * ****************************************** */ //private static HybridDictionary Dic { get; set; } //// This ^ Property is in the Header as Class Global. /// Load HybridDictionary string, int /// from StringCollection Setting. /// v4.7.5.10 Jun 05 2017 /// private static void LoadDic() { var flip = false; Object key = ""; var raw = OPS.Default.RecNumDic; // Actually ^ a StringCollection. if (raw == null || raw.Count < 1) return; try { Dic = new HybridDictionary(); foreach (Object str in raw) { flip = !flip; // Alternate between Key & Value. if (flip) { // key is already a string doesn't // need to be "unBoxed" in this example. key = str; continue; } int value; try { // The int32 Value needs to be // "unBoxed" thusly from a string. // But it's the same principle as with Objects, // & Boxing & Unboxing thereof. value = Convert.ToInt32(str); } catch (FormatException) { const string except = "FormatException", sender = "Inner Try Block"; TestMessager(sender, except); value = -1; } if ( Dic.Contains(key)) Dic[key] = value; else Dic.Add(key, value); } } catch (ArgumentException) { const string except = "System.ArgumentException", sender = "Outter Try Block"; TestMessager(sender, except); } } private static void TestMessager(string sender, string e) { if (Testing) MessageBox.Show(string.Format( "{0}\nException in LoadDic:\n\n{1}\n\n", sender, e)); } /// Save the HybridDictionary /// as StringCollection. /// Called only from FormClosing. /// v4.7.5.10 Jun 05 2017 /// private static void SaveDic() { SaveRecNum(true); // It should never happen after <-= but... if (Dic == null || Dic.Count < 1) return; var i = Dic.GetEnumerator(); OPS.Default.RecNumDic = new StringCollection(); while (i.MoveNext()) { OPS.Default.RecNumDic.Add(i.Key.ToString()); OPS.Default.RecNumDic.Add(i.Value.ToString()); // Adding them two at a time because it's a KeyValue pair. // NOTE: The StringCollection will always be twice the size // of the HybridDictionary because of this. (Alternate Pairs) } OPS.Default.Save(); } // Called only from TestButtonClick. private static void ViewDictionary() { if (Dic == null) return; var e = Dic.GetEnumerator(); var n = 1; const string t = "Contents of Dictionary:"; var x = ""; while (e.MoveNext()) { x += string.Format( "Entry #{0})\nFile: {1}\n\n" + "Which has a corresponding" + " RecNum of {2}\n\n", n++, e.Key, e.Value); } using (var j = new ShowMeForm(x,t)) { j.Size = AUS.Default.ViewDic_Size; j.Location = AUS.Default.ViewDic_Loca; j.ShowDialog(); AUS.Default.ViewDic_Size = j.Size; AUS.Default.ViewDic_Loca = j.Location; } AUS.Default.Save(); } /// Gets the Previous Record Number /// for the current data file. Defaults to first /// Record when none found. (Gets added in SaveRecNum) /// Called from AppCode1.cs from AppStart() and in the /// OptionsBackend.cs from LoadNewPreferences(); /// private void GetRecNum() { // Never gets here unless UsePreferences is Checked. if (Dic == null || Dic.Count < 1) LoadDic(); // if still null then initialize the HybridDictionary. if (Dic == null || Dic.Count < 1) Dic = new HybridDictionary(false); #region Lesson Learned Here: // why did it reset each run as HybridDictionary? // Because Hybrid Dictionary is not Serializable to XML // so I just had to convert it to a String Collection and // flip them 2 at a time into the HybridDictionary on FormLoad // and Then convert it back to the String Collection on FormClose // with LoadDic() and SaveDic(); #endregion if (Dic == null || Dic.Count < 1) return; var f = AUS.Default.RootDir + "\\" + AUS.Default.FileName; _wasAtNum = AUS.Default.RecordNum = Dic.Contains(f) ? (int)Dic[f] : -1; // v4.7.5.10 CheckDic(); AUS.Default.Save(); } private static bool UsePreferences(bool which) { var title = ARS.IF_UsePrefTitle1; //"Turn on Preferences?"; var text = ARS.IF_UsePrefText1; //"This feature is only available when\n" + //"the Folder Preference Setting is ON.\n\n" + //"Would you like to turn it on Now?"; if (!which) { title = ARS.IF_UsePrefTitle2; text = ARS.IF_UsePrefText2; //"Turning on the Alternate Folder\n" + //"Finder in Options is a Key feature too.\n\n" + todo remnants. //"Would you like to turn it on now as well?\n" + //"(Recomended)\n"; } return AppStatic.YesNoDialog(text, title, 1); } /// Either add or change existing value. /// Checks for Object in HybridDictionary and changes /// the value or adds the key and value to the Collection. /// Called from SaveDic(); here (Which is called from FormClosing();) /// and from OptionsBackend.cs from LoadNewPreferences(); /// private static void SaveRecNum(bool auto) { if (!OPS.Default.UsePreferences) { if (auto) return; if (!UsePreferences(true)) return; OPS.Default.UsePreferences = true; if (!OPS.Default.AlternateFolderFinder && UsePreferences(false)) OPS.Default.AlternateFolderFinder = true; OPS.Default.Save(); } if (Dic == null) { Dic = new HybridDictionary(false); if (Dic == null) { if (Testing && !auto) MessageBox.Show(ORS.IF_SaveRecNum_NULL); return; } } var key = AUS.Default.RootDir + "\\" + AUS.Default.FileName; var index = AUS.Default.RecordNum = CurrentRecord - 1; if (Dic.Contains(key)) Dic[key] = index; else Dic.Add(key, index); AUS.Default.Save(); CheckDic(); } /// Check Dictionary and Verify Data there. /// private static void CheckDic() { foreach (string ffn in Dic.Keys) { var dir = Path.GetDirectoryName(ffn); if (dir == null) return; if (Directory.Exists(dir) && HasDataFiles(dir) && File.Exists(ffn)) { if (!Dic.Contains(ffn)) Dic.Add(ffn, 0); } else if (Dic.Contains(ffn)) Dic.Remove(ffn); // OUCH! } } /// Local Call that Calls OptionsForm Method. /// Mostly created so this shows up in this Class. /// /// /// private static bool HasDataFiles(string dir) { return OptionsForm.HasDataFiles(dir); } #endregion AppCode5 Part-3 v4.7.5.10 Jun 05 17 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\