using System;
using System.Windows;
using System.Windows.Media;

namespace LogicalAndVisulTrees
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Console.WriteLine("************************************");
            Console.WriteLine("DRZEWO LOGICZNE: \n");
            GetLogicalTree(this, 0);
            Console.WriteLine("************************************");
        }

        protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);
            Console.WriteLine("****************************************************");
            Console.WriteLine("DRZEWO PREZENTACJI: \n");
            GetVisualTree(this,0);
            Console.WriteLine("****************************************************");
        }
        void GetLogicalTree(object obj, int level)
        {
            //określona liczba miejsc od lewej strony
            string space = new string(' ', level);
            //wypisanie danych obiektu do konsoli
            Console.WriteLine(String.Format("{0}{1}) {2}", space, level, obj.GetType().Name));
            //jeżeli dany obiekt nie jest obiektem DependencyObject - return
            if (!(obj is DependencyObject)) return;
            //pętla rekurencyjnie wywołujące metodę GetLogicatTree dla kolejnych elementów - dzieci
            foreach (object logicalChild in LogicalTreeHelper.GetChildren(
                obj as DependencyObject))
                GetLogicalTree(logicalChild, level+1);
        }
        void GetVisualTree(DependencyObject obj, int level)
        {
            //określona liczba miejsc od lewej strony
            string space = new string(' ', level);
            //wypisanie danych obiektu do konsoli
            Console.WriteLine(String.Format("{0}{1}) {2}", space, level, obj.GetType().Name));
            //pętla rekurencyjnie wywołująca metodę GetVisualTree dla kolejnych elementów - dzieci
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
                GetVisualTree(VisualTreeHelper.GetChild(obj, i), level + 1);


        }
    }
}
