using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; namespace FastColoredTextBoxNS { /// /// Base class for bookmark collection /// public abstract class BaseBookmarks : ICollection, IDisposable { #region ICollection public abstract void Add(Bookmark item); public abstract void Clear(); public abstract bool Contains(Bookmark item); public abstract void CopyTo(Bookmark[] array, int arrayIndex); public abstract int Count { get; } public abstract bool IsReadOnly { get; } public abstract bool Remove(Bookmark item); public abstract IEnumerator GetEnumerator(); System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } #endregion #region IDisposable public abstract void Dispose(); #endregion #region Additional properties public abstract void Add(int lineIndex, string bookmarkName); public abstract void Add(int lineIndex); public abstract bool Contains(int lineIndex); public abstract bool Remove(int lineIndex); public abstract Bookmark GetBookmark(int i); #endregion } /// /// Collection of bookmarks /// public class Bookmarks : BaseBookmarks { protected FastColoredTextBox tb; protected List items = new List(); protected int counter; public Bookmarks(FastColoredTextBox tb) { this.tb = tb; tb.LineInserted += tb_LineInserted; tb.LineRemoved += tb_LineRemoved; } protected virtual void tb_LineRemoved(object sender, LineRemovedEventArgs e) { for(int i=0; i= e.Index) { if (items[i].LineIndex >= e.Index + e.Count) { items[i].LineIndex = items[i].LineIndex - e.Count; continue; } var was = e.Index <= 0; foreach (var b in items) if (b.LineIndex == e.Index - 1) was = true; if(was) { items.RemoveAt(i); i--; }else items[i].LineIndex = e.Index - 1; //if (items[i].LineIndex == e.Index + e.Count - 1) //{ // items[i].LineIndex = items[i].LineIndex - e.Count; // continue; //} // //items.RemoveAt(i); //i--; } } protected virtual void tb_LineInserted(object sender, LineInsertedEventArgs e) { for (int i = 0; i < Count; i++) if (items[i].LineIndex >= e.Index) { items[i].LineIndex = items[i].LineIndex + e.Count; }else if (items[i].LineIndex == e.Index - 1 && e.Count == 1) { if(tb[e.Index - 1].StartSpacesCount == tb[e.Index - 1].Count) items[i].LineIndex = items[i].LineIndex + e.Count; } } public override void Dispose() { tb.LineInserted -= tb_LineInserted; tb.LineRemoved -= tb_LineRemoved; } public override IEnumerator GetEnumerator() { foreach (var item in items) yield return item; } public override void Add(int lineIndex, string bookmarkName) { Add(new Bookmark(tb, bookmarkName ?? "Bookmark " + counter, lineIndex)); } public override void Add(int lineIndex) { Add(new Bookmark(tb, "Bookmark " + counter, lineIndex)); } public override void Clear() { items.Clear(); counter = 0; } public override void Add(Bookmark bookmark) { foreach (var bm in items) if (bm.LineIndex == bookmark.LineIndex) return; items.Add(bookmark); counter++; tb.Invalidate(); } public override bool Contains(Bookmark item) { return items.Contains(item); } public override bool Contains(int lineIndex) { foreach (var item in items) if (item.LineIndex == lineIndex) return true; return false; } public override void CopyTo(Bookmark[] array, int arrayIndex) { items.CopyTo(array, arrayIndex); } public override int Count { get { return items.Count; } } public override bool IsReadOnly { get { return false; } } public override bool Remove(Bookmark item) { tb.Invalidate(); return items.Remove(item); } /// /// Removes bookmark by line index /// public override bool Remove(int lineIndex) { bool was = false; for (int i = 0; i < Count; i++) if (items[i].LineIndex == lineIndex) { items.RemoveAt(i); i--; was = true; } tb.Invalidate(); return was; } /// /// Returns Bookmark by index. /// public override Bookmark GetBookmark(int i) { return items[i]; } } /// /// Bookmark of FastColoredTextbox /// public class Bookmark { public FastColoredTextBox TB { get; private set; } /// /// Name of bookmark /// public string Name { get; set; } /// /// Line index /// public int LineIndex {get; set; } /// /// Color of bookmark sign /// public Color Color { get; set; } /// /// Scroll textbox to the bookmark /// public virtual void DoVisible() { TB.Selection.Start = new Place(0, LineIndex); TB.DoRangeVisible(TB.Selection, true); TB.Invalidate(); } public Bookmark(FastColoredTextBox tb, string name, int lineIndex) { this.TB = tb; this.Name = name; this.LineIndex = lineIndex; Color = tb.BookmarkColor; } public virtual void Paint(Graphics gr, Rectangle lineRect) { var size = TB.CharHeight - 1; using (var brush = new LinearGradientBrush(new Rectangle(0, lineRect.Top, size, size), Color.White, Color, 45)) gr.FillEllipse(brush, 0, lineRect.Top, size, size); using (var pen = new Pen(Color)) gr.DrawEllipse(pen, 0, lineRect.Top, size, size); } } }