示例#1
0
        private TreeViewItemEx SearchNext(TreeViewItemEx item, Boolean first)
        {
            TreeViewItemEx result = null;

            if (first && item.HasItems)
            {
                result = (TreeViewItemEx)item.Items[0];
            }
            else
            {
                int index = item.ParentItems.IndexOf(item);
                if (index == -1)
                {
                    return(null);
                }

                if (item.ParentItems.Count > (index + 1))
                {
                    // В текущий коллекции найден следующий элемент
                    result = (TreeViewItemEx)item.ParentItems[index + 1];
                }
                else
                {
                    // Перебор по родителям, любой следующий дочерний элемент будет найденным
                    result = SearchNext(item.ParentItem, false);
                }
            }

            return(result);
        }
示例#2
0
        public TreeViewItemEx(TreeView treeView, TreeViewItemEx parent)
        {
            _tree       = treeView;
            _parentItem = parent;

            if (parent == null)
            {
                _parentItems = _tree.Items;
            }
            else
            {
                _parentItems = parent.Items;
            }

            StackPanel stack = new StackPanel();

            stack.Orientation = Orientation.Horizontal;
            Header            = stack;
            // Uncomment this code If you want to add an Image after the Node-HeaderText
            // textBlock = new TextBlock();
            // textBlock.VerticalAlignment = VerticalAlignment.Center;
            // stack.Children.Add(textBlock);
            _image = new Image();
            _image.VerticalAlignment = VerticalAlignment.Center;
            _image.Margin            = new Thickness(0, 0, 4, 0);
            _image.Width             = IMAGE_SIZE;
            _image.Height            = IMAGE_SIZE;
            _image.Source            = _iconSource;
            stack.Children.Add(_image);

            // Add the HeaderText After Adding the icon
            _textBlock = new TextBlock();
            _textBlock.VerticalAlignment = VerticalAlignment.Center;
            stack.Children.Add(_textBlock);
        }
示例#3
0
        public TreeViewItemEx SearchPrev(TreeViewItemEx item)
        {
            int index = ParentItems.IndexOf(item);

            if (index == -1)
            {
                return(null);
            }

            TreeViewItemEx result = null;

            if (index != 0)
            {
                // В текущий коллекции найден предыдущий элемент
                result = (TreeViewItemEx)ParentItems[index - 1];
            }
            else if (ParentItem != null)
            {
                result = ParentItem;
            }
            else
            {
                // Перебор по родителям, любой следующий дочерний элемент будет найденным
                result = SearchPrev(ParentItem);
            }

            return(result);
        }
示例#4
0
        private void SetDragOverItem(TreeViewItemEx item)
        {
            if (_dragOverItem != item)
            {
                // Смена выделения
                // Удаление предыдущего выделения
                if (_dragOverItem != null)
                {
                    SetSelectItemColor(_dragOverItem, false);
                }

                // Установка нового выделения (если выделение не содержится в текущих перемещаемых элементах)
                if (item != null)
                {
                    int index = SelectedItems.IndexOf(item);
                    if (index == -1)
                    {
                        SetSelectItemColor(item, true);
                        _dragOverItem = item;
                    }
                }
                else
                {
                    _dragOverItem = null;
                }
            }
        }
示例#5
0
        public virtual int Compare(Object x, Object y)
        {
            TreeViewItemEx localX = x as TreeViewItemEx;
            TreeViewItemEx localY = y as TreeViewItemEx;

            int result = String.Compare(localX.Text, localY.Text);

            return(result);
        }
示例#6
0
        public TreeViewItemEx Add(TreeViewItemEx parent, String text, String imageUri, Object tag)
        {
            TreeViewItemEx item = new TreeViewItemEx(PART_treeView, parent);

            item.Text     = text;
            item.ImageUri = imageUri;
            item.Tag      = tag;

            Add(parent, item);

            return(item);
        }
示例#7
0
        private void TreeView_MouseDoubleClick(Object sender, MouseButtonEventArgs e)
        {
            if (OnDoubleClick != null)
            {
                TreeViewItemEx item = SelectedItem;

                if (item != null)
                {
                    OnDoubleClick(item);
                }
            }
        }
