From 3202041bd09f39a4edaa0f2df2e9d511b0568a57 Mon Sep 17 00:00:00 2001
From: Nice3point <nice3point@gmail.com>
Date: Mon, 30 Dec 2024 22:40:22 +0300
Subject: [PATCH] Update context support for FamilyManager

---
 .../Descriptors/FamilyManagerDescriptor.cs    | 60 +++++++++++--------
 1 file changed, 34 insertions(+), 26 deletions(-)

diff --git a/source/RevitLookup/Core/Summary/Descriptors/FamilyManagerDescriptor.cs b/source/RevitLookup/Core/Summary/Descriptors/FamilyManagerDescriptor.cs
index 9a801aa5..c61d16d3 100644
--- a/source/RevitLookup/Core/Summary/Descriptors/FamilyManagerDescriptor.cs
+++ b/source/RevitLookup/Core/Summary/Descriptors/FamilyManagerDescriptor.cs
@@ -24,42 +24,17 @@
 
 namespace RevitLookup.Core.Summary.Descriptors;
 
-public sealed class FamilyManagerDescriptor(FamilyManager familyManager) : Descriptor, IDescriptorResolver
+public sealed class FamilyManagerDescriptor(FamilyManager familyManager) : Descriptor, IDescriptorResolver, IDescriptorResolver<Document>
 {
     public Func<IVariant>? Resolve(string target, ParameterInfo[] parameters)
     {
         return target switch
         {
-            nameof(FamilyManager.GetAssociatedFamilyParameter) => ResolveGetAssociatedFamilyParameter,
             nameof(FamilyManager.IsParameterLockable) => ResolveIsParameterLockable,
             nameof(FamilyManager.IsParameterLocked) => ResolveIsParameterLocked,
             _ => null
         };
 
-        IVariant ResolveGetAssociatedFamilyParameter()
-        {
-            var elementTypes = Context.ActiveDocument.GetElements().WhereElementIsElementType();
-            var elementInstances = Context.ActiveDocument.GetElements().WhereElementIsNotElementType();
-            var elements = elementTypes
-                .UnionWith(elementInstances)
-                .ToElements();
-
-            var variants = Variants.Values<KeyValuePair<Parameter, FamilyParameter>>(elements.Count);
-            foreach (var element in elements)
-            {
-                foreach (Parameter parameter in element.Parameters)
-                {
-                    var familyParameter = familyManager.GetAssociatedFamilyParameter(parameter);
-                    if (familyParameter is not null)
-                    {
-                        variants.Add(new KeyValuePair<Parameter, FamilyParameter>(parameter, familyParameter));
-                    }
-                }
-            }
-
-            return variants.Consume();
-        }
-
         IVariant ResolveIsParameterLockable()
         {
             var familyParameters = familyManager.Parameters;
@@ -86,4 +61,37 @@ IVariant ResolveIsParameterLocked()
             return variants.Consume();
         }
     }
+
+    Func<Document, IVariant>? IDescriptorResolver<Document>.Resolve(string target, ParameterInfo[] parameters)
+    {
+        return target switch
+        {
+            nameof(FamilyManager.GetAssociatedFamilyParameter) => ResolveGetAssociatedFamilyParameter,
+            _ => null
+        };
+
+        IVariant ResolveGetAssociatedFamilyParameter(Document context)
+        {
+            var elementTypes = context.GetElements().WhereElementIsElementType();
+            var elementInstances = context.GetElements().WhereElementIsNotElementType();
+            var elements = elementTypes
+                .UnionWith(elementInstances)
+                .ToElements();
+
+            var variants = Variants.Values<KeyValuePair<Parameter, FamilyParameter>>(elements.Count);
+            foreach (var element in elements)
+            {
+                foreach (Parameter parameter in element.Parameters)
+                {
+                    var familyParameter = familyManager.GetAssociatedFamilyParameter(parameter);
+                    if (familyParameter is not null)
+                    {
+                        variants.Add(new KeyValuePair<Parameter, FamilyParameter>(parameter, familyParameter));
+                    }
+                }
+            }
+
+            return variants.Consume();
+        }
+    }
 }
\ No newline at end of file