2016-08-01 18:54:47 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using Gtk;
|
2016-08-01 19:16:10 +00:00
|
|
|
|
using System.Security.Policy;
|
2016-08-01 18:54:47 +00:00
|
|
|
|
|
2016-08-01 19:26:20 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>A namespace that contains everything I've pulled from SilentorBit's website.</para>
|
|
|
|
|
/// <para>Currently contains: class ListView (https://silentorbit.com/notes/2011/05/gtk-sharp-listview/).</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
namespace Ext.SilentorBit
|
2016-08-01 18:54:47 +00:00
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// <para>A single column list, text comes from object.ToString()</para>
|
|
|
|
|
/// <para>For multicolumns, see ListView<ClassType></para>
|
|
|
|
|
/// <para>By SilentorBit from https://silentorbit.com/notes/2011/05/gtk-sharp-listview/</para>
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ListView : ListView<object>
|
|
|
|
|
{
|
|
|
|
|
public ListView (string columnTitle) : base(columnTitle)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void RenderCell (CellRendererText render, int index, object item)
|
|
|
|
|
{
|
|
|
|
|
render.Text = item.ToString ();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The list only contains one type of object.
|
|
|
|
|
/// To get multiple columns, pass that number of parameters to the constructor
|
|
|
|
|
/// and implement RenderCell accordingly.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public abstract class ListView<T> : TreeView
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// List of all items selected
|
|
|
|
|
/// </summary>
|
|
|
|
|
public T[] SelectedItems { get; private set; }
|
|
|
|
|
public event Action<T[]> ItemSelected;
|
|
|
|
|
public event Action<T> ItemActivated;
|
|
|
|
|
|
2016-08-01 19:16:10 +00:00
|
|
|
|
public bool ResizeableColumns { get; set; } = true;
|
|
|
|
|
|
2016-08-01 18:54:47 +00:00
|
|
|
|
protected abstract void RenderCell (CellRendererText render, int index, T item);
|
|
|
|
|
|
|
|
|
|
ListStore store = new ListStore (typeof(T));
|
|
|
|
|
Dictionary<T, TreeIter> storeList = new Dictionary<T, TreeIter> ();
|
|
|
|
|
List<TreeViewColumn> columns = new List<TreeViewColumn> ();
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Pass one string parameter for every column
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="columnNames">
|
|
|
|
|
/// Column Titles, one parameter for each column.
|
|
|
|
|
/// </param>
|
|
|
|
|
public ListView (params string[] columnNames)
|
|
|
|
|
{
|
|
|
|
|
this.Model = store;
|
|
|
|
|
foreach (string s in columnNames) {
|
|
|
|
|
TreeViewColumn c = this.AppendColumn (s, new CellRendererText (), this.ColumnCellData);
|
2016-08-01 19:16:10 +00:00
|
|
|
|
c.Resizable = ResizeableColumns; // Make the column resizeable - Added by Starbeamrainbowlabs
|
2016-08-01 18:54:47 +00:00
|
|
|
|
columns.Add (c);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.SelectedItems = new T[0];
|
|
|
|
|
this.Selection.Changed += HandleSelectionChanged;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ColumnCellData (TreeViewColumn column, CellRenderer renderer, ITreeModel model, TreeIter iter)
|
|
|
|
|
{
|
|
|
|
|
T item = (T)model.GetValue (iter, 0);
|
|
|
|
|
CellRendererText textRender = (CellRendererText)renderer;
|
|
|
|
|
int index = columns.IndexOf (column);
|
|
|
|
|
RenderCell (textRender, index, item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region Add, Remove and Clear Items
|
|
|
|
|
|
|
|
|
|
public void AddItem (T item)
|
|
|
|
|
{
|
|
|
|
|
var iter = store.AppendValues (item);
|
|
|
|
|
storeList.Add (item, iter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ClearItems ()
|
|
|
|
|
{
|
|
|
|
|
store.Clear ();
|
|
|
|
|
storeList.Clear ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RemoveItem (T item)
|
|
|
|
|
{
|
|
|
|
|
if (! storeList.ContainsKey (item))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
TreeIter iter = storeList[item];
|
|
|
|
|
store.Remove (ref iter);
|
|
|
|
|
storeList.Remove (item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Selection and Aktivation triggers
|
|
|
|
|
|
|
|
|
|
void HandleSelectionChanged (object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
TreeSelection selection = (TreeSelection)sender;
|
|
|
|
|
TreePath[] paths = selection.GetSelectedRows ();
|
|
|
|
|
T[] items = new T[paths.Length];
|
|
|
|
|
for (int n = 0; n < paths.Length; n++) {
|
|
|
|
|
TreeIter iter;
|
|
|
|
|
Model.GetIter (out iter, paths[n]);
|
|
|
|
|
items[n] = (T)Model.GetValue (iter, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SelectedItems = items;
|
|
|
|
|
|
|
|
|
|
var itemEvent = ItemSelected;
|
|
|
|
|
if (itemEvent != null)
|
|
|
|
|
itemEvent (items);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnRowActivated (TreePath path, TreeViewColumn column)
|
|
|
|
|
{
|
|
|
|
|
TreeIter iter;
|
|
|
|
|
Model.GetIter (out iter, path);
|
|
|
|
|
T item = (T)Model.GetValue (iter, 0);
|
|
|
|
|
|
|
|
|
|
var e = ItemActivated;
|
|
|
|
|
if (e != null)
|
|
|
|
|
e (item);
|
|
|
|
|
|
|
|
|
|
base.OnRowActivated (path, column);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|