示例#8
0
        private Boolean SelectedWithShift(TreeViewItemEx selectedItem)
        {
            if (_selectedItems.Count > 0)
            {
                // Уже был выделен элемент: Удаление всех
                TreeViewItemEx firstItem = _selectedItems[0];
                // Сброс предыдущего выделенного списка
                foreach (TreeViewItemEx item in _selectedItems)
                {
                    SetSelectItemColor(item, false);
                }
                _selectedItems.Clear();

                // Добавление всех элементов от первого до нового выделенного
                // Определение направления прохода (вверх или вниз)
                int firstIndex = firstItem.Index;
                int lastIndex  = selectedItem.Index;

                Boolean inc = (firstIndex < lastIndex) ? true : false;

                do
                {
                    // Добавление в список выделенных
                    _selectedItems.Add(firstItem);

                    if (firstItem == selectedItem)
                    {
                        break;
                    }

                    if (inc)
                    {
                        firstItem = firstItem.NextItem;
                    }
                    else
                    {
                        firstItem = firstItem.PrevItem;
                    }
                } while (firstItem != null);

                // Визульаное выделение элементов
                foreach (TreeViewItemEx item in _selectedItems)
                {
                    SetSelectItemColor(item, true);
                }

                return(true);
            }

            return(false);
        }
示例#9
0
        public void Remove(TreeViewItemEx item)
        {
            if (item != null)
            {
                TreeViewItemEx parent = item.ParentItem;

                if (parent == null)
                {
                    PART_treeView.Items.Remove(item);
                }
                else
                {
                    parent.Items.Remove(item);
                }
            }
        }
示例#10
0
 private void SetSelectItemColor(TreeViewItemEx item, Boolean select)
 {
     if (select)
     {
         item.BorderBrush = Gui.HexToColor("#adc6e5");
         // item.BorderThickness = new Thickness(1.5);
         item.Background = (Brush)this.FindResource("brushSelected");
         item.Foreground = Brushes.Black;
     }
     else
     {
         item.BorderBrush = null;
         item.Background  = Brushes.White;
         item.Foreground  = Brushes.Black;
     }
 }
示例#11
0
        private void TreeView_SelectedItemChanged(Object sender, RoutedPropertyChangedEventArgs <Object> e)
        {
            TreeViewItemEx selectedItem = PART_treeView.SelectedItem as TreeViewItemEx;

            if (selectedItem == null)
            {
                return;
            }

            // Удаление текущего выделения
            selectedItem.IsSelected = false;
            selectedItem.Focus();

            // Выделение с нажатым "Shift"
            if (Keyboarder.IsShift == true)
            {
                // Выделение обработано функцией
                if (SelectedWithShift(selectedItem) == true)
                {
                    return;
                }
            }

            // Выделение с нажатым "Control"
            if (Keyboarder.IsControl == false)
            {
                // Сброс предыдущего выделенного списка
                foreach (TreeViewItemEx item in _selectedItems)
                {
                    SetSelectItemColor(item, false);
                }

                _selectedItems.Clear();
            }

            // Добавление нового элемента в список
            SetSelectItemColor(selectedItem, true);
            _selectedItems.Add(selectedItem);

            // Передача события
            if (OnSelectedItem != null)
            {
                OnSelectedItem(selectedItem, null);
            }
        }
示例#12
0
        private int SearchSort(ItemCollection coll, TreeViewItemEx item)
        {
            int count = coll.Count;

            if (_sortDirection != SortDirection.None)
            {
                for (int index = 0; index < count; index++)
                {
                    Object curr = coll[index];

                    if (_sorter.Compare(curr, item) == (int)_sortDirection)
                    {
                        return(index);
                    }
                }
            }

            return(count);
        }
示例#13
0
        public TreeViewControl()
        {
            InitializeComponent();

            // Конфигурация работы "Веделение элементов"
            _selectedItems = new List<TreeViewItemEx>();
            PART_treeView.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(TreeView_SelectedItemChanged);
            PART_treeView.MouseDoubleClick += new MouseButtonEventHandler(TreeView_MouseDoubleClick);

            // Конфигурация работы "Drag&Drop"
            _dragDrop = new DragDroper();
            _dragDrop.Init(PART_treeView, TreeView_DragDrop);
            _dragOverItem = null;
            OnDragDrop    = null;

            // Конфигурация работы "DoubleClick"
            OnDoubleClick = null;

            // Настройка сортировки
            _sortDirection = SortDirection.None;
            _sorter        = new TreeViewSorter();
        }
