// Copyright © 2015 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
using System;
using System.Windows.Forms;
namespace CefSharp.WinForms.Internals
{
///
/// ControlExtensions.
///
public static class ControlExtensions
{
///
/// Executes the Action asynchronously on the UI thread, does not block execution on the calling thread.
/// No action will be performed if the control doesn't have a valid handle or the control is Disposed/Disposing.
///
/// the control for which the update is required
/// action to be performed on the control
internal static void InvokeOnUiThreadIfRequired(this Control control, Action action)
{
//No action
if (control.Disposing || control.IsDisposed || !control.IsHandleCreated)
{
return;
}
if (control.InvokeRequired)
{
control.BeginInvoke((Action)(() =>
{
//No action
if (control.Disposing || control.IsDisposed || !control.IsHandleCreated)
{
return;
}
action();
}));
}
else
{
action.Invoke();
}
}
///
/// Activates the specified control.
///
/// The control.
/// true if XXXX, false otherwise.
public static bool Activate(this Control control)
{
// Notify WinForms world that inner browser window got focus. This will trigger Leave event to previous focused control
var containerControl = control.GetContainerControl();
if (containerControl != null)
{
return containerControl.ActivateControl(control);
}
return false;
}
///
/// Returns whether the supplied control is the currently
/// active control.
///
/// the control to check
/// true if the control is the currently active control
public static bool IsActiveControl(this Control control)
{
Form form = control.FindForm();
if (form == null)
{
return false;
}
Control activeControl = form.ActiveControl;
while (activeControl != null
&& (activeControl is ContainerControl)
&& !Object.ReferenceEquals(control, activeControl))
{
var containerControl = activeControl as ContainerControl;
activeControl = containerControl.ActiveControl;
}
return Object.ReferenceEquals(control, activeControl);
}
///
/// Selects the next control.
///
/// The control.
/// if set to true [next].
public static void SelectNextControl(this Control control, bool next)
{
var containerControl = control.GetContainerControl();
while (containerControl != null)
{
var containerControlAsControl = containerControl as Control;
if (containerControlAsControl == null)
{
break;
}
var activeControl = containerControl.ActiveControl;
if (containerControlAsControl.SelectNextControl(activeControl, next, true, true, false))
{
break;
}
if (containerControlAsControl.Parent == null)
{
break;
}
containerControl = containerControlAsControl.Parent.GetContainerControl();
}
}
}
}