Ejemplo n.º 1
0
        public void Bind <TDataModel>(CreateBindingPageDelegate pageCreator,
                                      CreateBindingControlDelegate ctrlCreator, CreateDynamicControlsDelegate dynCtrlDescCreator,
                                      IContextProvider contextProvider,
                                      out IEnumerable <IBinding> bindings, out IRawDependencyGroup dependencies, out IMetadata[] metadata)
        {
            var type = typeof(TDataModel);

            var bindingsList = new List <IBinding>();

            bindings = bindingsList;

            var pageAttSet = GetAttributeSet(type, -1);

            OnGetPageAttributeSet(type, ref pageAttSet);

            var page = pageCreator.Invoke(pageAttSet);

            var firstCtrlId = 0;

            dependencies = new RawDependencyGroup();

            var metadataMap = new Dictionary <object, PropertyInfoMetadata>();

            CollectMetadata(type, metadataMap, new PropertyInfo[0], new List <Type>(), contextProvider);

            TraverseType <TDataModel>(type, new List <IControlDescriptor>(),
                                      ctrlCreator, dynCtrlDescCreator, page, metadataMap, bindingsList, dependencies, contextProvider, ref firstCtrlId);

            metadata = metadataMap.Values.ToArray();

            OnBeforeControlsDataLoad(bindings);
        }
Ejemplo n.º 2
0
        public void Bind <TDataModel>(TDataModel model, CreateBindingPageDelegate pageCreator,
                                      CreateBindingControlDelegate ctrlCreator,
                                      out IEnumerable <IBinding> bindings, out IRawDependencyGroup dependencies)
        {
            var type = model.GetType();

            var bindingsList = new List <IBinding>();

            bindings = bindingsList;

            var pageAttSet = GetAttributeSet(type, -1);

            OnGetPageAttributeSet(type, ref pageAttSet);

            var page = pageCreator.Invoke(pageAttSet);

            var firstCtrlId = 0;

            dependencies = new RawDependencyGroup();

            TraverseType(model.GetType(), model, new List <PropertyInfo>(),
                         ctrlCreator, page, bindingsList, dependencies, ref firstCtrlId);

            OnBeforeControlsDataLoad(bindings);

            LoadControlsData(bindings);
        }
Ejemplo n.º 3
0
        public void Init(IXApplication app, IRawDependencyGroup depGroup)
        {
            m_App = app;
            m_ControlDependencies  = new Dictionary <IBinding, List <ControlUpdateStateData> >();
            m_MetadataDependencies = new Dictionary <IMetadata, List <MetadataUpdateStateData> >();

            foreach (var data in depGroup.DependenciesTags)
            {
                var srcBnd       = data.Key;
                var dependOnTags = data.Value.Item1;
                var handler      = data.Value.Item2;

                var dependOnBindings = new IBinding[dependOnTags.Length];

                for (int i = 0; i < dependOnTags.Length; i++)
                {
                    var dependOnTag = dependOnTags[i];

                    IBinding dependOnBinding;
                    if (!depGroup.TaggedBindings.TryGetValue(dependOnTag, out dependOnBinding))
                    {
                        throw new Exception("Dependent on binding is not found for tag");
                    }

                    dependOnBindings[i] = dependOnBinding;
                }

                foreach (var dependOnBinding in dependOnBindings)
                {
                    List <ControlUpdateStateData> updates;
                    if (!m_ControlDependencies.TryGetValue(dependOnBinding, out updates))
                    {
                        dependOnBinding.ModelUpdated += OnModelUpdated;

                        updates = new List <ControlUpdateStateData>();
                        m_ControlDependencies.Add(dependOnBinding, updates);
                    }

                    updates.Add(new ControlUpdateStateData(m_App, srcBnd, dependOnBindings, handler));
                }
            }

            foreach (var data in depGroup.MetadataDependencies)
            {
                var state = new MetadataUpdateStateData(m_App, data.Key, data.Value.Item1, data.Value.Item2);

                foreach (var md in data.Value.Item1)
                {
                    if (!m_MetadataDependencies.TryGetValue(md, out List <MetadataUpdateStateData> states))
                    {
                        md.Changed += OnMetadataChanged;
                        states      = new List <MetadataUpdateStateData>();
                        m_MetadataDependencies.Add(md, states);
                    }

                    states.Add(state);
                }
            }
        }
