Mesen-X/GUI.NET/Debugger/FastColoredTextBox/Bookmarks.cs

257 lines
7.2 KiB
C#
Raw Normal View History

2017-08-30 18:31:27 -04:00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
namespace FastColoredTextBoxNS
{
/// <summary>
/// Base class for bookmark collection
/// </summary>
public abstract class BaseBookmarks : ICollection<Bookmark>, 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<Bookmark> 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
}
/// <summary>
/// Collection of bookmarks
/// </summary>
public class Bookmarks : BaseBookmarks
{
protected FastColoredTextBox tb;
protected List<Bookmark> items = new List<Bookmark>();
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<Count; i++)
if (items[i].LineIndex >= 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<Bookmark> 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);
}
/// <summary>
/// Removes bookmark by line index
/// </summary>
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;
}
/// <summary>
/// Returns Bookmark by index.
/// </summary>
public override Bookmark GetBookmark(int i)
{
return items[i];
}
}
/// <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);
}
}
}