Click here to Skip to main content
15,892,697 members
Articles / Web Development / HTML

My Personal Commander Variant

Rate me:
Please Sign up or sign in to vote.
4.66/5 (13 votes)
5 Oct 2016CPOL14 min read 44.6K   1.2K   47  
A C#/WPF application for displaying folders on a grid and performing combined functions on them.
// This file is part of the Lobster.MPCV application
// Copyright: Andreas Raczek
// This file is published under the The Code Project Open License (CPOL) 
// See the file "CPOL.html" for the full license governing this code.

using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;
using System.Windows.Input;
using System.Xml.Serialization;
using Lobster.Components.Collections.Joiner;
using Lobster.MVVM;

namespace Lobster.MPCV.VM
{
    /// <summary>
    /// Represents the contents of a tabsheet in the main window
    /// </summary>
    public class FolderBrowserGridVM : Lobster.MVVM.UIElementVM
    {
        public FolderBrowserGridVM() :
            this("Loaded Tab")
        {
        }

        public FolderBrowserGridVM(string tabName) :
            base(tabName)
        {
#if OLDGRIDPROPERTYMODE
            AddRow = new Lobster.MVVM.DelegateCommand(
                (o) => _AddRow());
            
            RemoveRow = new Lobster.MVVM.DelegateCommand(
                (o) => _RemoveRow(), 
                (o) => folderSets.Count > 1);

            AddBrowser = new Lobster.MVVM.DelegateCommand(
                (o) => _AddBrowser());

            RemoveBrowser = new Lobster.MVVM.DelegateCommand(
                (o) => _RemoveBrowser(),
                (o) => _CanRemoveBrowser());

            EndPropertyMode = new DelegateCommand(
                (o) => { 
                    PropertyMode = false;
                    });
#endif
            folderBrowserJoiner.CreateItemBox = (item) =>
            {
                return new FolderBrowserInfoVM(this, item);
            };

            folderSets.CollectionChanged += folderSets_CollectionChanged;

            CloseTab = new DelegateCommand(
                (o) => OnRequestClose(), 
                (o) => DisplayName != "+");            

            toolbarCommands = new ObservableCollection<UICommandVM>();

            toolbarViewSource = new CollectionViewSource();
            toolbarViewSource.Source = toolbarCommands;
            toolbarViewSource.Filter += (object sender, FilterEventArgs e) => 
            {
                var i = (UICommandVM) e.Item;
                e.Accepted = i.Command.Length > 0;
            };
            toolbarCommands.CollectionChanged += (o, e) =>
            {
                UpdateToolbar();

                if (e.NewItems != null)
                {
                    foreach (var i in e.NewItems)
                    {
                        var tbc = (UICommandVM)i;
                        tbc.PropertyChanged += (io, ie) =>
                        {
                            UpdateToolbar();
                        };
                    }
                }
            };

            EndEditing = false;

            TokenReplacer = new Util.CommandTokenReplacer(this);
        }

        public FolderBrowserSetVM AddRow()
        {
            var psvm = new FolderBrowserSetVM();
            folderSets.Add(psvm);
            psvm.InitNew();
            return psvm;
        }

#if OLDGRIDPROPERTYMODE
        private void _RemoveRow()
        {
            if (folderSets.Count > 0)
            {
                var toRemove = folderSets[folderSets.Count - 1];
                folderSets.Remove(toRemove);
            }
        }

        private bool _CanRemoveBrowser() 
        {
            var toDel = SelectedFolderBrowserInfo;
            if (toDel == null) return false;

            return FolderSets[toDel.Y].Items.Count > 1;
        }

        private void _RemoveBrowser()
        {
            var toDel = SelectedFolderBrowserInfo;
            if (toDel == null) return;

            FolderSets[toDel.Y].Items.RemoveAt(toDel.X);
        }

        private void _AddBrowser()
        {
            var toAdd = SelectedFolderBrowserInfo;
            if (toAdd == null) return;

            FolderSets[toAdd.Y].Items.Insert(
                toAdd.X + 1,
                new FolderBrowserVM()); 
        }
#endif

        void folderSets_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.OldItems != null) {
                foreach (var i in e.OldItems)
                {
                    var oci = (FolderBrowserSetVM) i;
                    folderBrowserJoiner.Collections.Remove(oci.Items);
                }
            }

