using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
namespace FastColoredTextBoxNS
{
/// <summary>
/// Collection of bookmarks
/// </summary>
public class Bookmarks : ICollection<Bookmark>, IDisposable
{
FastColoredTextBox tb;
List<Bookmark> items = new List<Bookmark>();
int counter;
public Bookmarks(FastColoredTextBox tb)
{
this.tb = tb;
tb.LineInserted += tb_LineInserted;
tb.LineRemoved += tb_LineRemoved;
}
void tb_LineRemoved(object sender, LineRemovedEventArgs e)
{
for(int i=0; i<Count; i++)
if (items[i].LineIndex >= e.Index)
{
if (items[i].LineIndex < e.Index + e.Count)
{
items.RemoveAt(i);
i--;
}
else
{
items[i].LineIndex = items[i].LineIndex - e.Count;
}
}
}
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;
}
}
public void Dispose()
{
tb.LineInserted -= tb_LineInserted;
tb.LineRemoved -= tb_LineRemoved;
}
public IEnumerator<Bookmark> GetEnumerator()
{
foreach (var item in items)
yield return item;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public virtual void Add(int lineIndex, string bookmarkName)
{
Add(new Bookmark(tb, bookmarkName ?? "Bookmark " + counter, lineIndex));
}
public virtual void Add(int lineIndex)
{
Add(new Bookmark(tb, "Bookmark " + counter, lineIndex));
}
public void Clear()
{
items.Clear();
counter = 0;
}
public void Add(Bookmark bookmark)
{
foreach (var bm in items)
if (bm.LineIndex == bookmark.LineIndex)
return;
items.Add(bookmark);
counter++;
tb.Invalidate();
}
public bool Contains(Bookmark item)
{
return items.Contains(item);
}
public bool Contains(int lineIndex)
{
foreach (var item in items)
if (item.LineIndex == lineIndex)
return true;
return false;
}
public void CopyTo(Bookmark[] array, int arrayIndex)
{
items.CopyTo(array, arrayIndex);
}
public int Count
{
get { return items.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
public bool Remove(Bookmark item)
{
tb.Invalidate();
return items.Remove(item);
}
/// <summary>
/// Removes bookmark by line index
/// </summary>
public 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;
}
}
/// <summary>
/// Bookmark of FastColoredTextbox
/// </summary>
public class Bookmark
{
public FastColoredTextBox TB { get; private set; }
/// <summary>
/// Name of bookmark
/// </summary>
public string Name { get; set; }
/// <summary>
/// Line index
/// </summary>
public int LineIndex {get; set; }
/// <summary>
/// Color of bookmark sign
/// </summary>
public Color Color { get; set; }
/// <summary>
/// Scroll textbox to the bookmark
/// </summary>
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);
}
}
}