aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.SharedUI/Controls
diff options
context:
space:
mode:
authorVictoria Plitt <Victoria.Plitt@twine-s.com>2020-04-06 08:32:13 +0200
committerVictoria Plitt <Victoria.Plitt@twine-s.com>2020-04-06 08:32:13 +0200
commited96ea77cd47adda9373b73201a026b85c03d206 (patch)
tree5d2f868170767c9e4316ac4b373d1af71b87df9d /Software/Visual_Studio/Tango.SharedUI/Controls
parent44c91de2b71d128d9b47e240ee6f4e58b6b8544e (diff)
downloadTango-ed96ea77cd47adda9373b73201a026b85c03d206.tar.gz
Tango-ed96ea77cd47adda9373b73201a026b85c03d206.zip
MultiSelectComboBox . Added template selectors. Not completed yet.
Diffstat (limited to 'Software/Visual_Studio/Tango.SharedUI/Controls')
-rw-r--r--Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs289
1 files changed, 264 insertions, 25 deletions
diff --git a/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs
index 66eaa4e14..94f263be7 100644
--- a/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs
+++ b/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs
@@ -16,35 +16,126 @@ using System.Windows.Navigation;
using System.Windows.Shapes;
using Tango.Core.Commands;
using System.ComponentModel;
+using System.Windows.Controls.Primitives;
+using System.Windows.Threading;
namespace Tango.SharedUI.Controls
{
+ internal sealed class MultiSelectComboBoxTemplateSelector : DataTemplateSelector
+ {
+ public override DataTemplate SelectTemplate(object item, DependencyObject container)
+ {
+ FrameworkElement element = container as FrameworkElement;
+ if (element != null && item != null && item is MultiSelectComboBoxItem)
+ return element.FindResource("CheckItem") as DataTemplate;
+
+ return element.FindResource("SearchItem") as DataTemplate; ;
+
+ }
+ }
+
+ interface IMultiSelectComboBoxItem
+ {
+ string Text { get; set; }
+ }
+ public class MultiSelectComboBoxItem : IMultiSelectComboBoxItem
+ {
+ public string Text { get; set; }
+ public MultiSelectComboBoxItem(string text)
+ {
+ Text = text;
+ }
+ public override string ToString()
+ {
+ return Text;
+ }
+ }
+ public class MultiSelectComboBoxSearchItem : IMultiSelectComboBoxItem
+ {
+ public string Text { get; set; }
+ public MultiSelectComboBoxSearchItem(string text = "")
+ {
+ Text = text;
+ }
+ public override string ToString()
+ {
+ return Text;
+ }
+ }
+
+ [TemplatePart(Name = MultiSelectComboBox.PartEditor, Type = typeof(TextBox))]
+ [TemplatePart(Name = MultiSelectComboBox.PartPopup, Type = typeof(Popup))]
public class MultiSelectComboBox : Control
{
+ #region Fields
+ public const string PartEditor = "Edit_PART";
+ public const string PartPopup = "MultiSel_Popup";
+ private ItemsControl _items_control;
+ private bool _isLoaded;
+ #endregion
+ #region "Constructors"
+
static MultiSelectComboBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MultiSelectComboBox), new FrameworkPropertyMetadata(typeof(MultiSelectComboBox)));
}
-
public MultiSelectComboBox() : base()
{
+ SelectedItemsList = new ObservableCollection<object>();
RemoveAllCommand = new RelayCommand((() => SelectedItemsList.Clear()), () => SelectedItemsList != null && SelectedItemsList.Count > 0);
- RemoveItemCommand = new RelayCommand<string>((item) => SelectedItemsList.Remove(item), () => SelectedItemsList != null);
- AddItemCommand = new RelayCommand<string>((item) => SelectedItemsList.Add(item));
- SearchText = "";
+ RemoveItemCommand = new RelayCommand<MultiSelectComboBoxItem>((item) => SelectedItemsList.Remove(item), () => SelectedItemsList != null);
+ AddItemCommand = new RelayCommand<string>((item) => SelectedItemsList.Add(new MultiSelectComboBoxItem(item)));
+ SearchText = new MultiSelectComboBoxSearchItem();
+ Loaded += MultiSelectComboBox_Loaded;
+ _isLoaded = false;
+
+
}
+ #endregion
#region Properties
- public ObservableCollection<string> SelectedItemsList
+ private TextBox _editor;
+
+ public TextBox Editor
{
- get { return (ObservableCollection<string>)GetValue(SelectedItemsListProperty); }
+ get { return _editor; }
+ set { _editor = value; }
+ }
+
+ private Popup _popup;
+
+ public Popup Popup
+ {
+ get { return _popup; }
+ set { _popup = value; }
+ }
+
+ private DispatcherTimer _fetchTimer;
+
+ public DispatcherTimer FetchTimer
+ {
+ get { return _fetchTimer; }
+ set { _fetchTimer = value; }
+ }
+
+ //private SelectionAdapter _selectionAdapter;
+
+ //public SelectionAdapter SelectionAdapter
+ //{
+ // get { return _selectionAdapter; }
+ // set { _selectionAdapter = value; }
+ //}
+
+ public ObservableCollection<object> SelectedItemsList
+ {
+ get { return (ObservableCollection<object>)GetValue(SelectedItemsListProperty); }
set { SetValue(SelectedItemsListProperty, value); }
}
public static readonly DependencyProperty SelectedItemsListProperty =
- DependencyProperty.Register("SelectedItemsList", typeof(ObservableCollection<string>), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<string>)));
+ DependencyProperty.Register("SelectedItemsList", typeof(ObservableCollection<object>), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<object>)));
public ListCollectionView SearchItemsList
@@ -67,23 +158,21 @@ namespace Tango.SharedUI.Controls
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(ObservableCollection<string>), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<string>)));
-
-
+
public bool IsToggleChecked
{
get { return (bool)GetValue(IsToggleCheckedProperty); }
set { SetValue(IsToggleCheckedProperty, value); }
}
- public static readonly DependencyProperty IsToggleCheckedProperty =
- DependencyProperty.Register("IsToggleChecked", typeof(bool), typeof(MultiSelectComboBox), new PropertyMetadata(false));
-
+ public static readonly DependencyProperty IsToggleCheckedProperty =
+ DependencyProperty.Register("IsToggleChecked", typeof(bool), typeof(MultiSelectComboBox), new FrameworkPropertyMetadata(false));
- private string _searchText;
+ private MultiSelectComboBoxSearchItem _searchText;
/// <summary>
/// Gets or sets the search text of TextBox.
/// </summary>
- public string SearchText
+ public MultiSelectComboBoxSearchItem SearchText
{
get { return _searchText; }
set {_searchText = value;
@@ -91,15 +180,47 @@ namespace Tango.SharedUI.Controls
OnTextChanged();
}
}
+ #endregion
+
+ private void MultiSelectComboBox_Loaded(object sender, RoutedEventArgs e)
+ {
+ if (!_isLoaded)
+ {
+ ToggleButton b2 = GetTemplateChild("MultiSelToggleButton") as ToggleButton;
+ if (b2 != null)
+ {
+ // ct.LoadContent();
+ _items_control = b2.Template.FindName("SelectedItemsControl", b2) as ItemsControl;
+ if (_items_control != null)
+ {
+ var wrapPanel = _items_control.FindChild<WrapPanel>();
+ if (wrapPanel != null)
+ {
+ _items_control.Bind(ItemsControl.HeightProperty, wrapPanel, WrapPanel.ActualHeightProperty, BindingMode.OneWay);
+ _isLoaded = true;
+
+ var searchItem =(_items_control.ItemContainerGenerator.ContainerFromItem(SearchText));
+ Editor = searchItem.FindVisualChildren< TextBox>().FirstOrDefault(x => x.Name == PartEditor);
+ if (Editor != null)
+ {
+ Editor.TextChanged += OnEditorTextChanged;
+ Editor.PreviewKeyDown += OnEditorKeyDown;
+ Editor.LostFocus += OnEditorLostFocus;
+ }
+ }
+ }
+ }
+ }
+ }
void OnTextChanged()
{
if(SearchItemsList != null)
{
- if (String.IsNullOrEmpty(SearchText))
+ if (String.IsNullOrEmpty(SearchText.Text))
SearchItemsList.Filter = null;
else
- SearchItemsList.Filter = new Predicate<object>(o => ((string)o == SearchText));
+ SearchItemsList.Filter = new Predicate<object>(o => ((string)o == SearchText.Text));
}
}
/// <summary>
@@ -115,10 +236,7 @@ namespace Tango.SharedUI.Controls
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
}
-
-
- #endregion
-
+
/// <summary>
/// When overridden in a derived class, is invoked whenever application code or internal processes call <see cref="M:System.Windows.FrameworkElement.ApplyTemplate" />.
/// </summary>
@@ -126,8 +244,51 @@ namespace Tango.SharedUI.Controls
{
base.OnApplyTemplate();
if (SelectedItemsList == null)
- SelectedItemsList = new ObservableCollection<string>();
+ SelectedItemsList = new ObservableCollection<object>();
+ SelectedItemsList.Add(SearchText);
+
+
SearchItemsList = new ListCollectionView(this.Items);
+
+ //DataTemplate temp = Template.FindName("SearchItem", this) as DataTemplate;
+ //Editor = Template.FindName(PartEditor, this) as TextBox;
+ Popup = Template.FindName(PartPopup, this) as Popup;
+ //ItemsSelector = Template.FindName(PartSelector, this) as Selector;
+ //_partSelectedContent = Template.FindName("PART_SelectedContent", this) as ContentControl;
+ // BindingEvaluator = new BindingEvaluator(new Binding(DisplayMember));
+
+ if (Editor != null)
+ {
+ Editor.TextChanged += OnEditorTextChanged;
+ Editor.PreviewKeyDown += OnEditorKeyDown;
+ Editor.LostFocus += OnEditorLostFocus;
+ Editor.Focus();
+
+ //if (SelectedItem != null)
+ //{
+ // Editor.Text = BindingEvaluator.Evaluate(SelectedItem);
+ //}
+
+ }
+
+ this.GotFocus += SelTextBox_GotFocus;
+
+ if (Popup != null)
+ {
+ Popup.StaysOpen = false;
+ Popup.Opened += OnPopupOpened;
+ Popup.Closed += OnPopupClosed;
+ }
+ //if (ItemsSelector != null)
+ //{
+ // SelectionAdapter = new SelectionAdapter(ItemsSelector);
+ // SelectionAdapter.Commit += OnSelectionAdapterCommit;
+ // SelectionAdapter.Cancel += OnSelectionAdapterCancel;
+ // SelectionAdapter.SelectionChanged += OnSelectionAdapterSelectionChanged;
+ // ItemsSelector.PreviewMouseDown += ItemsSelector_PreviewMouseDown;
+ //}
+
+ //_isUpdatingText = false;
//ItemsControl iControl = FindName("asd") as ItemsControl;
//iControl.ItemContainerGenerator.ItemsChanged += ItemContainerGenerator_ItemsChanged;
@@ -139,10 +300,89 @@ namespace Tango.SharedUI.Controls
//}
}
+ private void OnEditorTextChanged(object sender, TextChangedEventArgs e)
+ {
+ if (FetchTimer == null)
+ {
+ FetchTimer = new DispatcherTimer();
+ FetchTimer.Interval = TimeSpan.FromMilliseconds(500);
+ FetchTimer.Tick += OnFetchTimerTick;
+ }
+ FetchTimer.IsEnabled = false;
+ FetchTimer.Stop();
+ // SetSelectedItem(null);
+ if (Editor.Text.Length > 0)
+ {
+ // IsLoading = true;
+ IsToggleChecked = true;
+ // ItemsSelector.ItemsSource = null;
+ FetchTimer.IsEnabled = true;
+ FetchTimer.Start();
+ }
+ else
+ {
+ IsToggleChecked = false;
+ }
+ }
+
+ private void OnFetchTimerTick(object sender, EventArgs e)
+ {
+ FetchTimer.IsEnabled = false;
+ FetchTimer.Stop();
+ }
+
+ private void OnEditorKeyDown(object sender, KeyEventArgs e)
+ {
+ //if (SelectionAdapter != null)
+ {
+ if (IsToggleChecked)
+ {
+ // SelectionAdapter.HandleKeyDown(e);
+ }
+ else
+ IsToggleChecked = e.Key == Key.Down || e.Key == Key.Up;
+ }
+ }
+
+ private void OnEditorLostFocus(object sender, RoutedEventArgs e)
+ {
+ if (!IsKeyboardFocusWithin)
+ {
+ IsToggleChecked = false;
+ }
+ }
+
+ private void SelTextBox_GotFocus(object sender, RoutedEventArgs e)
+ {
+ Editor?.Focus();
+ }
+
+ private void OnPopupOpened(object sender, EventArgs e)
+ {
+ //ItemsSelector.SelectedItem = SelectedItem;
+ }
+ private void OnPopupClosed(object sender, EventArgs e)
+ {
+ OnSelectionAdapterCommit();
+
+ }
private void ItemContainerGenerator_ItemsChanged(object sender, System.Windows.Controls.Primitives.ItemsChangedEventArgs e)
{
}
+ private void OnSelectionAdapterCommit()
+ {
+ IsToggleChecked = false;
+ // if (ItemsSelector.SelectedItem != null)
+ // {
+ // SelectedItem = ItemsSelector.SelectedItem;
+ // _isUpdatingText = true;
+ // Editor.Text = GetDisplayText(ItemsSelector.SelectedItem);
+ // SetSelectedItem(ItemsSelector.SelectedItem);
+ // _isUpdatingText = false;
+ // IsDropDownOpen = false;
+ // }
+ }
#region Commands
/// <summary>
@@ -158,10 +398,10 @@ namespace Tango.SharedUI.Controls
/// <summary>
/// The remove item from SelectedItemsList command property
/// </summary>
- public static DependencyProperty RemoveItemCommandProperty = DependencyProperty.Register("RemoveItemCommand", typeof(RelayCommand<string>), typeof(MultiSelectComboBox));
- public RelayCommand<string> RemoveItemCommand
+ public static DependencyProperty RemoveItemCommandProperty = DependencyProperty.Register("RemoveItemCommand", typeof(RelayCommand<MultiSelectComboBoxItem>), typeof(MultiSelectComboBox));
+ public RelayCommand<MultiSelectComboBoxItem> RemoveItemCommand
{
- get { return (RelayCommand<string>)GetValue(RemoveItemCommandProperty); }
+ get { return (RelayCommand<MultiSelectComboBoxItem>)GetValue(RemoveItemCommandProperty); }
private set { SetValue(RemoveItemCommandProperty, value); }
}
@@ -174,7 +414,6 @@ namespace Tango.SharedUI.Controls
}
#endregion
-
}
}