            if (e.NewItems != null) {
                foreach (var i in e.NewItems) 
                {
                    var oci = (FolderBrowserSetVM)i;
                    folderBrowserJoiner.Collections.Add(oci.Items);
                }
            }
        }

        public void InitNew() 
        {
            for (int i=0; i<2; i++) 
            {
                AddRow();
            }
        }

        private ObservableCollection<FolderBrowserSetVM> folderSets = new ObservableCollection<FolderBrowserSetVM>();

        [XmlArrayItem(typeof(FolderBrowserSetVM))]
        [XmlArray]        
        public ObservableCollection<FolderBrowserSetVM> FolderSets
        {
            get
            {
                return folderSets;
            }
        }

#if OLDGRIDPROPERYMODE
        [XmlIgnore]
        public ICommand AddRow { get; private set; }

        [XmlIgnore]
        public ICommand RemoveRow { get; private set; }

        [XmlIgnore]
        public ICommand AddBrowser { get; private set; }

        [XmlIgnore]
        public ICommand RemoveBrowser { get; private set; }

        [XmlIgnore]
        public ICommand EndPropertyMode { get; private set; }

        private bool propertyMode = false;

        [XmlIgnore]
        public bool PropertyMode { 
            get { return propertyMode; }
            set {
                if (value != propertyMode) {
                    propertyMode = value;

                    if (propertyMode == false) {                        
                        UpdateToolbar();
                    }

                    OnPropertyChanged("PropertyMode");
                }
            }
        }
#endif
        [XmlIgnore]
        public ICommand CloseTab { get; private set; }

        private void UpdateToolbar() 
        {
            // Stop listening to execute events, as we are not sure if they are still 
            // present after the refresh ...
            foreach (var i in EnabledToolbarCommands)
            {
                var tbc = (UICommandVM)i;
                // tbc.ReplaceTokens = null;
                tbc.TokenReplacer = null;
            }

            // Make the toolbar view source reflect the changes done to it
            toolbarViewSource.View.Refresh();

            // Listen to execute events
            foreach (var i in EnabledToolbarCommands) 
            {
                var tbc = (UICommandVM) i;
                // tbc.ReplaceTokens = Toolbar_ReplaceCommandTokens;
                tbc.TokenReplacer = this.TokenReplacer;
            }
        }

        [XmlIgnore]
        public Util.CommandTokenReplacer TokenReplacer
        {
            get;
            private set;
        }

#if OLDGRIDPROPERTYMODE
        /// <summary>
        /// Used by DataGrid in old Property Panel
        /// </summary>
        [XmlIgnore]
        public IItemBox<FolderBrowserVM> SelectedFolderBrowserInfo 
        {
            get; set;
        }
#endif

        [XmlIgnore]
        private ObservableCollectionJoiner<FolderBrowserVM> folderBrowserJoiner = new ObservableCollectionJoiner<FolderBrowserVM>();

        /// <summary>
        /// Lists all folderbrowsers in the grid for linear display. The ItemBox also
        /// adds functionality for acquiring the index of items in the collection.
        /// </summary>
        [XmlIgnore]
        public ReadOnlyObservableCollection<ItemBox<FolderBrowserVM>> FolderBrowserInfo 
        {
            get {
                return folderBrowserJoiner.JoinedCollection;
            }
        }

        #region RequestClose [event]

        /// <summary>
        /// Raised when this workspace should be removed from the UI.
        /// </summary>
        public event EventHandler RequestClose;

        void OnRequestClose()
        {
            EventHandler handler = this.RequestClose;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }

        #endregion // RequestClose [event]

        /// <summary>
        /// Performs post-XML-Loading operation. Not all information
        /// is serialized via ctor and XML, information depending on
        /// the deserialized XML is generated afterwards.
        /// </summary>
        internal void OnLoaded()
        {
            foreach (var fbi in FolderBrowserInfo) 
            {
                ((FolderBrowserInfoVM) fbi).OnLoaded();
            }

            UpdateToolbar();
        }

        private ObservableCollection<UICommandVM> toolbarCommands;
        public ObservableCollection<UICommandVM> ToolbarCommands {
            get {
                return toolbarCommands;
            }
        }

        [XmlIgnore]
        private CollectionViewSource toolbarViewSource;
        public ICollectionView EnabledToolbarCommands {
            get {
                return toolbarViewSource.View;
            }
        }

        public bool IsEmpty()
        {
            return this.FolderSets.Count() == 0;
        }


        private bool endEditing;
        [XmlIgnore]
        public bool EndEditing
        {
            get
            {
                return endEditing;
            }
            set
            {
                if (value == endEditing) return;
                endEditing = value;
                OnPropertyChanged("EndEditing");
            }
        }
    }
}

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 Code Project Open License (CPOL)


Written By
Software Developer
Germany Germany
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions