コード例 #1
0
ファイル: CursorWait.cs プロジェクト: Stexinator/chummer5a
        public static async Task <CursorWait> NewAsync(Control objControl = null, bool blnAppStarting = false, CancellationToken token = default)
        {
            CursorWait objReturn = new CursorWait(objControl, blnAppStarting);

            if (objReturn._objControl == null)
            {
                if (Interlocked.Increment(ref _intApplicationWaitCursors) == 1)
                {
                    Application.UseWaitCursor            = true;
                    objReturn._blnDoUnsetCursorOnDispose = true;
                }
                return(objReturn);
            }
            Form frmControl = objReturn._objControl as Form;

            try
            {
                if (frmControl == null || await frmControl.DoThreadSafeFuncAsync(x => x.IsMdiChild, token))
                {
                    if (frmControl != null)
                    {
                        objReturn._frmControlTopParent = await frmControl.DoThreadSafeFuncAsync(x => x.MdiParent, token);
                    }
                    else if (objReturn._objControl is UserControl objUserControl)
                    {
                        objReturn._frmControlTopParent = await objUserControl.DoThreadSafeFuncAsync(x => x.ParentForm, token);
                    }
                    else if (objReturn._objControl != null)
                    {
                        for (Control objLoop = await objReturn._objControl.DoThreadSafeFuncAsync(x => x.Parent, token); objLoop != null; objLoop = await objLoop.DoThreadSafeFuncAsync(x => x.Parent, token))
                        {
                            if (objLoop is Form objLoopForm)
                            {
                                objReturn._frmControlTopParent = objLoopForm;
                                break;
                            }
                        }
                    }
                }
            }
            catch (OperationCanceledException)
            {
                await objReturn.DisposeAsync();

                throw;
            }

            if (objReturn._objControl != null)
            {
                if (objReturn._blnAppStartingCursor)
                {
                    int intNewValue = s_DicCursorControls.AddOrUpdate(objReturn._objControl, 1, (x, y) => Interlocked.Increment(ref y));
                    try
                    {
                        await objReturn.SetControlCursorAsync(intNewValue < short.MaxValue?Cursors.AppStarting : Cursors.WaitCursor, token);
                    }
                    catch (OperationCanceledException)
                    {
                        await objReturn.DisposeAsync();

                        throw;
                    }
                    objReturn._blnDoUnsetCursorOnDispose = true;
                }
                else
                {
                    s_DicCursorControls.AddOrUpdate(objReturn._objControl, short.MaxValue, (x, y) => Interlocked.Add(ref y, short.MaxValue));
                    try
                    {
                        await objReturn.SetControlCursorAsync(Cursors.WaitCursor, token);
                    }
                    catch (OperationCanceledException)
                    {
                        await objReturn.DisposeAsync();

                        throw;
                    }
                    objReturn._blnDoUnsetCursorOnDispose = true;
                }
            }
            return(objReturn);
        }