75 lines
2.3 KiB
C#
75 lines
2.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using JD.Collections.Extensions;
|
|
using TeaBox;
|
|
using TeaBox.Gui;
|
|
using TeaBox.Gui.PropertyGrid;
|
|
using TeaBox.Macros;
|
|
using Image = System.Drawing.Image;
|
|
|
|
namespace JD.Pickers.PickerControls
|
|
{
|
|
public class Picker<TModel, TViewModel> : ButtonExtension
|
|
where TModel : class
|
|
where TViewModel : class
|
|
{
|
|
private readonly Func<TModel, TViewModel> _createViewModel;
|
|
private IEnumerable<TModel> _availableItems;
|
|
private MultiPicker<TViewModel> _multiSelector;
|
|
private ViewModelCollection<TModel, TViewModel> _viewModels;
|
|
|
|
protected IEnumerable<TModel> AvailableItems
|
|
{
|
|
set
|
|
{
|
|
_availableItems = value;
|
|
}
|
|
}
|
|
|
|
protected ViewModelCollection<TModel, TViewModel> ViewModels
|
|
{
|
|
set
|
|
{
|
|
_viewModels = value;
|
|
}
|
|
}
|
|
|
|
public Picker(IEnumerable<TModel> availableItems, CellEditor editor, Func<TModel, TViewModel> createViewModel, Image icon)
|
|
: base(icon ?? ResourcesCached.Pick, null, editor, "Edit Collection")
|
|
{
|
|
_availableItems = availableItems;
|
|
_createViewModel = createViewModel;
|
|
}
|
|
|
|
protected override void OnClick(object sender, ExtensionActivateEventArgs e)
|
|
{
|
|
if (_viewModels == null)
|
|
{
|
|
_viewModels = new ViewModelCollection<TModel, TViewModel>(_availableItems, _createViewModel);
|
|
}
|
|
|
|
_multiSelector = new MultiPicker<TViewModel>(_viewModels);
|
|
|
|
var selection = new RowValues<TModel>(Editor.CurrentRow);
|
|
|
|
_multiSelector.Selection.AddRange(selection.Select(_viewModels.GetViewModel));
|
|
|
|
using (WindowsFormsHostEx.KeepFocusOn(Editor.Control))
|
|
{
|
|
var showDialog = _multiSelector.ShowDialog();
|
|
if (showDialog.HasValue && showDialog.Value)
|
|
{
|
|
selection.Clear();
|
|
foreach (var item in _multiSelector.Selection)
|
|
{
|
|
if (item != null)
|
|
{
|
|
selection.Add(_viewModels.GetModel(item));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|