// 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(); } } } }