--HG--
branch : dev
This commit is contained in:
Sebastien Ros
2010-10-14 15:32:59 -07:00
16 changed files with 126 additions and 27 deletions

View File

@@ -207,10 +207,29 @@ namespace Orchard.Tests.Modules.Themes.Services {
}
}
public IEnumerable<ExtensionDescriptor> EnabledExtensions(ShellDescriptor descriptor) {
var extensions = new[] {
new ExtensionDescriptor {Name = "ThemeOne", ExtensionType = "Theme"},
new ExtensionDescriptor {Name = "ThemeTwo", BaseTheme = "ThemeOne", ExtensionType = "Theme"},
new ExtensionDescriptor {Name = "ThemeThree", BaseTheme = "TheThemeThatIsntThere", ExtensionType = "Theme"},
new ExtensionDescriptor {Name = "ThemeFourBasedOnFive", BaseTheme = "ThemeFiveBasedOnFour", ExtensionType = "Theme"},
new ExtensionDescriptor {Name = "ThemeFiveBasedOnFour", BaseTheme = "ThemeFourBasedOnFive", ExtensionType = "Theme"},
};
foreach (var extension in extensions) {
extension.Features = new[] { new FeatureDescriptor { Extension = extension, Name = extension.Name } };
yield return extension;
}
}
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
return AvailableExtensions().SelectMany(ed => ed.Features);
}
public IEnumerable<FeatureDescriptor> EnabledFeatures(ShellDescriptor descriptor) {
return AvailableExtensions().SelectMany(ed => ed.Features);
}
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors) {
return featureDescriptors.Select(FrameworkFeature);
}

View File

@@ -7,6 +7,7 @@ using NUnit.Framework;
using Orchard.ContentManagement;
using Orchard.DisplayManagement.Descriptors;
using Orchard.DisplayManagement.Implementation;
using Orchard.Environment.Descriptor.Models;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
@@ -86,10 +87,18 @@ namespace Orchard.Tests.DisplayManagement.Descriptors {
throw new NotSupportedException();
}
public IEnumerable<ExtensionDescriptor> EnabledExtensions(ShellDescriptor descriptor) {
throw new NotSupportedException();
}
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
return _availableFeautures;
}
public IEnumerable<FeatureDescriptor> EnabledFeatures(ShellDescriptor descriptor) {
throw new NotSupportedException();
}
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors) {
throw new NotSupportedException();
}

View File

