113 lines
2.7 KiB
C#
113 lines
2.7 KiB
C#
|
using AppKit;
|
|||
|
using CoreGraphics;
|
|||
|
using Foundation;
|
|||
|
|
|||
|
namespace Cauldron.Macos.SourceList
|
|||
|
{
|
|||
|
public class SourceListDelegate : NSOutlineViewDelegate
|
|||
|
{
|
|||
|
#region Private variables
|
|||
|
|
|||
|
private SourceListView _controller;
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Constructors
|
|||
|
|
|||
|
public SourceListDelegate(SourceListView controller)
|
|||
|
{
|
|||
|
this._controller = controller;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Override Methods
|
|||
|
|
|||
|
public override bool ShouldEditTableColumn(NSOutlineView outlineView,
|
|||
|
NSTableColumn tableColumn, NSObject item)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public override NSCell GetCell(NSOutlineView outlineView, NSTableColumn tableColumn,
|
|||
|
NSObject item)
|
|||
|
{
|
|||
|
nint row = outlineView.RowForItem(item);
|
|||
|
return tableColumn.DataCellForRow(row);
|
|||
|
}
|
|||
|
|
|||
|
public override bool IsGroupItem(NSOutlineView outlineView, NSObject item)
|
|||
|
{
|
|||
|
return ((SourceListItem)item).HasChildren;
|
|||
|
}
|
|||
|
|
|||
|
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn,
|
|||
|
NSObject item)
|
|||
|
{
|
|||
|
NSTableCellView view;
|
|||
|
|
|||
|
// Is this a group item?
|
|||
|
if (((SourceListItem)item).IsHeader)
|
|||
|
{
|
|||
|
view = (NSTableCellView)outlineView.MakeView("HeaderCell", this);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
view = (NSTableCellView)outlineView.MakeView("DataCell", this);
|
|||
|
view.ImageView.Image = ((SourceListItem)item).Icon;
|
|||
|
view.TextField.LineBreakMode = NSLineBreakMode.CharWrapping;
|
|||
|
view.TextField.UsesSingleLineMode = false;
|
|||
|
view.TextField.MaximumNumberOfLines = 0;
|
|||
|
}
|
|||
|
|
|||
|
view.TextField.StringValue = ((SourceListItem)item).Title;
|
|||
|
view.TextField.SetBoundsSize(CalculateTextFieldHeight(view));
|
|||
|
|
|||
|
return view;
|
|||
|
}
|
|||
|
|
|||
|
public override bool ShouldSelectItem(NSOutlineView outlineView, NSObject item)
|
|||
|
{
|
|||
|
return (outlineView.GetParent(item) != null);
|
|||
|
}
|
|||
|
|
|||
|
public override void SelectionDidChange(NSNotification notification)
|
|||
|
{
|
|||
|
NSIndexSet selectedIndexes = _controller.SelectedRows;
|
|||
|
|
|||
|
// More than one item selected?
|
|||
|
if (selectedIndexes.Count > 1)
|
|||
|
{
|
|||
|
// Not handling this case
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Grab the item
|
|||
|
var item = _controller.Data.ItemForRow((int)selectedIndexes.FirstIndex);
|
|||
|
|
|||
|
// Was an item found?
|
|||
|
if (item != null)
|
|||
|
{
|
|||
|
// Fire the clicked event for the item
|
|||
|
item.RaiseClickedEvent();
|
|||
|
|
|||
|
// Inform caller of selection
|
|||
|
_controller.RaiseItemSelected(item);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private static CGSize CalculateTextFieldHeight(NSTableCellView cell)
|
|||
|
{
|
|||
|
CGRect rect = new(0, 0, cell.TextField.Bounds.Width, double.MaxValue);
|
|||
|
NSString str = new(cell.TextField.StringValue);
|
|||
|
CGRect bounds = str.BoundingRectWithSize(rect.Size, 0,
|
|||
|
new NSDictionary(NSStringAttributeKey.Font, cell.TextField.Font));
|
|||
|
|
|||
|
return new CGSize(cell.TextField.Bounds.Width, bounds.Size.Height);
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|