private void parseType(
            Type type,
            string propertyPath,
            TreeNode node,
            ApplicationEventFilter sourceFilter)
        {
            //Type type = parseObject.GetType();
            //TreeNode result = new TreeNode(type.Name);

            string pathRoot = propertyPath;

            foreach (PropertyInfo pi in type.GetProperties())
            {
                var childNode = new TreeNode(pi.Name);

                propertyPath = pathRoot;

                if (!pi.PropertyType.IsValueType && pi.PropertyType != typeof (String) &&
                    pi.PropertyType != typeof (object))
                {
                    propertyPath += pi.Name + ".";
                    parseType(pi.PropertyType, propertyPath, childNode, sourceFilter);
                    // Those are not for filtering onto
                    childNode.ImageIndex = 3;
                }
                else
                {
                    // Those to enable and disable and setup filters

                    // The long way with entry candidate is choosen in order to spare duplicate iteration
                    // via the filters collection.
                    FilterEntry entryCandidate = null;

                    string currentPath = propertyPath + pi.Name;

                    if (sourceFilter != null) entryCandidate = sourceFilter.FilterEntries[currentPath];
                    //
                    if (entryCandidate == null)
                    {
                        entryCandidate = new FilterEntry(currentPath);
                        _filter.FilterEntries.Add(entryCandidate);
                    }

                    childNode.ImageIndex = (entryCandidate.Enabled == false) ? 1 : 2;

                    propertyPath = pathRoot;

                    childNode.Tag = entryCandidate;
                }

                node.Nodes.Add(childNode);
            }
        }
 private void reAssignOnChangeHandler(FilterEntry oldFilter, FilterEntry newFilter)
 {
     oldFilter.Changed -= filterEntryChanged;
     newFilter.Changed += filterEntryChanged;
 }
 /// <summary>
 ///     <para>
 ///       Initializes a new instance of <see cref='Tools..FilterEntryCollection'/> containing any array of <see cref='Tools..FilterEntry'/> objects.
 ///    </para>
 /// </summary>
 /// <param name='value'>
 ///       A array of <see cref='Tools..FilterEntry'/> objects with which to intialize the collection
 /// </param>
 public FilterEntryCollection(FilterEntry[] value)
 {
     AddRange(value);
 }
 /// <summary>
 /// <para>Inserts a <see cref='Tools..FilterEntry'/> into the <see cref='Tools..FilterEntryCollection'/> at the specified index.</para>
 /// </summary>
 /// <param name='index'>The zero-based index where <paramref name='value'/> should be inserted.</param>
 /// <param name=' value'>The <see cref='Tools..FilterEntry'/> to insert.</param>
 /// <returns><para>None.</para></returns>
 /// <seealso cref='Tools..FilterEntryCollection.Add'/>
 public void Insert(int index, FilterEntry value)
 {
     List.Insert(index, value);
 }
 /// <summary>
 ///    <para> Removes a specific <see cref='Tools..FilterEntry'/> from the 
 ///    <see cref='Tools..FilterEntryCollection'/> .</para>
 /// </summary>
 /// <param name='value'>The <see cref='Tools..FilterEntry'/> to remove from the <see cref='Tools..FilterEntryCollection'/> .</param>
 /// <returns><para>None.</para></returns>
 /// <exception cref='System.ArgumentException'><paramref name='value'/> is not found in the Collection. </exception>
 public void Remove(FilterEntry value)
 {
     value.Changed -= filterEntryChanged;
     List.Remove(value);
     OnChanged();
 }
 /// <summary>
 ///    <para>Returns the index of a <see cref='Tools..FilterEntry'/> in 
 ///       the <see cref='Tools..FilterEntryCollection'/> .</para>
 /// </summary>
 /// <param name='value'>The <see cref='Tools..FilterEntry'/> to locate.</param>
 /// <returns>
 /// <para>The index of the <see cref='Tools..FilterEntry'/> of <paramref name='value'/> in the 
 /// <see cref='Tools..FilterEntryCollection'/>, if found; otherwise, -1.</para>
 /// </returns>
 /// <seealso cref='Tools..FilterEntryCollection.Contains'/>
 public int IndexOf(FilterEntry value)
 {
     return List.IndexOf(value);
 }
 /// <summary>
 /// <para>Copies the <see cref='Tools..FilterEntryCollection'/> values to a one-dimensional <see cref='System.Array'/> instance at the 
 ///    specified index.</para>
 /// </summary>
 /// <param name='array'><para>The one-dimensional <see cref='System.Array'/> that is the destination of the values copied from <see cref='Tools..FilterEntryCollection'/> .</para></param>
 /// <param name='index'>The index in <paramref name='array'/> where copying begins.</param>
 /// <returns>
 ///   <para>None.</para>
 /// </returns>
 /// <exception cref='System.ArgumentException'><para><paramref name='array'/> is multidimensional.</para> <para>-or-</para> <para>The number of elements in the <see cref='Tools..FilterEntryCollection'/> is greater than the available space between <paramref name='arrayIndex'/> and the end of <paramref name='array'/>.</para></exception>
 /// <exception cref='System.ArgumentNullException'><paramref name='array'/> is <see langword='null'/>. </exception>
 /// <exception cref='System.ArgumentOutOfRangeException'><paramref name='arrayIndex'/> is less than <paramref name='array'/>'s lowbound. </exception>
 /// <seealso cref='System.Array'/>
 public void CopyTo(FilterEntry[] array, int index)
 {
     List.CopyTo(array, index);
 }
 /// <summary>
 /// <para>Gets a value indicating whether the 
 ///    <see cref='Tools..FilterEntryCollection'/> contains the specified <see cref='Tools..FilterEntry'/>.</para>
 /// </summary>
 /// <param name='value'>The <see cref='Tools..FilterEntry'/> to locate.</param>
 /// <returns>
 /// <para><see langword='true'/> if the <see cref='Tools..FilterEntry'/> is contained in the collection; 
 ///   otherwise, <see langword='false'/>.</para>
 /// </returns>
 /// <seealso cref='Tools..FilterEntryCollection.IndexOf'/>
 public bool Contains(FilterEntry value)
 {
     return List.Contains(value);
 }
 /// <summary>
 /// <para>Copies the elements of an array to the end of the <see cref='Tools..FilterEntryCollection'/>.</para>
 /// </summary>
 /// <param name='value'>
 ///    An array of type <see cref='Tools..FilterEntry'/> containing the objects to add to the collection.
 /// </param>
 /// <returns>
 ///   <para>None.</para>
 /// </returns>
 /// <seealso cref='Tools..FilterEntryCollection.Add'/>
 public void AddRange(FilterEntry[] value)
 {
     for (int i = 0; (i < value.Length); i = (i + 1))
     {
         Add(value[i]);
     }
 }
        /// <summary>
        ///    <para>Adds a <see cref='Tools..FilterEntry'/> with the specified value to the 
        ///    <see cref='Tools..FilterEntryCollection'/> .</para>
        /// </summary>
        /// <param name='value'>The <see cref='Tools..FilterEntry'/> to add.</param>
        /// <returns>
        ///    <para>The index at which the new element was inserted.</para>
        /// </returns>
        /// <seealso cref='Tools..FilterEntryCollection.AddRange'/>
        public int Add(FilterEntry value)
        {
            FilterEntry nv = GetEntry(value.Path);

            if (nv != null)
            {
                throw new ArgumentException("Can't add the item with duplicate path of " + nv.Path);
            }
            int ret = List.Add(value);
            value.Changed += filterEntryChanged;
            OnChanged();
            return ret;
        }