Exemplo n.º 1
0
        public virtual TPage CreatePage <TModel>(CreateDynamicControlsDelegate dynCtrlsHandler)
        {
            var page = default(TPage);

            IEnumerable <IBinding> bindings;

            IRawDependencyGroup dependencies;

            m_DataBinder.Bind <TModel>(
                atts =>
            {
                page = m_PageConstructor.Create(atts);
                return(page);
            },
                (Type type, IAttributeSet atts, IGroup parent, IMetadata metadata, out int idRange) =>
            {
                idRange = 1;
                return(m_ControlConstructors.CreateElement(type, parent, atts, metadata, ref idRange));
            }, dynCtrlsHandler, out bindings, out dependencies);

            page.Binding.Load(m_App, bindings, dependencies);
            UpdatePageDependenciesState(page);

            return(page);
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
 public BaseCustomFeatureEditor(IXApplication app,
                                Type featDefType,
                                CustomFeatureParametersParser paramsParser,
                                IServiceProvider svcProvider, CreateDynamicControlsDelegate createDynCtrlHandler)
     : this(app, featDefType, paramsParser, svcProvider)
 {
     InitPage(createDynCtrlHandler);
 }
Exemplo n.º 4
0
        protected void InitPage(CreateDynamicControlsDelegate createDynCtrlHandler)
        {
            m_PmPage = CreatePage(createDynCtrlHandler);

            m_PmPage.Closing     += OnPageClosing;
            m_PmPage.DataChanged += OnDataChanged;
            m_PmPage.Closed      += OnPageClosed;
        }
        internal SwMacroFeatureEditor(ISwApplication app, Type defType, SwPropertyManagerPageHandler handler,
                                      CustomFeatureParametersParser paramsParser, IServiceProvider svcProvider,
                                      CreateDynamicControlsDelegate createDynCtrlHandler)
            : base(app, defType, paramsParser, svcProvider)
        {
            m_Handler = handler;

            InitPage(createDynCtrlHandler);
        }
Exemplo n.º 6
0
        private ISwPropertyManagerPage <TData> CreatePropertyManagerPage <TData>(Type handlerType,
                                                                                 CreateDynamicControlsDelegate createDynCtrlHandler)
        {
            var handler = m_SvcProvider.GetService <IPropertyPageHandlerProvider>().CreateHandler(Application.Sw, handlerType);

            var page = new SwPropertyManagerPage <TData>(Application, m_SvcProvider, handler, createDynCtrlHandler);

            m_Disposables.Add(page);
            return(page);
        }
Exemplo n.º 7
0
        internal SwPropertyManagerPage(ISwApplication app, IPageSpec pageSpec, IServiceProvider svcProvider, SwPropertyManagerPageHandler handler,
                                       CreateDynamicControlsDelegate createDynCtrlHandler)
        {
            m_App = app;

            m_IsDisposed = false;

            m_SvcProvider = svcProvider;

            m_Logger = m_SvcProvider.GetService <IXLogger>();

            m_IconsConv = m_SvcProvider.GetService <IIconsCreator>();

            //TODO: validate that handler is COM visible
            Handler = handler;

            Handler.Closed  += OnClosed;
            Handler.Closing += OnClosing;
            m_PmpBuilder     = new PropertyManagerPageBuilder(app, m_IconsConv, Handler, pageSpec, m_Logger);

            m_ContextProvider = new BaseContextProvider();

            m_Page = m_PmpBuilder.CreatePage <TModel>(createDynCtrlHandler, m_ContextProvider);

            var ctrls = new List <IPropertyManagerPageElementEx>();

            foreach (var binding in m_Page.Binding.Bindings)
            {
                binding.Changed += OnBindingValueChanged;

                var ctrl = binding.Control;

                if (ctrl is IPropertyManagerPageElementEx)
                {
                    ctrls.Add((IPropertyManagerPageElementEx)ctrl);
                }
                else
                {
                    m_Logger.Log($"Unrecognized control type: {ctrl?.GetType().FullName}", XCad.Base.Enums.LoggerMessageSeverity_e.Error);
                }
            }

            Controls = ctrls.ToArray();
        }
Exemplo n.º 8
0
        public virtual TPage CreatePage <TModel>(CreateDynamicControlsDelegate dynCtrlsHandler, IContextProvider modelProvider)
        {
            var page = default(TPage);

            m_DataBinder.Bind <TModel>(
                atts =>
            {
                page = m_PageConstructor.Create(atts);
                return(page);
            },
                (Type type, IAttributeSet atts, IGroup parent, IMetadata[] metadata, out int numberOfUsedIds) =>
            {
                numberOfUsedIds = 1;
                return(m_ControlConstructors.CreateElement(type, parent, atts, metadata, ref numberOfUsedIds));
            }, dynCtrlsHandler, modelProvider,
                out IEnumerable <IBinding> bindings,
                out IRawDependencyGroup dependencies,
                out IMetadata[] allMetadata);

            page.Binding.Load(m_App, bindings, dependencies, allMetadata);
            UpdatePageDependenciesState(page);

            return(page);
        }
Exemplo n.º 9
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);
                        }
                    }
                }
            }
        }
Exemplo n.º 10
0
 protected abstract IXPropertyPage <TPage> CreatePage(CreateDynamicControlsDelegate createDynCtrlHandler);
Exemplo n.º 11
0
 protected override IXPropertyPage <TPage> CreatePage(CreateDynamicControlsDelegate createDynCtrlHandler)
 {
     //TODO: add support for other options
     return(new SwPropertyManagerPage <TPage>((ISwApplication)m_App, m_SvcProvider, m_Handler, createDynCtrlHandler));
 }
Exemplo n.º 12
0
 public ISwPropertyManagerPage <TData> CreatePage <TData, THandler>(CreateDynamicControlsDelegate createDynCtrlHandler = null)
     where THandler : SwPropertyManagerPageHandler, new()
 => CreatePropertyManagerPage <TData>(typeof(THandler), createDynCtrlHandler);
Exemplo n.º 13
0
 public ISwPropertyManagerPage <TData> CreatePage <TData>(CreateDynamicControlsDelegate createDynCtrlHandler = null)
 => CreatePropertyManagerPage <TData>(typeof(TData), createDynCtrlHandler);
Exemplo n.º 14
0
 IXPropertyPage <TData> IXExtension.CreatePage <TData>(CreateDynamicControlsDelegate createDynCtrlHandler)
 => CreatePropertyManagerPage <TData>(typeof(TData), createDynCtrlHandler);
Exemplo n.º 15
0
 /// <summary>Creates instance of property manager page</summary>
 /// <param name="app">Pointer to session of SOLIDWORKS where the property manager page to be created</param>
 internal SwPropertyManagerPage(ISwApplication app, IServiceProvider svcProvider, SwPropertyManagerPageHandler handler,
                                CreateDynamicControlsDelegate createDynCtrlHandler)
     : this(app, null, svcProvider, handler, createDynCtrlHandler)
 {
 }