internal void BeginPlaceholderMode(IndexTrackingStringBuilder placeholderSource, bool reset = false) { if (m_placeholderData == null) { m_placeholderData = new PlacholderData(placeholderSource, reset); } else if (m_placeholderData.Source != placeholderSource) { throw new Exception("Attempting to start placeholder mode on a TrackedStringManager that was already in placeholder mode with a different source."); } }
/// <summary> /// If you built your SubstringTracker in placeholder mode (see placeholder mode constructor), then /// you must call this once your text is all setup. /// </summary> internal void PlaceholderSetupComplete() { string toInsert = m_placeholderData.Source.Builder.ToString(); int insertIndex = m_placeholderData.Source.StartIndex; // Update the text to contain the string builder's result if (m_placeholderData.Reset) { this.Text = toInsert; // We're doing a hard reset this.m_trackedStrings.Clear(); } else { this.Text = this.Text.Insert(insertIndex, toInsert); } // Insert the placeholders first. // Note: This must be done first so that when we update the existing tracked strings TrackedString[] updateSkiplist = new TrackedString[m_placeholderData.PlaceholderItems.Count]; for (int ind = 0; ind < m_placeholderData.PlaceholderItems.Count; ++ind) { Tuple <TrackedString, int> placeholderItem = m_placeholderData.PlaceholderItems[ind]; placeholderItem.Item1.ResetStringInternal(placeholderItem.Item2); this.AddItem(placeholderItem.Item1); updateSkiplist[ind] = placeholderItem.Item1; } if (!m_placeholderData.Reset) { this.UpdateItemsInRange(insertIndex, toInsert.Length, updateSkiplist); } m_placeholderData = null; this.HasChanges = true; }