using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using ScrewTurn.Wiki.PluginFramework; namespace ScrewTurn.Wiki { public partial class ProviderSelector : System.Web.UI.UserControl { private ProviderType providerType = ProviderType.Users; private bool excludeReadOnly = false; private UsersProviderIntendedUse usersProviderIntendedUse = UsersProviderIntendedUse.AccountsManagement; protected void Page_Load(object sender, EventArgs e) { object t = ViewState["ProviderType"]; if(t != null) providerType = (ProviderType)t; t = ViewState["ExcludeReadOnly"]; if(t != null) excludeReadOnly = (bool)t; t = ViewState["UsersProviderIntendedUse"]; if(t != null) usersProviderIntendedUse = (UsersProviderIntendedUse)t; if(!Page.IsPostBack) { Reload(); } } /// /// Reloads the providers list. /// public void Reload() { IProviderV30[] allProviders = null; string defaultProvider = null; switch(providerType) { case ProviderType.Users: allProviders = Collectors.UsersProviderCollector.AllProviders; defaultProvider = Settings.DefaultUsersProvider; break; case ProviderType.Pages: allProviders = Collectors.PagesProviderCollector.AllProviders; defaultProvider = Settings.DefaultPagesProvider; break; case ProviderType.Files: allProviders = Collectors.FilesProviderCollector.AllProviders; defaultProvider = Settings.DefaultFilesProvider; break; case ProviderType.Cache: allProviders = Collectors.CacheProviderCollector.AllProviders; defaultProvider = Settings.DefaultCacheProvider; break; default: throw new NotSupportedException(); } lstProviders.Items.Clear(); int count = 0; foreach(IProviderV30 prov in allProviders) { if(IsProviderIncludedInList(prov)) { string typeName = prov.GetType().FullName; lstProviders.Items.Add(new ListItem(prov.Information.Name, typeName)); if(typeName == defaultProvider) lstProviders.Items[count].Selected = true; count++; } } } /// /// Gets or sets a value indicating whether the control auto posts back. /// public bool AutoPostBack { get { return lstProviders.AutoPostBack; } set { lstProviders.AutoPostBack = value; } } /// /// Detectes whether a provider is included in the list. /// /// The provider. /// true if the provider is included, false otherwise. private bool IsProviderIncludedInList(IProviderV30 provider) { IStorageProviderV30 storageProvider = provider as IStorageProviderV30; IUsersStorageProviderV30 usersProvider = provider as IUsersStorageProviderV30; switch(providerType) { case ProviderType.Users: return IsUsersProviderIncludedInList(usersProvider); case ProviderType.Pages: return storageProvider == null || (!storageProvider.ReadOnly || storageProvider.ReadOnly && !excludeReadOnly); case ProviderType.Files: return storageProvider == null || (!storageProvider.ReadOnly || storageProvider.ReadOnly && !excludeReadOnly); case ProviderType.Cache: return true; default: throw new NotSupportedException(); } } /// /// Detects whether a users provider is included in the list. /// /// The provider. /// true if the provider is included, false otherwise. private bool IsUsersProviderIncludedInList(IUsersStorageProviderV30 provider) { switch(usersProviderIntendedUse) { case UsersProviderIntendedUse.AccountsManagement: return !provider.UserAccountsReadOnly || (provider.UserAccountsReadOnly && !excludeReadOnly); case UsersProviderIntendedUse.GroupsManagement: return !provider.UserGroupsReadOnly || (provider.UserGroupsReadOnly && !excludeReadOnly); default: throw new NotSupportedException(); } } /// /// Gets or sets the provider type. /// public ProviderType ProviderType { get { return providerType; } set { providerType = value; ViewState["ProviderType"] = value; } } /// /// Gets or sets the selected provider. /// public string SelectedProvider { get { return lstProviders.SelectedValue; } set { lstProviders.SelectedIndex = -1; foreach(ListItem itm in lstProviders.Items) { if(itm.Value == value) { itm.Selected = true; break; } } } } /// /// Gets or sets a value indicating whether to exclude read-only providers. /// public bool ExcludeReadOnly { get { return excludeReadOnly; } set { excludeReadOnly = value; ViewState["ExcludeReadOnly"] = value; } } /// /// Gets or sets the intended use of users storage provider, if applicable. /// public UsersProviderIntendedUse UsersProviderIntendedUse { get { return usersProviderIntendedUse; } set { usersProviderIntendedUse = value; ViewState["UsersProviderIntendedUse"] = value; } } /// /// Gets or sets a value indicating whether the control is enabled. /// public bool Enabled { get { return lstProviders.Enabled; } set { lstProviders.Enabled = value; } } /// /// Gets a value indicating whether the control has providers. /// public bool HasProviders { get { return lstProviders.Items.Count > 0; } } /// /// Event fired when the selected provider changes. /// public event EventHandler SelectedProviderChanged; protected void lstProviders_SelectedIndexChanged(object sender, EventArgs e) { if(SelectedProviderChanged != null) SelectedProviderChanged(sender, e); } } /// /// Lists legal provider types. /// public enum ProviderType { /// /// Users storage providers. /// Users, /// /// Pages storage providers. /// Pages, /// /// Files storage providers. /// Files, /// /// Cache providers. /// Cache } /// /// Lists valid uses for users storage providers. /// public enum UsersProviderIntendedUse { /// /// Accounts management. /// AccountsManagement, /// /// Groups management. /// GroupsManagement } }