~halega/+junk/sharpdevelop

« back to all changes in this revision

Viewing changes to src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/UserControls/Common/VisualTreeHelperUtil.cs

  • Committer: sk
  • Date: 2011-09-10 05:17:57 UTC
  • Revision ID: halega@halega.com-20110910051757-qfouz1llya9m6boy
4.1.0.7915 Release Candidate 1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
 
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
 
3
 
 
4
#region Usings
 
5
 
 
6
using System.Collections.Generic;
 
7
using System.Linq;
 
8
using System.Windows;
 
9
using System.Windows.Media;
 
10
using System.Windows.Media.Media3D;
 
11
 
 
12
#endregion
 
13
 
 
14
namespace ICSharpCode.Data.EDMDesigner.Core.UI.UserControls.Common
 
15
{
 
16
    public class VisualTreeHelperUtil
 
17
    {
 
18
        public static T GetControlAscendant<T>(object reference) where T : DependencyObject
 
19
        {
 
20
            return GetControlAscendant<T>(reference as DependencyObject);
 
21
        }
 
22
        public static T GetControlAscendant<T>(DependencyObject reference) where T : DependencyObject
 
23
        {
 
24
            if (reference == null || !(reference is Visual || reference is Visual3D))
 
25
                return null;
 
26
            DependencyObject parent = reference;
 
27
            try
 
28
            {
 
29
                while (!((parent = VisualTreeHelper.GetParent(parent)) == null || parent is T)) ;
 
30
                return (T)parent;
 
31
            }
 
32
            catch
 
33
            {
 
34
                return null;
 
35
            }
 
36
        }
 
37
 
 
38
        public static bool IsAscendant(DependencyObject parent, DependencyObject child)
 
39
        {
 
40
            if (parent == null || child == null)
 
41
                return false;
 
42
            DependencyObject parentTmp = child;
 
43
            while (!((parentTmp = VisualTreeHelper.GetParent(parentTmp)) == null || parentTmp == parent)) ;
 
44
            return parentTmp != null;
 
45
        }
 
46
 
 
47
        public static IEnumerable<T> GetControlsDecendant<T>(object reference) where T : DependencyObject
 
48
        {
 
49
            return GetControlsDecendant<T>(reference as DependencyObject);
 
50
        }
 
51
        public static IEnumerable<T> GetControlsDecendant<T>(DependencyObject reference) where T : DependencyObject
 
52
        {
 
53
            if (reference == null)
 
54
                yield break; 
 
55
            int nbChildren = VisualTreeHelper.GetChildrenCount(reference);
 
56
            for (int index = 0; index < nbChildren; index++)
 
57
            {
 
58
                var child = VisualTreeHelper.GetChild(reference, index);
 
59
                T value = child as T;
 
60
                if (value != null)
 
61
                    yield return value;
 
62
                foreach (var childValue in GetControlsDecendant<T>(child))
 
63
                    yield return childValue;
 
64
            }
 
65
            yield break;
 
66
        }
 
67
 
 
68
        public static FrameworkElement GetFocusedElement(DependencyObject reference)
 
69
        {
 
70
            return VisualTreeHelperUtil.GetControlsDecendant<FrameworkElement>(reference).FirstOrDefault(fe => fe.IsFocused);
 
71
        }
 
72
    }
 
73
}