Ejemplo n.º 4
0
        public void Load(IXApplication app, IEnumerable <IBinding> bindings,
                         IRawDependencyGroup dependencies, IMetadata[] metadata)
        {
            Bindings   = bindings;
            Dependency = new DependencyManager();
            Metadata   = metadata;

            Dependency.Init(app, dependencies);
        }
Ejemplo n.º 5
0
        public void Init(IRawDependencyGroup depGroup)
        {
            m_Dependencies = new Dictionary <IBinding, List <UpdateStateData> >();

            var handlersCache = new Dictionary <Type, IDependencyHandler>();

            foreach (var data in depGroup.DependenciesTags)
            {
                var srcBnd         = data.Key;
                var dependOnTags   = data.Value.Item1;
                var depHandlerType = data.Value.Item2;

                var dependOnBindings = new IBinding[dependOnTags.Length];

                for (int i = 0; i < dependOnTags.Length; i++)
                {
                    var dependOnTag = dependOnTags[i];

                    IBinding dependOnBinding;
                    if (!depGroup.TaggedBindings.TryGetValue(dependOnTag, out dependOnBinding))
                    {
                        throw new Exception("Dependent on binding is not fond for tag");
                    }

                    dependOnBindings[i] = dependOnBinding;
                }

                IDependencyHandler handler;

                if (!handlersCache.TryGetValue(depHandlerType, out handler))
                {
                    handler = Activator.CreateInstance(depHandlerType) as IDependencyHandler;
                    handlersCache.Add(depHandlerType, handler);
                }

                foreach (var dependOnBinding in dependOnBindings)
                {
                    List <UpdateStateData> updates;
                    if (!m_Dependencies.TryGetValue(dependOnBinding, out updates))
                    {
                        dependOnBinding.ModelUpdated += OnModelUpdated;

                        updates = new List <UpdateStateData>();
                        m_Dependencies.Add(dependOnBinding, updates);
                    }

                    updates.Add(new UpdateStateData(srcBnd, dependOnBindings, handler));
                }
            }
        }