示例#14
0
        public TreeViewControl()
        {
            InitializeComponent();

            // Конфигурация работы "Веделение элементов"
            _selectedItems = new List <TreeViewItemEx>();
            PART_treeView.SelectedItemChanged += new RoutedPropertyChangedEventHandler <object>(TreeView_SelectedItemChanged);
            PART_treeView.MouseDoubleClick    += new MouseButtonEventHandler(TreeView_MouseDoubleClick);

            // Конфигурация работы "Drag&Drop"
            _dragDrop = new DragDroper();
            _dragDrop.Init(PART_treeView, TreeView_DragDrop);
            _dragOverItem = null;
            OnDragDrop    = null;

            // Конфигурация работы "DoubleClick"
            OnDoubleClick = null;

            // Настройка сортировки
            _sortDirection = SortDirection.None;
            _sorter        = new TreeViewSorter();
        }
示例#15
0
        public TreeViewItemEx Add(TreeViewItemEx parent, TreeViewItemEx item)
        {
            ItemCollection coll;

            if (parent == null)
            {
                coll = PART_treeView.Items;
            }
            else
            {
                coll = parent.Items;
            }

            // Поиск вхождения сортировки
            int index = SearchSort(coll, item);

            // Добавление элемента
            coll.Insert(index, item);

            item.IsExpanded = true;

            return(item);
        }
示例#16
0
        public static TreeViewItemEx Search(TreeViewItemEx root, TreeViewItemEx value, Object tag)
        {
            if (root == null)
            {
                return(null);
            }

            foreach (TreeViewItemEx item in root.ParentItems)
            {
                if (tag != null)
                {
                    if (item.Tag == tag)
                    {
                        return(item);
                    }
                }
                else
                {
                    if (item == value)
                    {
                        return(item);
                    }
                }

                if (item.HasItems)
                {
                    TreeViewItemEx result = TreeViewItemEx.Search((TreeViewItemEx)item.Items[0], value, tag);
                    if (result != null)
                    {
                        return(result);
                    }
                }
            }

            return(null);
        }
示例#17
0
 public TreeViewItemEx Add(TreeViewItemEx parent, String text)
 {
     return(Add(parent, text, null, null));
 }
示例#18
0
        private void SetDragOverItem(TreeViewItemEx item)
        {
            if (_dragOverItem != item)
            {
                // Смена выделения
                // Удаление предыдущего выделения
                if (_dragOverItem != null)
                {
                    SetSelectItemColor(_dragOverItem, false);
                }

                // Установка нового выделения (если выделение не содержится в текущих перемещаемых элементах)
                if (item != null)
                {
                    int index = SelectedItems.IndexOf(item);
                    if (index == -1)
                    {
                        SetSelectItemColor(item, true);
                        _dragOverItem = item;
                    }
                }
                else
                {
                    _dragOverItem = null;
                }
            }
        }
示例#19
0
 private void SetSelectItemColor(TreeViewItemEx item, Boolean select)
 {
     if (select)
     {
         item.BorderBrush     = Gui.HexToColor("#adc6e5");
         // item.BorderThickness = new Thickness(1.5);
         item.Background      = (Brush)this.FindResource("brushSelected");
         item.Foreground      = Brushes.Black;
     }
     else
     {
         item.BorderBrush = null;
         item.Background  = Brushes.White;
         item.Foreground  = Brushes.Black;
     }
 }
示例#20
0
        public static TreeViewItemEx Search(TreeViewItemEx root, TreeViewItemEx value, Object tag)
        {
            if (root == null) return null;

            foreach (TreeViewItemEx item in root.ParentItems)
            {
                if (tag != null)
                {
                    if (item.Tag == tag)
                        return item;
                }
                else
                {
                    if (item == value)
                        return item;
                }

                if (item.HasItems)
                {
                    TreeViewItemEx result = TreeViewItemEx.Search((TreeViewItemEx)item.Items[0], value, tag);
                    if (result != null) return result;
                }
            }

            return null;
        }
