using System;
using System.Data;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
using MenuItem = CMS.UIControls.UniMenuConfig.Item;
using SubMenuItem = CMS.UIControls.UniMenuConfig.SubItem;
public partial class CMSModules_Content_Controls_LanguageMenu : CMSUserControl
{
#region "Variables"
protected string mSelectedCulture = null;
protected string currentSiteName = null;
protected int culturesCount = 0;
private bool? mUseSmallLanguageButton = null;
#endregion
#region "Properties"
///
/// Culture to be considered as selected.
///
public string SelectedCulture
{
get
{
return ValidationHelper.GetString(GetValue("SelectedCulture"), CMSContext.CurrentUser.PreferredCultureCode);
}
set
{
SetValue("SelectedCulture", value);
}
}
///
/// If false, compare separator and button is not shown.
///
public bool DisplayCompare
{
get
{
return pnlCompare.Visible;
}
set
{
pnlCompare.Visible = value;
}
}
///
/// ID of site, cultures belong to.
///
public int SiteID
{
get;
set;
}
///
/// When in compact mode, only one culture button is displayed at once and buttons are rendered as small in two rows.
///
public bool CompactMode
{
get;
set;
}
///
/// Maximum number of cultures according to CompactMode property.
///
private int MaxCulturesInRow
{
get
{
return CompactMode ? 1 : 2;
}
}
///
/// Indicates whether small buttons are to be used for flags.
///
public bool UseSmallLanguageButton
{
get
{
if (mUseSmallLanguageButton == null)
{
mUseSmallLanguageButton = (CompactMode && culturesCount > 1);
}
return mUseSmallLanguageButton.Value;
}
set
{
mUseSmallLanguageButton = value;
}
}
#endregion
#region "Page events"
protected void Page_Load(object sender, EventArgs e)
{
ScriptHelper.RegisterJQuery(Page);
ScriptHelper.RegisterScriptFile(Page, "~/CMSAdminControls/UI/UniMenu/UniMenu.js");
currentSiteName = (SiteID != 0) ? SiteInfoProvider.GetSiteName(SiteID) : CMSContext.CurrentSiteName;
DataSet siteCulturesDS = CultureInfoProvider.GetSiteCultures(currentSiteName);
if (!DataHelper.DataSourceIsEmpty(siteCulturesDS))
{
// Register jQuery cookie script
ScriptHelper.RegisterJQueryCookie(Page);
string defaultCulture = CultureHelper.GetDefaultCulture(currentSiteName);
DataTable siteCultures = siteCulturesDS.Tables[0];
culturesCount = siteCultures.Rows.Count;
if ((culturesCount <= MaxCulturesInRow) && (culturesCount > 1))
{
// Disable cultures menu
btnCultures.StopProcessing = true;
for (int i = 0; i < culturesCount; i++)
{
string cultureCode = siteCultures.Rows[i]["CultureCode"].ToString();
string cultureShortName = siteCultures.Rows[i]["CultureShortName"].ToString();
string cultureLongName = ResHelper.LocalizeString(siteCultures.Rows[i]["CultureName"].ToString());
if (CMSString.Compare(cultureCode, defaultCulture, true) == 0)
{
cultureLongName += " " + GetString("general.defaultchoice");
}
MenuItem item = new MenuItem();
item.Text = HTMLHelper.HTMLEncode(cultureShortName);
item.Tooltip = cultureLongName;
item.CssClass = "BigButton";
item.OnClientClick = "ChangeLanguage('" + cultureCode + "')";
item.ImagePath = GetFlagIconUrl(cultureCode, "48x48");
item.ImageAltText = cultureLongName;
item.ImageAlign = ImageAlign.Top;
item.MinimalWidth = 48;
buttons.Buttons.Add(item);
if (SelectedCulture.ToLowerCSafe() == cultureCode.ToLowerCSafe())
{
buttons.SelectedIndex = i;
}
}
}
else
{
// Do not show culture selection buttons
buttons.StopProcessing = true;
CultureInfo ci = CultureInfoProvider.GetCultureInfo(SelectedCulture);
MenuItem item = new MenuItem();
item.Text = ci.CultureShortName;
item.Tooltip = GetString(ci.CultureName);
item.ImagePath = GetFlagIconUrl(SelectedCulture, UseSmallLanguageButton ? "16x16" : "48x48");
item.ImageAltText = GetString(ci.CultureName);
SetStyles(item);
// Generate submenu only if more cultures to choose from
if (culturesCount > 1)
{
foreach (DataRow row in siteCultures.Rows)
{
string cultureCode = row["CultureCode"].ToString();
string cultureShortName = row["CultureShortName"].ToString();
string cultureLongName = GetString(row["CultureName"].ToString());
if (CMSString.Compare(cultureCode, defaultCulture, true) == 0)
{
cultureLongName += " " + GetString("general.defaultchoice");
}
string flagUrl = GetFlagIconUrl(cultureCode, "16x16");
string flagBigUrl = GetFlagIconUrl(cultureCode, "48x48");
SubMenuItem menuItem = new SubMenuItem()
{
Text = cultureLongName,
Tooltip = cultureLongName,
ImagePath = flagUrl,
ImageAltText = cultureShortName,
OnClientClick = String.Format("CMSUniMenu.ChangeButton(##BUTTON##, {0}, {1}); ChangeLanguage({2});", ScriptHelper.GetString(cultureShortName), ScriptHelper.GetString(ResolveUrl(flagBigUrl)), ScriptHelper.GetString(cultureCode))
};
item.SubItems.Add(menuItem);
}
}
btnCultures.Buttons.Add(item);
}
if (culturesCount > 1)
{
string compare = GetString("SplitMode.Compare");
// Split mode button
MenuItem splitItem = new MenuItem();
splitItem.Text = compare;
splitItem.Tooltip = GetString("SplitMode.CompareLangVersions");
splitItem.OnClientClick = "ChangeSplitMode()";
splitItem.ImagePath = GetImageUrl("CMSModules/CMS_Content/Menu/Compare.png");
splitItem.ImageAltText = compare;
splitItem.AllowToggle = true;
splitItem.IsToggled = CMSContext.DisplaySplitMode;
SetStyles(splitItem);
splitView.Buttons.Add(splitItem);
}
else
{
splitView.StopProcessing = true;
}
}
}
#endregion
#region "Methods"
///
/// Applies styles to menu item according to CompactMode property.
///
/// Menu item to apply styles to.
private void SetStyles(MenuItem menuItem)
{
if (UseSmallLanguageButton)
{
menuItem.CssClass = "SmallButton";
menuItem.ImageAlign = ImageAlign.AbsMiddle;
menuItem.MinimalWidth = 80;
}
else
{
menuItem.CssClass = "BigButton";
menuItem.ImageAlign = ImageAlign.Top;
menuItem.MinimalWidth = 48;
}
}
#endregion
}