2008-11-18 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Compilation / ThemeDirectoryCompiler.cs
index 5e7307e3d71b28d3854ac441b43e80a1052b30f3..a1fc894da6637c0f0528df7a63022f33891df859 100644 (file)
@@ -41,35 +41,45 @@ namespace System.Web.UI
 {
        internal sealed class ThemeDirectoryCompiler
        {
-               public static Type GetCompiledType (string virtualPath, HttpContext context)
+               public static Type GetCompiledType (string theme, HttpContext context)
                {
+                       string virtualPath = "~/App_Themes/" + theme + "/";
                        string physicalPath = context.Request.MapPath (virtualPath);
-                       string[] skin_files = Directory.GetFiles (physicalPath, "*.skin");
+                       if (!Directory.Exists (physicalPath))
+                               throw new HttpException (String.Format ("Theme '{0}' cannot be found in the application or global theme directories.", theme));
+                       string [] skin_files = Directory.GetFiles (physicalPath, "*.skin");
 
-                       PageThemeParser ptp = new PageThemeParser (physicalPath, context);
+                       PageThemeParser ptp = new PageThemeParser (virtualPath, context);
                        
                        string[] css_files = Directory.GetFiles (physicalPath, "*.css");
                        string[] css_urls = new string[css_files.Length];
-                       for (int i = 0; i < css_files.Length; i++)
-                               css_urls [i] = UrlUtils.Combine (physicalPath, Path.GetFileName (css_files [i]));
+                       for (int i = 0; i < css_files.Length; i++) {
+                               ptp.AddDependency (css_files [i]);
+                               css_urls [i] = virtualPath + Path.GetFileName (css_files [i]);
+                       }
                        ptp.LinkedStyleSheets = css_urls;
                        
+                       AspComponentFoundry shared_foundry = new AspComponentFoundry ();
                        ptp.RootBuilder = new RootBuilder ();
 
+                       string skin_file_url;
                        for (int i = 0; i < skin_files.Length; i ++) {
-                               string skin_file_url = UrlUtils.Combine (physicalPath, Path.GetFileName (skin_files [i]));
+                               skin_file_url = VirtualPathUtility.Combine (virtualPath, Path.GetFileName (skin_files [i]));
                                PageThemeFileParser ptfp = new PageThemeFileParser (skin_file_url,
-                                                                                  skin_files[i],
-                                                                                  context);
+                                                                                   skin_files[i],
+                                                                                   context);
 
+                               ptp.AddDependency (skin_files [i]);
                                AspGenerator gen = new AspGenerator (ptfp);
+                               ptfp.RootBuilder.Foundry = shared_foundry;
                                gen.Parse ();
 
-                               foreach (object o in ptfp.RootBuilder.Children) {
-                                       if (!(o is ControlBuilder))
-                                               continue;
-                                       ptp.RootBuilder.AppendSubBuilder ((ControlBuilder)o);
-                               }
+                               if (ptfp.RootBuilder.Children != null)
+                                       foreach (object o in ptfp.RootBuilder.Children) {
+                                               if (!(o is ControlBuilder))
+                                                       continue;
+                                               ptp.RootBuilder.AppendSubBuilder ((ControlBuilder)o);
+                                       }
 
                                foreach (string ass in ptfp.Assemblies)
                                        if (!ptp.Assemblies.Contains (ass))
@@ -80,9 +90,9 @@ namespace System.Web.UI
                        return compiler.GetCompiledType ();
                }
 
-               public static PageTheme GetCompiledInstance (string virtualPath, HttpContext context)
+               public static PageTheme GetCompiledInstance (string theme, HttpContext context)
                {
-                       Type t = ThemeDirectoryCompiler.GetCompiledType (virtualPath, context);
+                       Type t = ThemeDirectoryCompiler.GetCompiledType (theme, context);
                        if (t == null)
                                return null;