Ejemplo n.º 6
0
        private void TraverseType <TDataModel>(Type type, List <IControlDescriptor> parents,
                                               CreateBindingControlDelegate ctrlCreator, CreateDynamicControlsDelegate dynCtrlDescCreator,
                                               IGroup parentCtrl, IReadOnlyDictionary <object, PropertyInfoMetadata> metadata,
                                               List <IBinding> bindings, IRawDependencyGroup dependencies, IContextProvider contextProvider, ref int nextCtrlId)
        {
            foreach (var prp in type.GetProperties().OrderBy(p =>
            {
                var orderAtt = p.GetCustomAttribute <OrderAttribute>();

                if (orderAtt != null)
                {
                    return(orderAtt.Order);
                }
                else
                {
                    return(0);
                }
            }))
            {
                IControlDescriptor[] ctrlDescriptors;

                var dynCtrlAtt = prp.GetCustomAttribute <DynamicControlsAttribute>();

                if (dynCtrlAtt != null)
                {
                    if (dynCtrlDescCreator != null)
                    {
                        ctrlDescriptors = dynCtrlDescCreator.Invoke(dynCtrlAtt.Tag) ?? new IControlDescriptor[0];
                    }
                    else
                    {
                        throw new DynamicControlHandlerMissingException(prp);
                    }

                    ctrlDescriptors = ctrlDescriptors.Select(d => new ControlDescriptorWrapper(d, prp)).ToArray();
                }
                else
                {
                    ctrlDescriptors = new IControlDescriptor[]
                    {
                        new PropertyInfoControlDescriptor(prp)
                    };
                }

                foreach (var ctrlDesc in ctrlDescriptors)
                {
                    var prpType = ctrlDesc.DataType;

                    var atts = GetAttributeSet(ctrlDesc, nextCtrlId);

                    if (!atts.Has <IIgnoreBindingAttribute>() && !atts.Has <IMetadataAttribute>())
                    {
                        var prpMetadata = new List <PropertyInfoMetadata>();

                        if (atts.Has <IHasMetadataAttribute>())
                        {
                            var metadataTagsAtts = atts.GetAll <IHasMetadataAttribute>();

                            foreach (var metadataTagAtts in metadataTagsAtts)
                            {
                                if (metadataTagAtts.HasMetadata)
                                {
                                    var metadataTag = metadataTagAtts.MetadataTag;

                                    if (metadataTag == null)
                                    {
                                        throw new NullReferenceException($"Metadata tag is not set for {ctrlDesc.Name}");
                                    }

                                    if (metadata.TryGetValue(metadataTag, out PropertyInfoMetadata md))
                                    {
                                        prpMetadata.Add(md);
                                    }
                                    else
                                    {
                                        throw new MissingMetadataException(metadataTag, ctrlDesc);
                                    }
                                }
                            }
                        }

                        var prpMetadataArr = prpMetadata.ToArray();

                        int numberOfUsedIds;
                        var ctrl = ctrlCreator.Invoke(prpType, atts, parentCtrl, prpMetadataArr, out numberOfUsedIds);
                        nextCtrlId += numberOfUsedIds;

                        var binding = new PropertyInfoBinding <TDataModel>(ctrl, ctrlDesc, parents, prpMetadataArr, contextProvider);
                        bindings.Add(binding);

                        if (atts.Has <IControlTagAttribute>())
                        {
                            var tag = atts.Get <IControlTagAttribute>().Tag;
                            dependencies.RegisterBindingTag(binding, tag);
                        }

                        if (atts.Has <IDependentOnAttribute>())
                        {
                            foreach (var depAtt in atts.GetAll <IDependentOnAttribute>())
                            {
                                if (depAtt.Dependencies?.Any() == true)
                                {
                                    dependencies.RegisterDependency(binding,
                                                                    depAtt.Dependencies, depAtt.DependencyHandler);
                                }
                            }
                        }

                        if (atts.Has <IDependentOnMetadataAttribute>())
                        {
                            var depAtt = atts.Get <IDependentOnMetadataAttribute>();

                            var depMds = depAtt.Dependencies.Select(t =>
                            {
                                if (!metadata.TryGetValue(t, out PropertyInfoMetadata md))
                                {
                                    throw new MissingMetadataException(t, ctrlDesc);
                                }

                                return(md);
                            }).ToArray();

                            dependencies.RegisterMetadataDependency(ctrl, depMds, depAtt.DependencyHandler);
                        }

                        var isGroup = ctrl is IGroup;

                        if (isGroup)
                        {
                            var grpParents = new List <IControlDescriptor>(parents);
                            grpParents.Add(ctrlDesc);
                            TraverseType <TDataModel>(prpType, grpParents, ctrlCreator, dynCtrlDescCreator,
                                                      ctrl as IGroup, metadata, bindings, dependencies, contextProvider, ref nextCtrlId);
                        }
                    }
                }
            }
        }
Ejemplo n.º 7
0
        private void TraverseType <TDataModel>(Type type, TDataModel model, List <PropertyInfo> parents,
                                               CreateBindingControlDelegate ctrlCreator,
                                               IGroup parentCtrl, List <IBinding> bindings, IRawDependencyGroup dependencies, ref int nextCtrlId)
        {
            foreach (var prp in type.GetProperties())
            {
                var prpType = prp.PropertyType;

                var atts = GetAttributeSet(prp, nextCtrlId);

                if (!atts.Has <IIgnoreBindingAttribute>())
                {
                    int idRange;
                    var ctrl = ctrlCreator.Invoke(prpType, atts, parentCtrl, out idRange);
                    nextCtrlId += idRange;

                    var binding = new PropertyInfoBinding <TDataModel>(model, ctrl, prp, parents);
                    bindings.Add(binding);

                    if (atts.Has <IControlTagAttribute>())
                    {
                        var tag = atts.Get <IControlTagAttribute>().Tag;
                        dependencies.RegisterBindingTag(binding, tag);
                    }

                    if (atts.Has <IDependentOnAttribute>())
                    {
                        var depAtt = atts.Get <IDependentOnAttribute>();
                        dependencies.RegisterDependency(binding,
                                                        depAtt.Dependencies, depAtt.DependencyHandler);
                    }

                    var isGroup = ctrl is IGroup;

                    if (isGroup)
                    {
                        var grpParents = new List <PropertyInfo>(parents);
                        grpParents.Add(prp);
                        TraverseType(prpType, model, grpParents, ctrlCreator,
                                     ctrl as IGroup, bindings, dependencies, ref nextCtrlId);
                    }
                }
            }
        }
Ejemplo n.º 8
0
 public void Load(IEnumerable <IBinding> bindings, IRawDependencyGroup dependencies)
 {
     Bindings   = bindings;
     Dependency = new DependencyManager();
     Dependency.Init(dependencies);
 }