@@ -90,11 +90,19 @@ namespace Orchard.Tests.Environment {
yield return ext;
}
public IEnumerable<ExtensionDescriptor> EnabledExtensions(ShellDescriptor descriptor) {
throw new NotSupportedException();
}
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
// note - doesn't order properly
return AvailableExtensions().SelectMany(ed => ed.Features);
}
public IEnumerable<FeatureDescriptor> EnabledFeatures(ShellDescriptor descriptor) {
throw new NotSupportedException();
}
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors) {
foreach (var descriptor in featureDescriptors) {
if (descriptor.Name == "Orchard.Framework") {

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Web;
using Orchard.Environment.Descriptor.Models;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
@@ -10,10 +11,18 @@ namespace Orchard.Tests.Stubs {
throw new NotSupportedException();
}
public IEnumerable<ExtensionDescriptor> EnabledExtensions(ShellDescriptor descriptor) {
throw new NotSupportedException();
}
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
throw new NotSupportedException();
}
public IEnumerable<FeatureDescriptor> EnabledFeatures(ShellDescriptor descriptor) {
throw new NotSupportedException();
}
public IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors) {
throw new NotSupportedException();
}

View File

@@ -43,7 +43,8 @@ namespace Orchard.Core.Navigation.Controllers {
if (model.MenuItemEntries == null || model.MenuItemEntries.Count() < 1)
model.MenuItemEntries = _menuService.Get().Select(CreateMenuItemEntries).OrderBy(menuPartEntry => menuPartEntry.MenuItem.Position, new PositionComparer()).ToList();
return View(model);
// need action name as this action is referenced from another action
return View("Index", model);
}
[HttpPost, ActionName("Index")]

View File

@@ -129,6 +129,8 @@ namespace Orchard.Setup {
public void SetSiteTheme(string themeName) { }
public ITheme GetRequestTheme(RequestContext requestContext) { return _theme; }
public IEnumerable<ITheme> GetInstalledThemes() { return new[] { _theme }; }
public IEnumerable<ITheme> GetEnabledThemes() { return new[] { _theme }; }
public void InstallTheme(HttpPostedFileBase file) { }
public void UninstallTheme(string themeName) { }
public void EnableTheme(string themeName) { }

View File

@@ -5,6 +5,7 @@ using System.Web;
using System.Web.Routing;
using JetBrains.Annotations;
using Orchard.Environment.Descriptor;
using Orchard.Environment.Descriptor.Models;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.Localization;
@@ -21,6 +22,7 @@ namespace Orchard.Themes.Services {
private readonly IEnumerable<IThemeSelector> _themeSelectors;
private readonly IModuleService _moduleService;
private readonly IWorkContextAccessor _workContextAccessor;
private readonly ShellDescriptor _shellDescriptor;
private readonly IShellDescriptorManager _shellDescriptorManager;
public ThemeService(
@@ -28,12 +30,14 @@ namespace Orchard.Themes.Services {
IExtensionManager extensionManager,
IEnumerable<IThemeSelector> themeSelectors,
IModuleService moduleService,
IWorkContextAccessor workContextAccessor) {
IWorkContextAccessor workContextAccessor,
ShellDescriptor shellDescriptor) {
_shellDescriptorManager = shellDescriptorManager;
_extensionManager = extensionManager;
_themeSelectors = themeSelectors;
_moduleService = moduleService;
_workContextAccessor = workContextAccessor;
_shellDescriptor = shellDescriptor;
Logger = NullLogger.Instance;
T = NullLocalizer.Instance;
}
@@ -167,11 +171,22 @@ namespace Orchard.Themes.Services {
}
/// <summary>
/// Loads only enabled themes
/// Loads only installed themes
/// </summary>
public IEnumerable<ITheme> GetInstalledThemes() {
return GetThemes(_extensionManager.AvailableExtensions());
}
/// <summary>
/// Loads only enabled themes
/// </summary>
public IEnumerable<ITheme> GetEnabledThemes() {
return GetThemes(_extensionManager.EnabledExtensions(_shellDescriptor));
}
private IEnumerable<ITheme> GetThemes(IEnumerable<ExtensionDescriptor> extensions) {
var themes = new List<ITheme>();
foreach (var descriptor in _extensionManager.AvailableExtensions()) {
foreach (var descriptor in extensions) {
if (!string.Equals(descriptor.ExtensionType, "Theme", StringComparison.OrdinalIgnoreCase)) {
continue;

View File

@@ -42,7 +42,7 @@ namespace Orchard.Widgets.Services {
public IEnumerable<string> GetZones() {
HashSet<string> zones = new HashSet<string>();
foreach (var theme in _themeService.GetInstalledThemes().Where(theme => theme.Zones != null && !theme.Zones.Trim().Equals(string.Empty))) {
foreach (var theme in _themeService.GetEnabledThemes().Where(theme => theme.Zones != null && !theme.Zones.Trim().Equals(string.Empty))) {
foreach (string zone in theme.Zones.Split(',').Where(zone => !zones.Contains(zone))) {
zones.Add(zone.Trim());
}

View File

@@ -159,7 +159,7 @@ pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height:
}
#layout-header, #layout-main, #layout-footer {
#layout-header, #layout-before-main, #layout-main, #layout-footer, #layout-after-main, #layout-tripel {
width:960px;
margin:0 auto;
}
@@ -183,11 +183,22 @@ pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height:
color: #434343;
}
#layout-footer
#layout-tripel
{
border-top: 1px solid #dbdbdb;
border-top: 1px solid #dbdbdb;
}
#layout-main
{
border-top: 1px solid #dbdbdb;
}
#layout-after-main
{
border-top: 1px solid #dbdbdb;
}
/* Navigation */
#layout-navigation
{
@@ -226,6 +237,11 @@ nav ul
line-height:24px;
}
#layout-footer
{
border-top: 1px solid #dbdbdb;
}
/* Zones */
/*.zone {
background-color: yellow;
@@ -425,10 +441,16 @@ ul.comments li div.text {
clear:both;
}
.aside.third div > div {
#layout-tripel div > div {
float:left;
width:304px;
padding:12px 6px 0 6px;
width:316px;
/*padding:12px 6px 0 6px;*/
}
#footer-quad div.zone {
float:left;
width:240px;
/*padding:12px 6px 0 6px;*/
}
/* Featured Zone - switch to an image */
@@ -449,7 +471,6 @@ ul.comments li div.text {
margin: 6px;
}
.clearfix {
clear:both;
}

View File

@@ -4,4 +4,4 @@ Description: It's a *really* good theme, yo.
Version: 0.1
Tags: Awesome
Website: http://orchardproject.net
Zones: Header, Navigation, Messages, AsideFirst, AsideSecond, AsideThird, Content, Footer
Zones: Header, Navigation, Featured, BeforeMain, Messages, BeforeContent, Content, AfterContent, AfterMain, TripelFirst, TripelSecond, TripelThird, FooterQuadFirst, FooterQuadSecond, FooterQuadThird, FooterQuadFourth, Footer, AsideFirst, AsideSecond, AsideThird

View File

@@ -31,7 +31,7 @@
<h1 id="branding"><a href="@homeUrl">@WorkContext.CurrentSite.SiteName</a></h1>
}
using(Capture(pbo => WorkContext.Layout.Footer.Add(pbo) )) {
<div class="credits"><span class="poweredby">Powered by Orchard</span> <span class="copyright">&#169; The Theme Machine 2010.</span></div>
<div class="credits"><span class="poweredby">Powered by <a href="http://www.orchardproject.net" title="Welcome to the New World Order" target="_blank">Orchard</a></span> <span class="copyright">&#169; The Theme Machine 2010.</span></div>
}
WorkContext.Layout.Footer.Add(New.User());
@@ -121,7 +121,7 @@
}
<div id="layout-footer" class="group">
<footer id="footer">
<div id="footer-quad">
<div id="footer-quad" class="group">
@if (Model.FooterQuadFirst != null) {
<div id="footer-quad-first">
@Zone(Model.FooterQuadFirst)

View File

@@ -4,14 +4,13 @@ using System.IO;
using System.Linq;
using System.Web;
using ICSharpCode.SharpZipLib.Zip;
using Orchard.Environment.Descriptor.Models;
using Orchard.Environment.Extensions.Folders;
using Orchard.Environment.Extensions.Helpers;
using Orchard.Environment.Extensions.Loaders;
using Orchard.Environment.Extensions.Models;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Settings;
using Orchard.Themes;
using Orchard.Utility;
using Orchard.Utility.Extensions;
@@ -36,12 +35,30 @@ namespace Orchard.Environment.Extensions {
return _folders.SelectMany(folder => folder.AvailableExtensions());
}
public IEnumerable<ExtensionDescriptor> EnabledExtensions(ShellDescriptor descriptor) {
var enabledFeatures = EnabledFeatures(descriptor);
return _folders.SelectMany(folder => folder.AvailableExtensions())
.Where(extensionDescriptor =>
extensionDescriptor.Features.Any(featureDescriptor =>
enabledFeatures.Any(availableFeature => featureDescriptor.Name == availableFeature.Name)));
}
public IEnumerable<FeatureDescriptor> AvailableFeatures() {
var featureDescriptors = AvailableExtensions().SelectMany(ext => ext.Features);
var featureDescriptorsOrdered = featureDescriptors.OrderByDependencies(HasDependency);
return featureDescriptorsOrdered.ToReadOnlyCollection();
}
public IEnumerable<FeatureDescriptor> EnabledFeatures(ShellDescriptor descriptor) {
return AvailableExtensions()
.SelectMany(extensionDescriptor => extensionDescriptor.Features)
.Where(featureDescriptor => IsFeatureEnabledInDescriptor(featureDescriptor, descriptor));
}
private static bool IsFeatureEnabledInDescriptor(FeatureDescriptor featureDescriptor, ShellDescriptor shellDescriptor) {
return shellDescriptor.Features.Any(shellDescriptorFeature => shellDescriptorFeature.Name == featureDescriptor.Name);
}
/// <summary>
/// Returns true if the item has an explicit or implicit dependency on the subject
/// </summary>

View File

@@ -1,11 +1,14 @@
using System.Collections.Generic;
using System.Web;
using Orchard.Environment.Descriptor.Models;
using Orchard.Environment.Extensions.Models;
namespace Orchard.Environment.Extensions {
public interface IExtensionManager {
IEnumerable<ExtensionDescriptor> AvailableExtensions();
IEnumerable<ExtensionDescriptor> EnabledExtensions(ShellDescriptor descriptor);
IEnumerable<FeatureDescriptor> AvailableFeatures();
IEnumerable<FeatureDescriptor> EnabledFeatures(ShellDescriptor descriptor);
IEnumerable<Feature> LoadFeatures(IEnumerable<FeatureDescriptor> featureDescriptors);
void InstallExtension(string extensionType, HttpPostedFileBase extensionBundle);

View File

@@ -32,10 +32,7 @@ namespace Orchard.Environment.ShellBuilders {
}
public ShellBlueprint Compose(ShellSettings settings, ShellDescriptor descriptor) {
var enabledFeatures = _extensionManager.AvailableExtensions()
.SelectMany(extensionDescriptor => extensionDescriptor.Features)
.Where(featureDescriptor => IsFeatureEnabledInDescriptor(featureDescriptor, descriptor));
var enabledFeatures = _extensionManager.EnabledFeatures(descriptor);
var features = _extensionManager.LoadFeatures(enabledFeatures);
if (descriptor.Features.Any(feature => feature.Name == "Orchard.Framework"))
@@ -55,10 +52,6 @@ namespace Orchard.Environment.ShellBuilders {
};
}
private static bool IsFeatureEnabledInDescriptor(FeatureDescriptor featureDescriptor, ShellDescriptor shellDescriptor) {
return shellDescriptor.Features.Any(shellDescriptorFeature => shellDescriptorFeature.Name == featureDescriptor.Name);
}
private static IEnumerable<Feature> BuiltinFeatures() {
yield return new Feature {
Descriptor = new FeatureDescriptor {

View File

@@ -14,6 +14,7 @@ namespace Orchard.Themes {
void DisableTheme(string themeName);
IEnumerable<ITheme> GetInstalledThemes();
IEnumerable<ITheme> GetEnabledThemes();
void InstallTheme(HttpPostedFileBase file);
void UninstallTheme(string themeName);
}

View File

@@ -21,7 +21,8 @@ namespace Orchard.UI.Navigation {
protected virtual IUser CurrentUser { get; [UsedImplicitly] private set; }
public IEnumerable<MenuItem> BuildMenu(string menuName) {
return FinishMenu(Crop(Reduce(Merge(AllSources(menuName)))).ToArray());
var sources = GetSources(menuName);
return FinishMenu(Crop(Reduce(Merge(sources))).ToArray());
}
private IEnumerable<MenuItem> FinishMenu(IEnumerable<MenuItem> menuItems) {
@@ -79,7 +80,7 @@ namespace Orchard.UI.Navigation {
}
}
private IEnumerable<IEnumerable<MenuItem>> AllSources(string menuName) {
private IEnumerable<IEnumerable<MenuItem>> GetSources(string menuName) {
foreach (var provider in _providers) {
if (provider.MenuName == menuName) {
var builder = new NavigationBuilder();