public static void RegisterElementTypeDefaultStyleBuilder(string themeName, string elementTypeName, StyleBuilder builder)
        {
            EnsureThemeRegistered(ControlDefaultThemeName);

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

            registeredBuildersDefaultByElementType[key] = builder;
        }
        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;
        }
        /// <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 bool Equals(TripleNameKey key)
            {
                if (string.Compare(this.Name1, key.Name1, true) == 0)
                {
                    if (string.Compare(this.Name2, key.Name2, true) == 0)
                    {
                        return(string.Compare(this.Name3, key.Name3, true) == 0);
                    }
                }

                return(false);
            }
        /// <summary>
        ///  Clears all stylesheets registered previously with the themeName specified.
        /// </summary>
        /// <param name="themeName"></param>
        public static void ClearTheme(string themeName)
        {
            lock (syncRoot)
            {
                ArrayList toDelete = new ArrayList();
                foreach (DictionaryEntry entry in registeredBuildersByElementTypeControlType)
                {
                    TripleNameKey key = (TripleNameKey)entry.Key;
                    if (string.Compare(key.Name3, themeName, true) == 0)
                    {
                        toDelete.Add(key);
                    }
                }

                foreach (object key in toDelete)
                {
                    registeredBuildersByElementTypeControlType.Remove(key);
                }

                toDelete.Clear();

                foreach (DictionaryEntry entry in registeredBuildersByElementNameControlType)
                {
                    TripleNameKey key = (TripleNameKey)entry.Key;
                    if (string.Compare(key.Name3, themeName, true) == 0)
                    {
                        toDelete.Add(key);
                    }
                }

                foreach (object key in toDelete)
                {
                    registeredBuildersByElementNameControlType.Remove(key);
                }

                toDelete.Clear();

                foreach (DictionaryEntry entry in registeredBuildersByElementTypeControlID)
                {
                    TripleNameKey key = (TripleNameKey)entry.Key;
                    if (string.Compare(key.Name3, themeName, true) == 0)
                    {
                        toDelete.Add(key);
                    }
                }

                foreach (object key in toDelete)
                {
                    registeredBuildersByElementTypeControlID.Remove(key);
                }

                toDelete.Clear();

                foreach (DictionaryEntry entry in registeredBuildersDefaultByElementType)
                {
                    TripleNameKey key = (TripleNameKey)entry.Key;
                    if (string.Compare(key.Name3, themeName, true) == 0)
                    {
                        toDelete.Add(key);
                    }
                }

                foreach (object key in toDelete)
                {
                    registeredBuildersDefaultByElementType.Remove(key);
                }

                toDelete.Clear();

                foreach (DictionaryEntry entry in registeredBuildersName)
                {
                    string key = (string)entry.Key;
                    if (string.Compare(key, themeName, true) == 0)
                    {
                        toDelete.Add(key);
                    }
                }

                foreach (object key in toDelete)
                {
                    registeredBuildersName.Remove(key);
                }
            }

            RaiseThemeChanged(themeName);
        }
        public static StyleBuilder GetRegisteredControlStyleBuilder(string controlTypeName, string elementTypeName, string themeName)
        {
            TripleNameKey key = new TripleNameKey(controlTypeName, elementTypeName, themeName);

            return(registeredBuildersByElementTypeControlType[key] as StyleBuilder);
        }
        /// <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);
        }