// ext may be null, but then parameter completion don't work
        public static bool ShowWindow(CompletionTextEditorExtension ext, char firstChar, ICompletionDataList list, ICompletionWidget completionWidget, CodeCompletionContext completionContext)
        {
            try {
                if (ext != null)
                {
                    int inserted = ext.document.Editor.EnsureCaretIsNotVirtual();
                    if (inserted > 0)
                    {
                        completionContext.TriggerOffset = ext.document.Editor.Caret.Offset;
                    }
                }
                if (wnd == null)
                {
                    wnd = new CompletionListWindow();
                    wnd.WordCompleted += HandleWndWordCompleted;
                }
                if (ext != null)
                {
                    wnd.TransientFor = ext.document.Editor.Parent.Toplevel as Gtk.Window;
                }
                else
                {
                    var widget = completionWidget as Gtk.Widget;
                    if (widget != null)
                    {
                        var window = widget.Toplevel as Gtk.Window;
                        if (window != null)
                        {
                            wnd.TransientFor = window;
                        }
                    }
                }
                wnd.Extension = ext;
                try {
                    if (!wnd.ShowListWindow(firstChar, list, completionWidget, completionContext))
                    {
                        if (list is IDisposable)
                        {
                            ((IDisposable)list).Dispose();
                        }
                        HideWindow();
                        return(false);
                    }

                    if (ForceSuggestionMode)
                    {
                        wnd.AutoSelect = false;
                    }
                    wnd.Show();
                    DesktopService.RemoveWindowShadow(wnd);
                    OnWindowShown(EventArgs.Empty);
                    return(true);
                } catch (Exception ex) {
                    LoggingService.LogError(ex.ToString());
                    return(false);
                }
            } finally {
                ParameterInformationWindowManager.UpdateWindow(ext, completionWidget);
            }
        }
        internal static bool ShowWindow(ICompletionDataList list, CodeCompletionContext completionContext)
        {
            if (wnd == null || !isShowing)
            {
                return(false);
            }

            var completionWidget = wnd.CompletionWidget;
            var ext = wnd.Extension;

            try {
                try {
                    isShowing = false;
                    if (!wnd.ShowListWindow(list, completionContext))
                    {
                        if (list is IDisposable)
                        {
                            ((IDisposable)list).Dispose();
                        }
                        HideWindow();
                        return(false);
                    }

                    if (IdeApp.Preferences.ForceSuggestionMode)
                    {
                        wnd.AutoSelect = false;
                    }
                    wnd.Show();
                    DesktopService.RemoveWindowShadow(wnd);
                    OnWindowShown(EventArgs.Empty);
                    return(true);
                } catch (Exception ex) {
                    LoggingService.LogError(ex.ToString());
                    return(false);
                }
            } finally {
                ParameterInformationWindowManager.UpdateWindow(ext, completionWidget);
            }
        }