Click here to Skip to main content
15,886,830 members
Articles / Desktop Programming / WPF

WPF Breadcrumb Folder TextBox

Rate me:
Please Sign up or sign in to vote.
4.41/5 (10 votes)
15 Jan 2009LGPL36 min read 100.8K   1.7K   71  
This article provides an implementation of a WPF Breadcrumb control, and describes how to develop one.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Controls;
using System.Diagnostics;
using QuickZip.UserControls.Breadcrumb.View;
using System.Windows.Media;
using QuickZip.UserControls.Breadcrumb.Framework;
using System.Windows;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Threading;
using System.Windows.Input;

namespace QuickZip.UserControls.Breadcrumb.Presenter
{
    public class AutoCompleteTextBoxPresenter : PresenterBase<View.AutoCompleteTextBoxView>
    {
        private string _selectedPath = "";        
        private BreadcrumbItemBase _currentPresenter = null;
        internal BreadcrumbItemBase _root = null;
        private string[] _suggestions = new string[] { };
        private Visibility _visibility;

        public Visibility Visibility { get { return _visibility; } set { _visibility = value; } }
        public bool IsVisible { get { return Visibility == Visibility.Visible; } }
        public BreadcrumbItemBase Root { get { return _root; } }
        public string SelectedPath { get { return _selectedPath; } set { ChangeSelectedPath(value); } }
        public string[] Suggestions { get { return _suggestions; } set { _suggestions = value; OnPropertyChanged("Suggestions"); } }        

        public AutoCompleteTextBoxPresenter(View.AutoCompleteTextBoxView view)
            : base(view)
        {
            view.TextChanged += delegate { SelectedPath = view.Text; };
        }


        public void ChangeSelectedPath(string value)
        {
            if (value == "") return;

            _selectedPath = value.EndsWith(":") ? value + "\\" : value;            
            OnPropertyChanged("SelectedPath");
            try
            {

                if (IsVisible && Root != null && _selectedPath != "")
                {
                    BreadcrumbItemBase folderPresenter = Root.LookupFolder(BreadcrumbItemBase.PathType.ptFolder,
                        _selectedPath.EndsWith(":\\") ? _selectedPath : Path.GetDirectoryName(_selectedPath));

                    if (folderPresenter != null)
                    {
                        _currentPresenter = folderPresenter;

                        if (_currentPresenter.SubFolders.Length == 0)
                        {
                            folderPresenter.PropertyChanged += new PropertyChangedEventHandler(folderPresenter_PropertyChanged);
                            folderPresenter.ScheduleLoad();
                        }
                        else loadSubFolders();
                    }
                    else Suggestions = new string[] { };
                }
            } catch  { };
        }

        private void loadSubFolders()
        {
            if (Keyboard.FocusedElement == View)
            {
                if (_currentPresenter == null)
                    Suggestions = new string[] { };
                else
                {
                    List<string> retVal = new List<string>();
                    foreach (BreadcrumbItemBase subFolder in _currentPresenter.ActualSubFolders)
                    {
                        string logicalPath = Root.ConvertPath(BreadcrumbItemBase.PathType.ptDisplay, subFolder.FolderPath);
                        if (logicalPath.ToLower().StartsWith(_selectedPath.ToLower()))
                            retVal.Add(logicalPath);
                    }
                    Suggestions = retVal.ToArray();

                }
                View.CheckPopupIsOpen();
            }
        }

        void folderPresenter_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "SubFolders")
                if (_currentPresenter != null)
                    _currentPresenter.PropertyChanged -= new PropertyChangedEventHandler(folderPresenter_PropertyChanged);
            _dispatcher.Invoke(
                            new ThreadStart(delegate
                            {
                                loadSubFolders();
                            }));
        }





    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Founder
Hong Kong Hong Kong

Comments and Discussions