//
//
//
//
// $Revision: 3702 $
//
using System;
using System.Drawing;
using System.Windows.Forms;
namespace ICSharpCode.Core.WinForms
{
///
/// Description of RightToLeftConverter.
///
public static class RightToLeftConverter
{
public static string[] RightToLeftLanguages = new string[] {"ar", "he", "fa", "urdu"};
public static bool IsRightToLeft {
get {
foreach (string language in RightToLeftLanguages) {
if (ResourceService.Language.StartsWith(language))
return true;
}
return false;
}
}
static AnchorStyles Mirror(AnchorStyles anchor)
{
bool right = (anchor & AnchorStyles.Right) == AnchorStyles.Right;
bool left = (anchor & AnchorStyles.Left ) == AnchorStyles.Left ;
if (right) {
anchor = anchor | AnchorStyles.Left;
} else {
anchor = anchor & ~AnchorStyles.Left;
}
if (left) {
anchor = anchor | AnchorStyles.Right;
} else {
anchor = anchor & ~AnchorStyles.Right;
}
return anchor;
}
static Point MirrorLocation(Control control)
{
return new Point(control.Parent.ClientSize.Width - control.Left - control.Width,
control.Top);
}
///
/// Mirrors a control and its child controls if right to left is activated.
/// Call this only for controls that aren't mirrored automatically by .NET!
///
static void Mirror(Control control)
{
switch (control.Dock) {
case DockStyle.Left:
control.Dock = DockStyle.Right;
break;
case DockStyle.Right:
control.Dock = DockStyle.Left;
break;
case DockStyle.None:
control.Anchor = Mirror(control.Anchor);
control.Location = MirrorLocation(control);
break;
}
// Panels with RightToLeft = No won't have their children mirrored
if (control.RightToLeft != RightToLeft.Yes)
return;
foreach (Control child in control.Controls) {
Mirror(child);
}
}
public static void Convert(Control control)
{
bool isRTL = IsRightToLeft;
if (isRTL) {
if (control.RightToLeft != RightToLeft.Yes)
control.RightToLeft = RightToLeft.Yes;
} else {
if (control.RightToLeft == RightToLeft.Yes)
control.RightToLeft = RightToLeft.No;
}
ConvertLayout(control);
}
static void ConvertLayout(Control control)
{
bool isRTL = IsRightToLeft;
DateTimePicker picker = control as DateTimePicker;
Form form = control as Form;
ListView listView = control as ListView;
ProgressBar pg = control as ProgressBar;
TabControl tc = control as TabControl;
TrackBar trb = control as TrackBar;
TreeView treeView = control as TreeView;
if (form != null && form.RightToLeftLayout != isRTL)
form.RightToLeftLayout = isRTL;
if (listView != null && listView.RightToLeftLayout != isRTL)
listView.RightToLeftLayout = isRTL;
if (pg != null && pg.RightToLeftLayout != isRTL)
pg.RightToLeftLayout = isRTL;
if (tc != null && tc.RightToLeftLayout != isRTL)
tc.RightToLeftLayout = isRTL;
if (trb != null && trb.RightToLeftLayout != isRTL)
trb.RightToLeftLayout = isRTL;
if (treeView != null && treeView.RightToLeftLayout != isRTL)
treeView.RightToLeftLayout = isRTL;
}
static void ConvertLayoutRecursive(Control control)
{
bool isRTL = IsRightToLeft;
if (isRTL == (control.RightToLeft == RightToLeft.Yes)) {
ConvertLayout(control);
foreach (Control child in control.Controls) {
ConvertLayoutRecursive(child);
}
}
}
public static void ConvertRecursive(Control control)
{
if (IsRightToLeft == (control.RightToLeft == RightToLeft.Yes)) {
// already converted
return;
}
ReConvertRecursive(control);
}
public static void ReConvertRecursive(Control control)
{
Convert(control);
foreach (Control child in control.Controls) {
ConvertLayoutRecursive(child);
}
if (IsRightToLeft) {
if (control is Form) {
// direct children seem to be mirrored by .NET
foreach (Control child in control.Controls) {
foreach (Control subChild in child.Controls) {
Mirror(subChild);
}
}
} else {
foreach (Control child in control.Controls) {
Mirror(child);
}
}
}
}
}
}