//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------- namespace System.Activities.Presentation.Internal.PropertyEditing.Selection { using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows; using System.Diagnostics.CodeAnalysis; using System.Activities.Presentation; // <summary> // Helper static class that attempts to resolve a given SelectionPath into the corresponding // visual in the CategoryList control. // </summary> internal static class SelectionPathResolver { private static Dictionary<string, ISelectionPathInterpreter> _interpreters; [SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")] static SelectionPathResolver() { // Register known SelectionPath interpreters // SelectionPathResolver.RegisterInterpreter(CategoryContainerSelectionPathInterpreter.Instance); SelectionPathResolver.RegisterInterpreter(CategoryEditorSelectionPathInterpreter.Instance); SelectionPathResolver.RegisterInterpreter(PropertySelectionPathInterpreter.Instance); } private static void RegisterInterpreter(ISelectionPathInterpreter interpreter) { if (interpreter == null) { throw FxTrace.Exception.ArgumentNull("interpreter"); } if (_interpreters == null) { _interpreters = new Dictionary<string, ISelectionPathInterpreter>(); } if (_interpreters.ContainsKey(interpreter.PathTypeId)) { Debug.Fail(string.Format(System.Globalization.CultureInfo.CurrentCulture, "ISelectionPathInterpreter for path type of ID '{0}' already registered. Ignoring.", interpreter.PathTypeId)); } else { _interpreters[interpreter.PathTypeId] = interpreter; } } // <summary> // Attempt to resolve the given SelectionPath into the corresponding visual in the // specified CategoryList control. // </summary> // <param name="root">CategoryList control instance to look in</param> // <param name="path">SelectionPath to resolve</param> // <returns>Corresponding visual, if found, null otherwise</returns> public static DependencyObject ResolveSelectionPath(CategoryList root, SelectionPath path, out bool pendingGeneration) { pendingGeneration = false; if (root == null || path == null) { return null; } ISelectionPathInterpreter interpreter; if (!_interpreters.TryGetValue(path.PathTypeId, out interpreter)) { return null; } return interpreter.ResolveSelectionPath(root, path, out pendingGeneration); } } } |