示例#21
0
        public TreeViewItemEx SearchPrev(TreeViewItemEx item)
        {
            int index = ParentItems.IndexOf(item);
            if (index == -1) return null;

            TreeViewItemEx result = null;

            if (index != 0)
            {
                // В текущий коллекции найден предыдущий элемент
                result = (TreeViewItemEx)ParentItems[index - 1];
            }
            else if (ParentItem != null)
            {
                result = ParentItem;
            }
            else
            {
                // Перебор по родителям, любой следующий дочерний элемент будет найденным
                result = SearchPrev(ParentItem);
            }

            return result;
        }
示例#22
0
        private Boolean SelectedWithShift(TreeViewItemEx selectedItem)
        {
            if (_selectedItems.Count > 0)
            {
                // Уже был выделен элемент: Удаление всех
                TreeViewItemEx firstItem = _selectedItems[0];
                // Сброс предыдущего выделенного списка
                foreach (TreeViewItemEx item in _selectedItems)
                    SetSelectItemColor(item, false);
                _selectedItems.Clear();

                // Добавление всех элементов от первого до нового выделенного
                // Определение направления прохода (вверх или вниз)
                int firstIndex = firstItem.Index;
                int lastIndex  = selectedItem.Index;

                Boolean inc = (firstIndex < lastIndex) ? true : false;

                do
                {
                    // Добавление в список выделенных
                    _selectedItems.Add(firstItem);

                    if (firstItem == selectedItem)
                        break;

                    if (inc)
                        firstItem = firstItem.NextItem;
                    else
                        firstItem = firstItem.PrevItem;

                } while (firstItem != null);

                // Визульаное выделение элементов
                foreach (TreeViewItemEx item in _selectedItems)
                    SetSelectItemColor(item, true);

                return true;
            }

            return false;
        }
示例#23
0
        public TreeViewItemEx(TreeView treeView, TreeViewItemEx parent)
        {
            _tree        = treeView;
            _parentItem  = parent;

            if (parent == null) _parentItems = _tree.Items;
            else                _parentItems = parent.Items;

            StackPanel stack = new StackPanel();
            stack.Orientation = Orientation.Horizontal;
            Header = stack;
            // Uncomment this code If you want to add an Image after the Node-HeaderText
            // textBlock = new TextBlock();
            // textBlock.VerticalAlignment = VerticalAlignment.Center;
            // stack.Children.Add(textBlock);
            _image = new Image();
            _image.VerticalAlignment = VerticalAlignment.Center;
            _image.Margin = new Thickness(0, 0, 4, 0);
            _image.Width  = IMAGE_SIZE;
            _image.Height = IMAGE_SIZE;
            _image.Source = _iconSource;
            stack.Children.Add(_image);

            // Add the HeaderText After Adding the icon
            _textBlock = new TextBlock();
            _textBlock.VerticalAlignment = VerticalAlignment.Center;
            stack.Children.Add(_textBlock);
        }
示例#24
0
        public void Remove(TreeViewItemEx item)
        {
            if (item != null)
            {
                TreeViewItemEx parent = item.ParentItem;

                if (parent == null)
                    PART_treeView.Items.Remove(item);
                else
                    parent.Items.Remove(item);
            }
        }
示例#25
0
        public TreeViewItemEx Search(TreeViewItemEx item, Object tag)
        {
            TreeViewItemEx result = TreeViewItemEx.Search(Root, item, tag);

            return(result);
        }
示例#26
0
        private TreeViewItemEx SearchNext(TreeViewItemEx item, Boolean first)
        {
            TreeViewItemEx result = null;

            if (first && item.HasItems)
                result = (TreeViewItemEx)item.Items[0];
            else
            {
                int index = item.ParentItems.IndexOf(item);
                if (index == -1) return null;

                if (item.ParentItems.Count > (index + 1))
                {
                    // В текущий коллекции найден следующий элемент
                    result = (TreeViewItemEx)item.ParentItems[index + 1];
                }
                else
                {
                    // Перебор по родителям, любой следующий дочерний элемент будет найденным
                    result = SearchNext(item.ParentItem, false);
                }
            }

            return result;
        }
