// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Drawing;
using System.Windows.Forms;
namespace ICSharpCode.Core.WinForms
{
///
/// Allows converting forms to right-to-left layout.
///
public static class RightToLeftConverter
{
public static bool IsRightToLeft { get; set; }
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)
{
if (!(control.Parent is SplitContainer)) {
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);
}
}
}
}
}
}