JD2022-TU1/main/tools/framework/JD.Pickers/PickerControls/Picker.cs

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));
}
}
}
}
}
}
}