aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.SharedUI/Controls/MultiSelectComboBox.cs
blob: 153b36804f819c2d44c71c63126c35e80c37976c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tango.Synchronization
{
    /// <summary>
    /// Represents a database comparison exception.
    /// </summary>
    /// <seealso cref="System.Exception" />
    public class DataBaseComparisonException : Exception
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="DataBaseComparisonException"/> class.
        /// </summary>
        /// <param name="message">The message that describes the error.</param>
        public DataBaseComparisonException(String message) : base(message)
        {

        }
    }
}
>270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Tango.Core.Commands;
using System.ComponentModel;
using System.Windows.Controls.Primitives;
using System.Windows.Threading;
using System.Diagnostics;

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

        }
    }
    
    [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(RemoveAllSelectedItems, CanRemoveAllSelectedItems);
            RemoveItemCommand = new RelayCommand<MultiSelectComboBoxItem>(RemoveSelectedItem);
            AddItemCommand = new RelayCommand<string>(AddSelectedItem);
            SearchText = new MultiSelectComboBoxSearchItem();
            Loaded += MultiSelectComboBox_Loaded;
            _isLoaded = false;


        }
        #endregion

        #region Properties

        private TextBox _editor;

        public TextBox Editor
        {
            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; }
        }

        public ObservableCollection<object> SelectedItemsList
        {
            get { return (ObservableCollection<object>)GetValue(SelectedItemsListProperty); }
            set { SetValue(SelectedItemsListProperty, value); }
        }
        
        public static readonly DependencyProperty SelectedItemsListProperty =
            DependencyProperty.Register("SelectedItemsList", typeof(ObservableCollection<object>), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<object>)));

 
        public ListCollectionView SearchItemsList
        {
            get { return (ListCollectionView)GetValue(SearchItemsListProperty); }
            set { SetValue(SearchItemsListProperty, value); }
        }
        /// <summary>
        /// The search items list property for popup items list
        /// </summary>
        public static readonly DependencyProperty SearchItemsListProperty =
            DependencyProperty.Register("SearchItemsList", typeof(ListCollectionView), typeof(MultiSelectComboBox), new PropertyMetadata(default(ObservableCollection<string>)));

        public ObservableCollection<string> Items
        {
            get { return (ObservableCollection<string>)GetValue(ItemsProperty); }
            set { SetValue(ItemsProperty, value); }
        }

        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 FrameworkPropertyMetadata(false));

        private MultiSelectComboBoxSearchItem _searchText;
        /// <summary>
        /// Gets or sets the search text of TextBox.
        /// </summary>
        public MultiSelectComboBoxSearchItem SearchText
        {
            get { return _searchText; }
            set
            {
                _searchText = value;
                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;
                                Editor.GotFocus += OnEditorGotFocus;
                            }
                        }
                    }
                    this.GotFocus += SelTextBox_GotFocus;
                }
            }
        }

        void OnTextChanged()
        {
            if(SearchItemsList != null)
            {
                if (String.IsNullOrEmpty(SearchText.Text))
                   SearchItemsList.Filter = null;
                else
                    SearchItemsList.Filter = new Predicate<object>(o => (((string)o).ToLower().Contains(SearchText.Text.ToLower())));
            }
        }
        /// <summary>
        /// When overridden in a derived class, is invoked whenever application code or internal processes call <see cref="M:System.Windows.FrameworkElement.ApplyTemplate" />.
        /// </summary>
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            if (SelectedItemsList == null)
                SelectedItemsList = new ObservableCollection<object>();
            SelectedItemsList.Add(SearchText);
            
            SearchItemsList = new ListCollectionView(this.Items);
            Popup = Template.FindName(PartPopup, this) as Popup;
           

            if (Popup != null)
            {
                Popup.StaysOpen = false;
                Popup.Opened += OnPopupOpened;
                Popup.Closed += OnPopupClosed;
            }
        }

        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();
            IsToggleChecked = true;
               
            FetchTimer.IsEnabled = true;
            FetchTimer.Start();
           
        }

        private void OnFetchTimerTick(object sender, EventArgs e)
        {
            FetchTimer.IsEnabled = false;
            FetchTimer.Stop();
            SearchText.Text = Editor.Text;
            OnTextChanged();
        }

        private void OnEditorKeyDown(object sender, KeyEventArgs e)
        {
            IsToggleChecked = true;
        }

        private void OnEditorLostFocus(object sender, RoutedEventArgs e)
        {
            if (!IsKeyboardFocusWithin)
            {
                IsToggleChecked = false;
            }
        }

        private void SelTextBox_GotFocus(object sender, RoutedEventArgs e)
        {
            Editor?.Focus();
        }

        private void OnEditorGotFocus(object sender, RoutedEventArgs e)
        {
            IsToggleChecked = true;
        }

        private void OnPopupOpened(object sender, EventArgs e)
        {
            
        }
        private void OnPopupClosed(object sender, EventArgs e)
        {
            IsToggleChecked = false;

        }
        #region Commands
        /// <summary>
        /// The remove all command property for clear SelectedItemsList
        /// </summary>
        public static DependencyProperty RemoveAllCommandProperty = DependencyProperty.Register("RemoveAllCommand", typeof(RelayCommand), typeof(MultiSelectComboBox));
        public RelayCommand RemoveAllCommand
        {
            get { return (RelayCommand)GetValue(RemoveAllCommandProperty); }
            private set { SetValue(RemoveAllCommandProperty, value); }
        }

        /// <summary>
        /// The remove item from SelectedItemsList command property
        /// </summary>
        public static DependencyProperty RemoveItemCommandProperty = DependencyProperty.Register("RemoveItemCommand", typeof(RelayCommand<MultiSelectComboBoxItem>), typeof(MultiSelectComboBox));
        public RelayCommand<MultiSelectComboBoxItem> RemoveItemCommand
        {
            get { return (RelayCommand<MultiSelectComboBoxItem>)GetValue(RemoveItemCommandProperty); }
            private set { SetValue(RemoveItemCommandProperty, value); }
        }

        /// <summary>
        /// The add item to SelectedItemsList command property
        /// </summary>
        public static DependencyProperty AddItemCommandProperty = DependencyProperty.Register("AddItemCommand", typeof(RelayCommand<string>), typeof(MultiSelectComboBox));
        public RelayCommand<string> AddItemCommand
        {
            get { return (RelayCommand<string>)GetValue(AddItemCommandProperty); }
            private set { SetValue(AddItemCommandProperty, value); }
        }

        /// <summary>
        /// Removes the selected item.
        /// </summary>
        /// <param name="item">The item.</param>
        private void RemoveSelectedItem(IMultiSelectComboBoxItem item)
        {
            SelectedItemsList.Remove(item);
            RemoveAllCommand.RaiseCanExecuteChanged();
        }

        /// <summary>
        /// Adds the selected item.
        /// </summary>
        /// <param name="item">The item.</param>
        private void AddSelectedItem(string item)
        {
            if (SelectedItemsList.Any(x => (x as IMultiSelectComboBoxItem).Text == item))
                return;
            SelectedItemsList.Insert(SelectedItemsList.Count - 1, new MultiSelectComboBoxItem(item));
            RemoveAllCommand.RaiseCanExecuteChanged();
        }
        /// <summary>
        /// Removes all selected items.
        /// </summary>
        private void RemoveAllSelectedItems()
        {
            int index = SelectedItemsList.Count - 2;
            while (index >= 0)
            {
                SelectedItemsList.RemoveAt(index--);
             }
            RemoveAllCommand.RaiseCanExecuteChanged();
        }
        private bool CanRemoveAllSelectedItems()
        {
            return (SelectedItemsList != null && SelectedItemsList.Count > 1);
        }
        #endregion


    }
}