NEU
This commit is contained in:
256
FastColoredTextBox/Bookmarks.cs
Normal file
256
FastColoredTextBox/Bookmarks.cs
Normal file
@@ -0,0 +1,256 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user