示例#27
0
        public TreeViewItemEx Search(TreeViewItemEx item, Object tag)
        {
            TreeViewItemEx result = TreeViewItemEx.Search(Root, item, tag);

            return result;
        }
示例#28
0
        public TreeViewItemEx Add(TreeViewItemEx parent, String text, String imageUri, Object tag)
        {
            TreeViewItemEx item = new TreeViewItemEx(PART_treeView, parent);
            item.Text     = text;
            item.ImageUri = imageUri;
            item.Tag      = tag;

            Add(parent, item);

            return item;
        }
示例#29
0
 public TreeViewItemEx Add(TreeViewItemEx parent, String text)
 {
     return Add(parent, text, null, null);
 }
示例#30
0
        private Object TreeView_DragDrop(DragDroperOperation oper, Object data)
        {
            switch (oper)
            {
            case DragDroperOperation.Start:
            {
                List <TreeViewItemEx> items = SelectedItems;

                if (items.Count > 0)
                {
                    if (CheckDragDrop(oper, items, null) == true)
                    {
                        return(items);
                    }
                }
            }
            break;

            case DragDroperOperation.Move:
            {
                if (CheckDragDrop(oper, data, null) == true)
                {
                    // Определение элемента, над которым сейчас находится курсор
                    TreeViewItemEx dragOverItem = GetDragOverItem();

                    // Выделение элемента (для подстветки позиции куда перемещается элемент
                    SetDragOverItem(dragOverItem);

                    // Возвращение результата: Можно перемещать данные
                    return(data);
                }
            }
            break;

            case DragDroperOperation.Stop:
            {
                if (CheckDragDrop(oper, data, null) == true)
                {
                    TreeViewItemEx destItem = DragDestItem;

                    if (DragDestItem == null)
                    {
                        destItem = DragOverItem;
                    }

                    if (destItem != null)
                    {
                        // Перемещение элементов на новые позиции (копирование)
                        List <TreeViewItemEx> items    = (List <TreeViewItemEx>)data;
                        List <TreeViewItemEx> newItems = new List <TreeViewItemEx>();

                        foreach (TreeViewItemEx item in items)
                        {
                            TreeViewItemEx newItem = this.Add(destItem, item.Text, item.ImageUri, item.Tag);
                            newItems.Add(newItem);
                        }

                        Boolean isMove = (Keyboarder.IsControl == false);
                        if (isMove)
                        {
                            // Операция копирования не использовалась: Операция перемещения, удаление перемещаемых элементов
                            foreach (TreeViewItemEx item in items)
                            {
                                this.Remove(item);
                            }
                        }

                        // Оповещение приложения об окончании операции
                        if (isMove)
                        {
                            CheckDragDrop(DragDroperOperation.EndMove, items, newItems);
                        }
                        else
                        {
                            CheckDragDrop(DragDroperOperation.EndCopy, items, newItems);
                        }
                    }     // end if (определен получатель операции)
                }         // end if (операция подтверждена приложением)

                // Удаление выделения (использовался в операции DragDrop)
                SetDragOverItem(null);
            }
            break;
            } // end switch (анализ операции)

            return(null);
        }
示例#31
0
        public TreeViewItemEx Add(TreeViewItemEx parent, TreeViewItemEx item)
        {
            ItemCollection coll;

            if (parent == null)
                coll = PART_treeView.Items;
            else
                coll = parent.Items;

            // Поиск вхождения сортировки
            int index = SearchSort(coll, item);
            // Добавление элемента
            coll.Insert(index, item);

            item.IsExpanded = true;

            return item;
        }
示例#32
0
        private int SearchSort(ItemCollection coll, TreeViewItemEx item)
        {
            int count = coll.Count;

            if (_sortDirection != SortDirection.None)
            {
                for (int index = 0; index < count; index++)
                {
                    Object curr = coll[index];

                    if (_sorter.Compare(curr, item) == (int)_sortDirection)
                        return index;
                }
            }

            return count;
        }