/// <summary>
        /// Removes an instance of the <see cref="StyleBuilder"/> class
        /// from the dictionaries with registered style builders.
        /// </summary>
        /// <param name="builder">The instance to remove.</param>
        public static void UnregisterStyleSheetBuilder(StyleBuilder builder)
        {
            foreach (DictionaryEntry entry in registeredBuildersDefaultByElementType)
            {
                if (object.ReferenceEquals(builder, entry.Value))
                {
                    registeredBuildersDefaultByElementType.Remove(entry.Key);
                    return;
                }
            }

            foreach (DictionaryEntry entry in registeredBuildersByElementTypeControlType)
            {
                if (object.ReferenceEquals(builder, entry.Value))
                {
                    registeredBuildersByElementTypeControlType.Remove(entry.Key);
                    return;
                }
            }

            foreach (DictionaryEntry entry in registeredBuildersName)
            {
                if (object.ReferenceEquals(builder, entry.Value))
                {
                    registeredBuildersName.Remove(entry.Key);
                    return;
                }
            }
        }
        public static void RegisterStyleBuilderByControlName(string controlName, string elementTypeName, StyleBuilder builder, string themeName)
        {
            EnsureThemeRegistered(themeName);

            TripleNameKey key = new TripleNameKey("__ID" + controlName, elementTypeName, themeName);

            registeredBuildersByElementTypeControlID[key] = builder;
        }
        public static void RegisterElementTypeDefaultStyleBuilder(string themeName, string elementTypeName, StyleBuilder builder)
        {
            EnsureThemeRegistered(ControlDefaultThemeName);

            TripleNameKey key = new TripleNameKey("", themeName, elementTypeName);

            registeredBuildersDefaultByElementType[key] = builder;
        }
        public static void RegisterGlobalStyleBuilder(string themeName, StyleBuilder builder)
        {
            EnsureThemeRegistered(themeName);

            registeredBuildersName[themeName] = builder;

            RaiseThemeChanged(themeName);
        }
        /// <summary>
        /// Registers a StyleBuilder for specific type of controls and specific type of elements under the name given.
        /// </summary>
        /// <param name="controlTypeName"></param>
        /// <param name="elementTypeName"></param>
        /// <param name="builder"></param>
        /// <param name="themeName"></param>
        public static void RegisterControlStyleBuilder(string controlTypeName, string elementTypeName, StyleBuilder builder, string themeName)
        {
            EnsureThemeRegistered(themeName);

            TripleNameKey key = new TripleNameKey(controlTypeName, elementTypeName, themeName);

            registeredBuildersByElementTypeControlType[key] = builder;

            RaiseThemeChanged(themeName, controlTypeName);
        }
        public StyleBuilderRegistration(
            BuilderRegistrationType registrationType,
            string elementType,
            string controlType,
            string elementName,
            string controlName,
            StyleBuilder builder)
        {
            this.builder = builder;

            this.stylesheetRelations = new List <RadStylesheetRelation>(1);
            RadStylesheetRelation relation = new RadStylesheetRelation();

            this.stylesheetRelations.Add(relation);

            relation.RegistrationType = registrationType;
            relation.ElementName      = elementName;
            relation.ControlName      = controlName;
            relation.ControlType      = controlType;
            relation.ElementType      = elementType;
        }
        private static void AddBuilderToList(ArrayList res, StyleBuilder builder, BuilderRegistrationType regType, string elementType, string controlType, string elementName, string controlName)
        {
            bool found = false;

            foreach (StyleBuilderRegistration reg in res)
            {
                if (reg.Builder == builder)
                {
                    RadStylesheetRelation relation = new RadStylesheetRelation(
                        regType, elementType, controlType, elementName, controlName);
                    reg.StylesheetRelations.Add(relation);
                    found = true;
                }
            }

            if (!found)
            {
                StyleBuilderRegistration registration = new StyleBuilderRegistration(
                    regType, elementType, controlType, elementName, controlName, builder);
                res.Add(registration);
            }
        }
        /// <summary>
        /// Retrieves the style builder registration.
        /// </summary>
        /// <returns></returns>
        public StyleBuilderRegistration GetRegistration()
        {
            Type actualBuilderType = typeof(DefaultStyleBuilder);

            if (this.BuilderType != null)
            {
                actualBuilderType = this.BuilderType;
            }

            StyleBuilder builder = (StyleBuilder)Activator.CreateInstance(actualBuilderType);

            builder.BuilderData = this.BuilderData;

            StyleBuilderRegistration reg = new StyleBuilderRegistration(
                builder
                );

            foreach (RadStylesheetRelation relation in this.StylesheetRelations)
            {
                string actualElementType = relation.ElementType;

                if (relation.RegistrationType == BuilderRegistrationType.ElementTypeControlType &&
                    relation.ElementType == null)
                {
                    actualElementType = typeof(RootRadElement).FullName;
                }

                reg.AddStylesheetRelation(relation.RegistrationType,
                                          actualElementType,
                                          relation.ControlType,
                                          relation.ElementName,
                                          relation.ControlName);
            }

            return(reg);
        }
        /// <summary>
        /// Gets all StyleSheets registered under a theme name.
        /// </summary>
        /// <param name="themeName"></param>
        /// <returns></returns>
        public static StyleBuilderRegistration[] GetStyleSheetBuilders(string themeName)
        {
            if (string.IsNullOrEmpty(themeName))
            {
                themeName = ControlDefaultThemeName;
            }

            ArrayList res = new ArrayList();

            foreach (DictionaryEntry entry in registeredBuildersDefaultByElementType)
            {
                TripleNameKey key = (TripleNameKey)entry.Key;
                if (string.Compare(key.Name2, themeName, true) == 0)
                {
                    StyleBuilder builder = (StyleBuilder)entry.Value;


                    BuilderRegistrationType regType = BuilderRegistrationType.ElementTypeDefault;
                    string elementType = key.Name3;
                    string controlType = null;
                    string elementName = null;
                    string controlName = null;

                    AddBuilderToList(res, builder, regType, elementType, controlType, elementName, controlName);
                }
            }

            foreach (DictionaryEntry entry in registeredBuildersByElementTypeControlType)
            {
                TripleNameKey key = (TripleNameKey)entry.Key;
                if (string.Compare(key.Name3, themeName, true) == 0)
                {
                    StyleBuilder            builder = (StyleBuilder)entry.Value;
                    BuilderRegistrationType regType = BuilderRegistrationType.ElementTypeControlType;
                    string elementType = key.Name2;
                    string controlType = key.Name1;
                    string elementName = null;
                    string controlName = null;

                    AddBuilderToList(res, builder, regType, elementType, controlType, elementName, controlName);
                }
            }

            foreach (DictionaryEntry entry in registeredBuildersName)
            {
                string key = (string)entry.Key;
                if (string.Compare(key, themeName, true) == 0)
                {
                    StyleBuilder            builder = (StyleBuilder)entry.Value;
                    BuilderRegistrationType regType = BuilderRegistrationType.ElementTypeGlobal;
                    string elementType = null;
                    string controlType = null;
                    string elementName = null;
                    string controlName = null;

                    AddBuilderToList(res, builder, regType, elementType, controlType, elementName, controlName);
                }
            }

            StyleBuilderRegistration[] resArray = new StyleBuilderRegistration[res.Count];
            res.CopyTo(resArray, 0);

            return(resArray);
        }
        private static StyleBuilder LookUpStyleBuilder(string controlID, string controlType, string elementName, string elementTypeFullName, bool rootElementHasStyle, StyleSheet rootElementStyle, string themeName)
        {
            //priority of resolution

            //Find builder by ElementName + ControlID
            //Find builder by ElementName + ControlType.Name
            //Find builder by ElementType + ControlID
            //Find builder by ElementType + ControlType.Name
            //Find Element default builder

            TripleNameKey key = new TripleNameKey(elementName + "", themeName + "", elementTypeFullName);

            StyleBuilder res = registeredBuildersByElementNameControlID[key] as StyleBuilder;

            int resolution = 0;

            if (res == null)
            {
                key        = new TripleNameKey(controlID + "", themeName + "", elementTypeFullName);
                res        = registeredBuildersByElementTypeControlID[key] as StyleBuilder;
                resolution = 1;
            }

            if (res == null)
            {
                TripleNameKey key1 = new TripleNameKey(controlType, elementTypeFullName, themeName + "");
                res        = registeredBuildersByElementTypeControlID[key1] as StyleBuilder;
                resolution = 2;
            }

            if (res == null)
            {
                TripleNameKey key1 = new TripleNameKey(controlType, elementTypeFullName, themeName + "");
                res        = registeredBuildersByElementTypeControlType[key1] as StyleBuilder;
                resolution = 3;
            }

            if (res == null)
            {
                TripleNameKey key1 = new TripleNameKey("", themeName + "", elementTypeFullName);
                res        = registeredBuildersDefaultByElementType[key1] as StyleBuilder;
                resolution = 4;
            }

            if (res == null && themeName != null)
            {
                res        = registeredBuildersName[themeName] as StyleBuilder;
                resolution = 5;
            }

            if (resolution == 4)
            {
                //Fix for "same stylresheet on element only and its control" propblem
                if (rootElementHasStyle &&
                    res is DefaultStyleBuilder &&
                    rootElementStyle == ((DefaultStyleBuilder)res).Style)
                {
                    return(null);
                }
            }

            ResolveStyleBuilderEventHandler eh = ResolveStyleBuilder;

            if (eh != null)
            {
                ResolveStyleBuilderEventArgs args = new ResolveStyleBuilderEventArgs(themeName, res);
                eh(null, args);
                res = args.Builder;
            }

            return(res);
        }
        private static StyleBuilder GetStyleSheetBuilder(IComponentTreeHandler /*RadControl*/ control, string elementTypeFullName, string elementName, string proposedThemeName, bool rootElementHasStyle, StyleSheet rootElementStyle)
        {
            string controlType      = typeof(RadControl).FullName;
            string controlThemeName = null;

            string controlID = string.Empty;

            if (control != null)
            {
                controlThemeName = control.ThemeName;

                Control controlHandler = control as Control;
                if (controlHandler != null)
                {
                    controlID = controlHandler.Name;
                }
                controlType = control.ThemeClassName;
            }

            StyleBuilder res = null;

            //ThemeName Look up priority:
            //1. applicationThemeName
            //2. proposedThemeName
            //3. controlThemeName
            //4. ControlDefault
            //5. * theme

            if (applicationThemeName != null)
            {
                res = LookUpStyleBuilder(controlID, controlType, elementName, elementTypeFullName, rootElementHasStyle,
                                         rootElementStyle, applicationThemeName);
            }

            bool lookUpOnlyAsteriskTheme = false; //true means - theme name specified correctly, but no stylesheet found

            if (res == null && !string.IsNullOrEmpty(proposedThemeName))
            {
                lookUpOnlyAsteriskTheme = true;
                res = LookUpStyleBuilder(controlID, controlType, elementName, elementTypeFullName, rootElementHasStyle,
                                         rootElementStyle, proposedThemeName);
            }

            if (!lookUpOnlyAsteriskTheme && res == null && !string.IsNullOrEmpty(controlThemeName))
            {
                lookUpOnlyAsteriskTheme = true;
                res = LookUpStyleBuilder(controlID, controlType, elementName, elementTypeFullName, rootElementHasStyle,
                                         rootElementStyle, controlThemeName);
            }

            if (!lookUpOnlyAsteriskTheme && res == null)
            {
                res = LookUpStyleBuilder(controlID, controlType, elementName, elementTypeFullName, rootElementHasStyle,
                                         rootElementStyle, ControlDefaultThemeName);
            }

            //Now if no stylesheet found, look if "*" registered
            if (res == null)
            {
                res = LookUpStyleBuilder(controlID, controlType, elementName, elementTypeFullName, rootElementHasStyle,
                                         rootElementStyle, asteriskThemeName);
            }

            return(res);
        }
 public StyleBuilderRegistration(
     StyleBuilder builder)
 {
     this.builder = builder;
 }
Exemple #13
0
 public ResolveStyleBuilderEventArgs(string themeName, StyleBuilder builder)
 {
     this.builder   = builder;
     this.themeName = themeName;
 }