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); }
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); }
public BaseCustomFeatureEditor(IXApplication app, Type featDefType, CustomFeatureParametersParser paramsParser, IServiceProvider svcProvider, CreateDynamicControlsDelegate createDynCtrlHandler) : this(app, featDefType, paramsParser, svcProvider) { InitPage(createDynCtrlHandler); }
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); }
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); }
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(); }
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); }
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); } } } } }
protected abstract IXPropertyPage <TPage> CreatePage(CreateDynamicControlsDelegate createDynCtrlHandler);
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)); }
public ISwPropertyManagerPage <TData> CreatePage <TData, THandler>(CreateDynamicControlsDelegate createDynCtrlHandler = null) where THandler : SwPropertyManagerPageHandler, new() => CreatePropertyManagerPage <TData>(typeof(THandler), createDynCtrlHandler);
public ISwPropertyManagerPage <TData> CreatePage <TData>(CreateDynamicControlsDelegate createDynCtrlHandler = null) => CreatePropertyManagerPage <TData>(typeof(TData), createDynCtrlHandler);
IXPropertyPage <TData> IXExtension.CreatePage <TData>(CreateDynamicControlsDelegate createDynCtrlHandler) => CreatePropertyManagerPage <TData>(typeof(TData), createDynCtrlHandler);
/// <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) { }